OpenStreetMapX.jl按距离筛选节点链路及绘制边界方法问询
OpenStreetMapX.jl 范围查询与边界绘图实现方案
以下是针对需求的具体实现步骤,基于OpenStreetMapX.jl包完成:
前置准备:坐标转换
OpenStreetMapX的地图数据采用UTM坐标系(米为单位),因此首先需要将经纬度点A=(lat, long)转换为UTM坐标:
# 替换为你的实际坐标 lat, long = 39.5296, -119.8138 a_lla = LLA(lat, long) # 转换为地图对应的UTM坐标 a_utm = transform(a_lla, mx.projection)
1. 获取A点1公里范围内的节点与链路
节点查询
使用within_radius函数直接筛选出半径1000米内的所有节点:
nodes_1km = within_radius(mx.nodes, a_utm, 1000.0)
链路查询
从地图边集合中筛选出起点或终点在1公里节点集合内的链路:
edges_1km = [e for e in mx.edges if e.src in nodes_1km || e.dst in nodes_1km]
2. 获取A点2-5公里范围内(不含1公里内)的节点与链路
节点查询
先获取5公里内的所有节点,再排除1公里内的节点,得到2-5公里范围的节点集合:
nodes_5km = within_radius(mx.nodes, a_utm, 5000.0) nodes_2to5km = setdiff(nodes_5km, nodes_1km)
链路查询
筛选出至少一端在2-5公里节点集合内,且两端不同时在1公里内的链路:
edges_2to5km = [e for e in mx.edges if (e.src in nodes_2to5km || e.dst in nodes_2to5km) && !(e.src in nodes_1km && e.dst in nodes_1km) ]
3. 绘制范围边界
通过生成圆形边界的坐标点,结合Plots.jl叠加到地图上:
using Plots # 生成圆形边界的经纬度坐标点 function generate_circle_boundary(center_utm::UTM, radius::Float64, num_points::Int=100) angles = range(0, 2π, length=num_points) # 生成UTM坐标系下的圆形点 utm_points = [UTM(center_utm.x + radius*cos(θ), center_utm.y + radius*sin(θ), center_utm.zone, center_utm.isnorth) for θ in angles] # 转换回经纬度 lla_points = [transform(p, LLA) for p in utm_points] return [p.lon for p in lla_points], [p.lat for p in lla_points] end # 生成各半径的边界坐标 longs_1km, lats_1km = generate_circle_boundary(a_utm, 1000.0) longs_2km, lats_2km = generate_circle_boundary(a_utm, 2000.0) longs_5km, lats_5km = generate_circle_boundary(a_utm, 5000.0) # 绘制基础地图并叠加边界 plotmap(mx, title="范围边界可视化") plot!(longs_1km, lats_1km, label="1km 边界", color=:red, linewidth=2) plot!(longs_2km, lats_2km, label="2km 边界", color=:green, linewidth=2) plot!(longs_5km, lats_5km, label="5km 边界", color=:blue, linewidth=2)
关键函数说明
within_radius: OpenStreetMapX核心范围查询函数,用于获取指定UTM点周围指定半径内的节点transform: 实现LLA(经纬度)与UTM坐标之间的转换,需传入地图的投影参数mx.projectionplotmap: OpenStreetMapX内置的地图绘制函数,可直接绘制加载的地图数据
内容的提问来源于stack exchange,提问作者cherry blossom tree
相关产品推荐
相关产品推荐

