You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:22:39