Lyhimmän reitin analyysi
Lyhimmän reitin analyysi#
Jatketaan aiempaa Open Street Map -esimerkkiä ja tutkitaan edelleen Tampereen keskustorin ympäristöä. Tällä kertaa tavoitteenamme on tehdä yksinkertainen lyhimmän reitin analyysi. Selvitetään kartan pohjoisin piste ja haetaan lyhin reitti keskustorilta tähän pisteeseen. Tutkitaan vaihtelun vuoksi aluetta 500 metrin etäisyydellä keskustorista.
Aloitetaan tuomalla tarvittavat kirjastot osmnx ja matplotlib sekä hakemalla katuverkoston kuvaajaan tarvittavat tiedot aiemman esimerkin tapaan ox.graph_from_address()
-funktiolla. Lisätään funktiolle vielä parametri network_type='drive'
, jolloin saamme tiedot sellaisista kaduista, jotka ovat tarkoitettu autolla ajamista varten.
import osmnx as ox
import matplotlib.pyplot as plt
address = "Keskustori 1, 33100, Tampere, Finland"
distance = 500 # metriä
graph = ox.graph_from_address(address, dist=distance, network_type='drive')
ox.plot_graph(graph) # Katsotaan, miltä katuverkosto näyttää

(<Figure size 576x576 with 1 Axes>, <AxesSubplot:>)
Haetaan seuraavaksi tieverkoston risteyskohdat ja tiet ox.graph_to_gdfs()
-funktiolla. Määritellään myös reittimme alku- ja loppupisteet. Valitaan alkupisteeksi lähimpänä kartan keskustaa oleva risteyspiste (node) ja loppupisteeksi kartan pohjoisin risteyspiste. Alkupisteen selvittämiseksi voimme laskea pienimmän alueen, joka sisältää koko tieverkostomme käyttäen unary_union
- ja convex_hull
-metodeja. Lopulta alueen keskipiste saadaan centroid
-metodilla
nodes, edges = ox.graph_to_gdfs(graph)
area_union = edges.unary_union
convex_hull = area_union.convex_hull
centroid = convex_hull.centroid
Alueen keskipisteen koordinaatit on nyt tallennettu ”centroid”-muuttujaan. Selvitetään seuraavaksi reitin päätepiste, eli karttamme pohjoisin risteyspiste. Katsotaan ensin, mitä risteyspisteitä sisällään pitävä ”nodes”-geodataframe pitää sisällään.
nodes.head()
y | x | highway | street_count | geometry | |
---|---|---|---|---|---|
osmid | |||||
27674461 | 61.497299 | 23.754825 | traffic_signals | 4 | POINT (23.75483 61.49730) |
27674462 | 61.497474 | 23.757258 | NaN | 4 | POINT (23.75726 61.49747) |
31861820 | 61.501607 | 23.770738 | NaN | 3 | POINT (23.77074 61.50161) |
33050117 | 61.494406 | 23.769787 | NaN | 4 | POINT (23.76979 61.49441) |
33136738 | 61.494683 | 23.771148 | NaN | 3 | POINT (23.77115 61.49468) |
Löydämme pohjoisimman pisteen etsimällä pisteen, jonka y-koordinaatti on kaikista suurin. Varmistetaan ensin, että kaikki y-koordinaatit ovat numeerisessa muodossa ja lasketaan sitten suurin y-koordinaatti max()
-metodilla
nodes['y'] = nodes['y'].astype(float)
max_y = nodes['y'].max()
Nyt, kun tiedämme maksimi y-koordinaatin, voimme vielä etsiä kyseisen pisteen loc()
-metodilla. Tallennetaan alku- ja loppupisteiden koordinaatit vielä muuttujiin ”orig_xy” ja ”target_xy”.
dest = nodes.loc[nodes['y']==max_y, 'geometry'].values[0]
# Tallennetaan alku- ja loppupisteiden koordinaatit
orig_xy = (centroid.y, centroid.x)
dest_xy = (dest.y, dest.x)
Etsitään lopuksi vielä alku- ja loppupistettämme lähimpänä olevan risteyspisteen indeksit, joiden avulla teemme lyhimmän reitin analyysin. Tämä onnistuu ox.get-nearest_node()
-funktiolla.
orig_node = ox.get_nearest_node(graph, orig_xy)
dest_node = ox.get_nearest_node(graph, dest_xy)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Input In [6], in <cell line: 1>()
----> 1 orig_node = ox.get_nearest_node(graph, orig_xy)
2 dest_node = ox.get_nearest_node(graph, dest_xy)
AttributeError: module 'osmnx' has no attribute 'get_nearest_node'
Lopulta voimme selvittää lyhimmän reitin pisteiden välillä ox.shortest_path()
-funktiolla ja piirtää sen kartalle ox.plot_graph_route()
-funktiolla.
# Lasketaan lyhin reitti pisteiden välillä käyttäen tieverkostoamme. Huom. jos haluat vaihtaa lähtö- tai loppupisteen, tarvitset pisteiden "osmid"-sarakkeessa olevan lukuarvon.
route = ox.shortest_path(G=graph, orig=orig_node, dest=dest_node, weight='length')
ox.plot_graph_route(graph, route)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Input In [7], in <cell line: 2>()
1 # Lasketaan lyhin reitti pisteiden välillä käyttäen tieverkostoamme. Huom. jos haluat vaihtaa lähtö- tai loppupisteen, tarvitset pisteiden "osmid"-sarakkeessa olevan lukuarvon.
----> 2 route = ox.shortest_path(G=graph, orig=orig_node, dest=dest_node, weight='length')
4 ox.plot_graph_route(graph, route)
NameError: name 'orig_node' is not defined
Nyt näemme kartalla laskemamme lyhimmän reitin valitsemiemme pisteiden välillä! Kokeile itse selvittää lyhin reitti joidenkin muiden pisteiden välillä! Lyhin reitti on tässä laskettu ainoastaan etäisyyksien perusteella. Voisivatko esimerkiksi nopeusrajoitukset vaikuttaa tulokseen?