如何使用Leaflet和Turf.js绘制距整条线路所有点均在5km以内的区域
你要实现的区域本质是徒步路线所有点位的5km缓冲区的交集,常规buffer计算的是所有点位缓冲区的并集,因此你需要的区域面积会远小于普通缓冲区,该类区域的GIS专业术语为「线要素等距约束核」,也可直接称为多缓冲区交集区域。
实现方案(基于你现有的Leaflet+Turf技术栈)
核心逻辑是先对线路做密化采样,再求所有采样点5km缓冲区的交集,代码示例如下:
// 1. 处理输入线路,按100米间隔密化采样,避免采样稀疏导致计算误差 const sampledPoints = [] const lineLength = turf.length(geojsonLines[0], {units: 'kilometers'}) for (let i = 0; i <= lineLength; i += 0.1) { sampledPoints.push(turf.along(geojsonLines[0], i, {units: 'kilometers'})) } // 2. 为每个采样点生成5km半径的圆,steps参数控制圆的平滑度,数值越高性能消耗越高 const pointBuffers = sampledPoints.map(point => { return turf.circle(point, 5, {units: 'kilometers', steps: 64}) }) // 3. 循环求所有圆的交集 let targetArea = pointBuffers[0] for (let i = 1; i < pointBuffers.length; i++) { targetArea = turf.intersect(targetArea, pointBuffers[i]) // 交集为空直接跳出,对应线路过长无符合要求区域的场景 if (!targetArea) break } // 4. 渲染到地图上,逻辑和你原有代码一致 if (targetArea) { L.geoJSON(targetArea, { style: function(feature) { return { color: "red" }; } }).addTo(journey_map); }
注意事项
- 当线路总长度超过10km时,所有圆的交集必然为空,你可以按照自己预设的长路径处理逻辑调整即可。
- 采样间隔可以根据你的精度需求调整,间隔越小计算结果越准确,相应的计算耗时也会越高。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

