Der erste ist hier Teil 2 ist hier Lehrmaterialien der Universität Helsinki Wir werden die Antworten und Ergänzungen für Woche 5 bis Woche 6 zusammenfassen.
Week5
In Woche 5 ist das ursprüngliche Notizbuch nicht vorhanden, und Sie müssen die README-Datei auf Github lesen, das entsprechende Material selbst auswählen und die Karte visualisieren.
Week6
In der ersten Hälfte der Woche 6 werden wir OSM (Open Street Map) verwenden, um die Abfahrts- und Ankunftspunkte der im Voraus angegebenen Bewegungsdaten zu schätzen. Mit der Bibliothek "mplleaflet" können Sie mit "matplotlib" erstellte Figuren auf einer interaktiven Karte darstellen. (Informationen zu "mplleaflet" finden Sie unter Dieser Artikel .) Mplleaflet
kann keine Bilder selbst speichern. Es ist notwendig, das Bild mit einem Screenshot oder ähnlichem zu speichern.
#Daten lesen
origin = pd.read_csv('data/origins.csv') #Abfahrtsort
dest = pd.read_csv('data/destinations.csv') #Ankunftsort
#Zeigen
make_point = lambda row:Point(row['x'], row['y'])
origin['geometry'] = origin.apply(make_point, axis=1)
dest['geometry'] = dest.apply(make_point, axis=1)
origin_geo = gpd.GeoDataFrame(origin, geometry='geometry')
dest_geo = gpd.GeoDataFrame(dest, geometry='geometry')
#Systemdefinition und -transformation koordinieren
rigin_geo.crs = CRS.from_epsg(3857)
dest_geo.crs = CRS.from_epsg(3857)
origin_geo = origin_geo.to_crs(CRS.from_epsg(3857))
dest_geo = dest_geo.to_crs(CRS.from_epsg(3857))
#Handlung
fig, ax = plt.subplots(figsize=(12,8))
origin_geo.plot(ax=ax)
dest_geo.plot(ax=ax)
mplleaflet.show() #Mit Karte kombinieren
Sie können sehen, dass die Punkte in der Nähe von Tarin, der Hauptstadt von Estland, gesammelt werden. Lassen Sie uns durch Geokodierung überprüfen.
Das Ziel ist es, die Route / Entfernung zwischen dem Startpunkt und dem in 6-1 erhaltenen Ankunftspunkt zu finden.
(1) Konvertieren Sie mithilfe der OSM-Bibliothek basierend auf OSM-Straßendaten in ein Diagramm
② Annähern Sie den Startpunkt / Ankunftsspeicher an den nächsten Knoten in der Grafik
③ Erstellen Sie mit networkx
die kürzeste Route zwischen Knoten und ermitteln Sie deren Länge
Arbeiten Sie in dieser Reihenfolge.
#Erstellen eines konvexen Pakets, das alle Punkte enthält
merged = pd.concat([origin, dest])
make_p = lambda row: (row['geometry'].x, row['geometry'].y)
merged['p'] = merged.apply(make_p, axis=1)
list_point = merged['p'].values.tolist()
multi = MultiPoint(list_point)
extent = multi.convex_hull
#Diagrammextraktion
import osmnx as ox
graph = ox.graph_from_polygon(extent, network_type='drive')
#Erstellen Sie Knoten und Links aus Diagrammen
nodes_proj, edges_proj = ox.graph_to_gdfs(graph_proj, nodes=True, edges=True)
#Ungefährer Punkt zum Knoten
graph_proj = ox.project_graph(graph)
orig_nodes = []
for orig in origin_geo['geometry']:
orig_xy = (orig.y, orig.x)
orig_node = ox.get_nearest_node(graph, orig_xy)
orig_nodes.append(orig_node)
dest_nodes = []
for des in dest_geo['geometry']:
dest_xy = (des.y, des.x)
dest_node = ox.get_nearest_node(graph, dest_xy)
dest_nodes.append(dest_node)
#Erstellen Sie einen minimalen Pfad
route_lines = []
route_lengths=[]
for i in orig_nodes:
for j in dest_nodes:
if i==j: #Ausgeschlossen, wenn der Start- und der Ankunftspunkt nahe am selben Punkt liegen
continue
route = nx.shortest_path(G=graph, source=i, target=j, weight='length')
route_nodes = nodes_proj.loc[route]
route_line = LineString(list(route_nodes.geometry.values))
route_lines.append(route_line)
route_lengths.append(route_line.length)
route_geom = pd.DataFrame([route_lines, route_lengths]).T
route_geom.columns = ['geometry', 'route_dist']
route_geom = gpd.GeoDataFrame(route_geom,geometry='geometry', crs=edges_proj.crs)
#Kürzeste Entfernung und längste Entfernung
mini = route_geom['route_dist'].min()
maxx = route_geom['route_dist'].max()
#Visualisierung
fig, ax = plt.subplots(figsize=(12,8))
route_geom.plot(ax=ax, color='red')
edges_proj.plot(ax=ax, color='gray', alpha=0.5, linewidth=0.7)
fig.savefig('network.png')
Wenn Sie alle Routen malen, sieht es wie in der Abbildung oben aus. Bei der Netzwerkanalyse können Sie anscheinend verschiedene Dinge mit Python ausprobieren, anstatt GIS zu verwenden.
Recommended Posts