OSMnx 仅将geometry 属性添加到简化的边缘。如果边未简化,则其几何形状是其入射节点 u 和 v 之间的一条普通直线。在您的代码中,您使用simplify=False 参数化了graph_from_point,因此您的所有边都没有被简化,并且它们都没有geometry 属性:
import osmnx as ox
ox.config(use_cache=True, log_console=True)
point = 40.729630, -73.998835
dist = 100
G = ox.graph_from_point(point, dist=dist, network_type='drive', simplify=False)
for u, v, data in G.edges(keys=False, data=True):
simp = '' if 'geometry' in data else 'not '
print(f'edge {data["osmid"]} has {simp}been simplified')
如果您简化图形,其部分或全部边将具有几何属性,具体取决于连接两个交叉点的特定街道段最初是否跨越多个 OSM 节点。拓扑简化方法在this paper 中有详细说明。更多详情见the docs。示例:
import osmnx as ox
ox.config(use_cache=True, log_console=True)
point = 40.729630, -73.998835
dist = 100
G = ox.graph_from_point(point, dist=dist, network_type='drive', simplify=True)
for u, v, data in G.edges(keys=False, data=True):
simp = '' if 'geometry' in data else 'not '
print(f'edge {data["osmid"]} has {simp}been simplified')
您还可以通过使用fill_edge_geometry=True 调用graph_to_gdfs 然后使用graph_from_gdfs 重构您的图形,手动将几何属性添加到简化或未简化图形的每条边,如下所示:
import osmnx as ox
import pandas as pd
ox.config(use_cache=True, log_console=True)
point = 40.729630, -73.998835
dist = 100
G = ox.graph_from_point(point, dist=dist, network_type='drive', simplify=False)
# create nodes, edges GeoDataFrames and fill in all edge geometry attributes
# then re-create a MultiDiGraph from those GeoDataFrames
nodes, edges = ox.graph_to_gdfs(G, fill_edge_geometry=True)
G2 = ox.graph_from_gdfs(nodes, edges, graph_attrs=G.graph)
for u, v, data in G2.edges(keys=False, data=True):
assert 'geometry' in data
最后,在上面的评论中,您提到“我使用的是最新版本,即 osmnx 0.16.1。”但是,您的代码 sn-p 不能使用 v0.16.1,因为 distance 参数已被弃用并最终替换为 dist 5 或 6 版本之前。尝试运行 print(ox.__version__) 以查看您实际使用的版本。