【问题标题】:Finding shortest path in leaflet在传单中寻找最短路径
【发布时间】:2016-10-20 18:12:22
【问题描述】:

我使用 L.pather 插件在地图上的线内收集点。我也在地图上填充了标记。给定任意两个标记,我想在上一个提供的 line 上的地图上找到最短距离(路径)。附上图片供参考。

在这里,我想在给定路径(蓝线)上的 A 和 B 之间画一条线。线上的蓝点是我拥有的点 (lat,lng) 的集合。有什么办法可以做到吗?

【问题讨论】:

标签: javascript leaflet mapbox


【解决方案1】:

您可以使用L.LatLngdistanceTo 方法来计算从您的L.Marker 的纬度到折线的每个纬度的距离:

function getNearestPointOnPolyline (marker, polyline) {
  var nearestKey,
      nearestDistance,
      markerLatLng = marker.getLatLng(),
      polylineLatLngs = polyline.getLatLngs()

  for (i = 0; i < polylineLatLngs.length; i++) {
    var distance = markerLatLng.distanceTo(polylineLatLngs[i])
    if (!nearestDistance || nearestDistance > distance) {
      nearestKey = i
      nearestDistance = distance
    }
  }
  return nearestKey
}

如果您计算每个标记的值,您可以使用L.PolylinespliceLatLngs 方法将折线修剪到这些点:

var polyline = new L.Polyline([...]).addTo(map),
    marker_a = new L.Marker([...]).addTo(map),
    marker_b = new L.Marker([...]).addTo(map)

// Get key of nearest point on polyline
var nearest_a = getNearestPointOnPolyline(marker_a, polyline),
    nearest_b = getNearestPointOnPolyline(marker_b, polyline)

// Determine start and end key
var start = Math.min(nearest_a, nearest_b),
    end = Math.max(nearest_a, nearest_b)

// Splice all keys untill start key
polyline.spliceLatLngs(0, start)
// Splice all keys from the end
polyline.spliceLatLngs(end - start + 1,polyline.getLatLngs().length)

参考:

【讨论】:

  • 完美。你摇滚@iH8。非常感谢 :) 。你能帮我解决我之前的问题吗:stackoverflow.com/questions/33233646/…
  • 给定一个 latlng 数组。我可以获得传单中两个节点之间的最短路径吗?
  • 我发布的函数使用L.LatLng 对象(来自折线)迭代一个数组,并测量到另一个L.LatLng 对象(来自标记)的每个距离如果你想做同样的事情一个包含坐标数组的数组,您需要先将它们转换为L.LatLng 对象,以便您可以使用L.LatlngdistanceTo 函数或者我误解了您的最新评论?至于第一条评论,不,谢谢:)随时欢迎您。我一有时间就会研究一下。不过我怀疑是一个错误:(
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2012-10-24
  • 2012-04-08
  • 2013-10-07
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多