如何利用OSM Overpass API获取目标道路的LineString坐标
获取OSM道路LineString坐标的两种方法
方法一:修改Overpass查询直接返回带坐标的道路(推荐)
Overpass API的out指令默认只返回道路的基础信息和节点ID,添加geom参数后,会直接返回道路的几何坐标,无需单独发起节点查询请求。
修改后的查询代码:
const roadsOverpassQuery = ` [out:json]; (way[lanes=1](${bbox}); way[lanes=2](${bbox}); ); out body geom; // 核心:通过geom参数获取道路的几何坐标 `;
执行该查询后,返回的道路数据会直接包含geometry字段,其类型为LineString,坐标格式完全符合你需要的GeoJSON标准。
方法二:手动拼接节点坐标生成LineString
如果必须分开查询道路和节点数据,可以按以下步骤组装LineString:
- 先将节点数据转换为节点ID到坐标的映射表,提升坐标查找效率:
// 假设nodesFeatures是你获取的节点Feature数组 const nodesMap = new Map(); nodesFeatures.forEach(feature => { const nodeId = parseInt(feature.id.split('/')[1]); nodesMap.set(nodeId, feature.geometry.coordinates); });
- 遍历每条道路,严格按照道路的节点ID顺序从映射表中取出坐标,组装成LineString:
// 假设ways是你获取的道路数组 const roadLineStrings = ways.map(way => { // 按道路节点顺序提取对应坐标 const coordinates = way.nodes.map(nodeId => nodesMap.get(nodeId)); // 过滤无法匹配的无效坐标 const validCoordinates = coordinates.filter(coord => coord); return { type: "Feature", id: `way/${way.id}`, properties: way.tags, geometry: { type: "LineString", coordinates: validCoordinates } }; });
注意:必须严格遵循道路
nodes数组的顺序拼接坐标,否则会导致道路方向错误。
内容的提问来源于stack exchange,提问作者user1592380
相关产品推荐
相关产品推荐

