Le premier est ici La partie 2 est ici Matériel pédagogique de l'Université d'Helsinki Nous résumerons les réponses et les suppléments pour la semaine 5-semaine 6.
Week5
Au cours de la semaine 5, le cahier d'origine n'existe pas et vous devrez lire le README sur Github, sélectionner vous-même le matériel approprié et visualiser la carte.
Week6
Dans la première moitié de la semaine 6, nous utiliserons OSM (Open Street Map) pour estimer les points de départ et d'arrivée des données de mouvement fournies à l'avance. La bibliothèque mplleaflet
vous permet de tracer des figures créées avec matplotlib
sur une carte interactive. (Pour mplleaflet
, voir Cet article .) Mplleaflet
ne peut pas enregistrer d'images par lui-même. Il est nécessaire de sauvegarder l'image à l'aide d'une capture d'écran ou autre.
#Lire les données
origin = pd.read_csv('data/origins.csv') #Point de départ
dest = pd.read_csv('data/destinations.csv') #Lieu d'arrivée
#Montrer du doigt
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')
#Définition et transformation du système de coordonnées
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))
#terrain
fig, ax = plt.subplots(figsize=(12,8))
origin_geo.plot(ax=ax)
dest_geo.plot(ax=ax)
mplleaflet.show() #Combiner avec la carte
Vous pouvez voir que les points sont regroupés près de Tarin, la capitale de l'Estonie. Vérifions par géocodage.
Le but est de trouver l'itinéraire / distance entre le point de départ et le point d'arrivée obtenu en 6-1.
(1) Conversion en un graphique en utilisant la bibliothèque ʻosmxbasée sur les données routières OSM ② Approcher le point de départ / magasin d'arrivée au nœud le plus proche dans le graphique ③ Créez la route la plus courte entre les nœuds avec
networkx` et trouvez sa longueur
Travaillez dans cet ordre.
#Créer un package convexe qui comprend tous les points
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
#Extraction de graphes
import osmnx as ox
graph = ox.graph_from_polygon(extent, network_type='drive')
#Créer des nœuds et des liens à partir de graphiques
nodes_proj, edges_proj = ox.graph_to_gdfs(graph_proj, nodes=True, edges=True)
#Point approximatif au nœud
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)
#Créer un chemin minimum
route_lines = []
route_lengths=[]
for i in orig_nodes:
for j in dest_nodes:
if i==j: #Exclus si les points de départ et d'arrivée sont proches du même point
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)
#Distance la plus courte et la plus longue distance
mini = route_geom['route_dist'].min()
maxx = route_geom['route_dist'].max()
#Visualisation
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')
Si vous peignez tous les itinéraires, cela ressemblera à la figure ci-dessus. Pour l'analyse de réseau, il semble que vous puissiez essayer diverses choses en utilisant Python plutôt qu'en utilisant le SIG.