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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:51:00