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ää
../_images/lyhimman_reitin_analyysi_2_0.png
(<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?