如何在使用OSMnx时获取networkx.MultiDiGraph的当前CRS?
检查OSMnx图的CRS并判断是否需要投影
嘿,这个问题我之前做项目时刚好碰到过,其实OSMnx把CRS信息存在图的属性里,不用找专门的函数,直接访问就好!下面给你一步步讲怎么操作:
1. 直接获取当前图的CRS
用graph_from_bbox获取的图本质是NetworkX的MultiDiGraph,它的CRS信息存在graph属性字典里,你可以直接通过G.graph['crs']拿到:
import osmnx as ox # 示例:用bbox获取纽约某区域的图 north, south, east, west = 40.712, 40.702, -74.002, -74.012 G = ox.graph_from_bbox(north, south, east, west) # 提取当前CRS current_crs = G.graph['crs'] print(f"当前图的坐标系: {current_crs}")
默认情况下,OSMnx从OSM获取的图都是WGS84坐标系(EPSG:4326),也就是经纬度坐标,这是未投影的地理坐标系。
2. 判断是否需要投影
如果你的后续操作涉及距离计算、面积统计、空间分析这类需要平面坐标系的任务,就必须投影;如果只是做路径规划(基于节点ID或经纬度导航),用原始的WGS84也没问题。
你可以写个简单的判断逻辑:
# 判断是否为未投影的WGS84 if current_crs == "EPSG:4326": print("当前是地理坐标系,需要投影到平面坐标系") # 自动投影到合适的UTM坐标系(推荐) G_proj = ox.project_graph(G) print(f"投影后的坐标系: {G_proj.graph['crs']}") else: print("已经是投影坐标系,无需处理")
3. 进阶:用pyproj对象操作CRS
如果你需要更灵活的CRS操作(比如转换EPSG代码、验证坐标系),可以用OSMnx提供的ox.io.get_proj()函数,它会返回一个pyproj的CRS对象:
from pyproj import CRS # 获取CRS对象 crs_obj = ox.io.get_proj(G) print(f"CRS详细信息: {crs_obj}") print(f"对应EPSG代码: {crs_obj.to_epsg()}")
这个对象可以帮你做更多坐标系相关的验证和转换,比如判断是否是投影坐标系:
if crs_obj.is_geographic: print("这是地理坐标系(未投影)") else: print("这是投影坐标系")
小提醒
ox.project_graph()会修改图的节点坐标(从经纬度转为平面坐标),建议把投影后的图赋值给新变量,不要覆盖原始图,方便后续对比或复用。
内容的提问来源于stack exchange,提问作者Erick
相关产品推荐
相关产品推荐

