求可用函数:将POI地理数据GDF通过graph_from_gdfs并入现有图
回答
首先明确:OSMnx没有现成函数直接将POI的GeoDataFrame转换为可通过graph_from_gdfs导入的节点/边结构——因为POI是独立的点要素,不像路网是具备拓扑关系的线网。不过你可以用几行简洁的代码实现需求,无需复杂遍历:
步骤1:将POI转换为图节点
每个POI对应一个图节点,需要给节点分配唯一ID(避免和原路网节点ID冲突),并保留POI属性:
import osmnx as ox import networkx as nx # 原路网图 G = ox.graph_from_place(query="<query>", network_type='all', simplify=False, retain_all=True) # 获取POI pois = ox.geometries.geometries_from_polygon(<geometry>, tags={"amenity": [<amenity_tag>]}) # 生成POI节点:提取坐标、分配唯一ID max_node_id = max(G.nodes) if G.nodes else 0 pois_nodes = [] for idx, row in pois.iterrows(): # 获取POI的经纬度(假设是点几何) x, y = row.geometry.x, row.geometry.y # 节点ID从max_node_id+1开始递增 node_id = max_node_id + 1 + idx # 保留POI的所有属性,加上坐标 node_attrs = row.to_dict() node_attrs.update({"x": x, "y": y}) pois_nodes.append((node_id, node_attrs)) # 创建仅包含POI节点的图(无连接边) G_poi = nx.Graph() G_poi.add_nodes_from(pois_nodes)
步骤2:(可选)将POI连接到路网节点
如果需要让POI和路网建立拓扑连接(比如生成从POI到最近路网节点的边),可以添加以下代码:
# 对每个POI节点,找到最近的路网节点 for poi_node_id, poi_attrs in G_poi.nodes(data=True): # 找到最近的路网节点 nearest_node = ox.distance.nearest_nodes(G, poi_attrs["x"], poi_attrs["y"]) # 添加POI到路网节点的边,可自定义边属性 G_poi.add_edge(poi_node_id, nearest_node, length=ox.distance.great_circle(poi_attrs["y"], poi_attrs["x"], G.nodes[nearest_node]["y"], G.nodes[nearest_node]["x"]))
步骤3:合并路网图与POI图
用NetworkX的compose函数合并两个图,自动处理节点/边的整合:
# 合并图(注意:如果节点ID有冲突,会保留原路网的节点属性) merged_G = nx.compose(G, G_poi)
步骤4:保存为XML文件
直接用OSMnx的保存函数即可:
ox.save_graph_xml(merged_G, filepath="<your_output_path>.xml")
补充说明
- 如果不需要POI和路网的连接边,直接合并仅含POI节点的图即可,OSMnx的
save_graph_xml会正常导出所有节点和边数据 - 节点ID的分配方式可以根据需求调整,只要保证和原路网节点ID不重复即可
- 若POI GeoDataFrame包含非点几何(比如多边形),可以先提取其质心作为节点坐标:
row.geometry.centroid.x
内容的提问来源于stack exchange,提问作者lars.schwarz
相关产品推荐
相关产品推荐

