如何在 leaflet.js 中找到最近的标记?

10

我想知道是否有一种方法可以使用leaflet.js在我的位置附近找到标记。我首先想到的是存储我的位置的经纬度,然后迭代一个经纬度标记数组,并将它们放置在一个数组中,然后对该数组进行排序。但如果地图上有一百万个标记,这可能不是一个好选择,因为这需要很长时间。

伪代码

var myLatLng = [34,56];
var markers = [[20,30],[10,20],[12,-100],[54,90],[-10, -20],[20,20]];
var closests = [];
function findNearestMarker (myPosition, nearestMarkers){
 for(var i = 0; i < nearestMarkers.length){
     if((nearestMarkers[i][0] - myPosition[0]) < 100 && (nearestMarkers[i][1] - myPosition[1]) < 100 ){
         closests.push(nearestMarkers[i])
     }
 }
}

我实际上是从地图开始的,并不了解很多方法,我也想在这个项目中使用开放街道地图,但如果有人知道并采用谷歌地图或其他服务的方法,那将受到欢迎。

3个回答

8
尝试使用leaflet-knn,它可以进行最近邻查找:给定一个点和一堆其他点,它会找到最近的邻居(就像罐头上写的一样)。

1
我正在检查它,但似乎这是一个节点模块,有没有办法可以在客户端使用它?抱歉,我在文档中没有找到相关说明。 - Jhonnatan Gonzalez Rodriguez
是的,只需下载 https://raw.github.com/mapbox/leaflet-knn/master/leaflet-knn.min.js。 - tmcw

6
Leaflet.GeometryUtil 是我发现的最好的解决方案(https://github.com/makinacorpus/Leaflet.GeometryUtil)。使用 L.GeometryUtil.closestLayer。与 leaflet-knn 相比,使用更实用,因为您可以发送一组图层(例如标记),而不仅仅是一个 geojson 图层。但更重要的是,它似乎更快(在 Chrome 36 上有 500 多个标记的情况下,冷启动时约快 90%,虽然在 FF31 上它是可比的)。

嘿,非常酷,我会去看看的!如果它能正常工作,我会给你点赞的 :) - Jhonnatan Gonzalez Rodriguez
我发现的一个问题是它只给出一个单一的点,看起来像是确切的中心。它允许您使用半径,但我们有可以更改大小的标记。我将使用iconSize,但这似乎仍然是插件可以完成的事情。 - trysis

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接