基于OSMnx:如何随机选点并绘制1.5km等时线图?含报错求助
问题解决:随机选点与等时线绘制 + 依赖报错修复
一、修复依赖报错
报错ImportError: scikit-learn must be installed to search an unprojected graph是因为未安装scikit-learn,同时numpy版本冲突也会引发问题。直接安装兼容的依赖包即可:
!pip install osmnx scikit-learn numpy --upgrade
执行后重新导入库,即可解决该错误。
二、随机选点的两种方法
方法1:直接从路网节点中随机选择
最简单的方式,直接从已获取的路网节点列表中随机挑选:
import numpy as np # 从路网G的节点中随机选一个 random_node = np.random.choice(list(G.nodes))
方法2:在区域范围内随机生成坐标,匹配最近节点
如果需要在整个 bounding box 内生成任意地理点(非路网节点),再匹配到最近的路网节点:
import numpy as np # 在指定经纬度范围内随机生成点 lon = np.random.uniform(west, east) lat = np.random.uniform(south, north) # 找到该点对应的最近路网节点 random_node = ox.distance.nearest_nodes(G, lon, lat)
三、完整代码:随机选点 + 绘制1.5km等时线
整合所有步骤的可运行代码,包含依赖安装、路网获取、随机选点、等时线计算与可视化:
# 安装依赖 !pip install osmnx scikit-learn numpy --upgrade # 导入所需库 import osmnx as ox import numpy as np import matplotlib.pyplot as plt # 定义目标区域边界 north, south, east, west = 40.8580, 40.7448, -73.9842, -74.2996 # 获取指定区域的驾车路网 G = ox.graph_from_bbox(north, south, east, west, network_type='drive') # 随机选点(可替换为上述两种方法的任意一种) random_node = np.random.choice(list(G.nodes)) # 将路网投影到UTM坐标系(消除经纬度球面计算误差) G_proj = ox.project_graph(G) # 计算以随机节点为中心、1.5km范围的等时线(若需按时间计算,可替换为travel_time参数) isochrone = ox.distance.isochrone(G_proj, random_node, distance=1500) # 可视化结果 fig, ax = ox.plot_graph(G_proj, show=False, close=False, edge_color='gray', node_size=0) isochrone.plot(ax=ax, color='red', alpha=0.5) plt.title('1.5km Isochrone from Random Node') plt.show()
补充说明:
- 若要基于时间绘制等时线,可将
distance=1500替换为travel_time=XXX(单位:秒),同时设置speed_kph参数(比如speed_kph=30代表平均时速30公里)。 - 投影路网到UTM坐标系是为了让距离/时间计算更精准,避免经纬度的球面距离误差。
内容的提问来源于stack exchange,提问作者Rainbow
相关产品推荐
相关产品推荐

