Gis 使用传单映射api,如何确定多段线中的哪个点被单击?

Gis 使用传单映射api,如何确定多段线中的哪个点被单击?,gis,leaflet,openstreetmap,Gis,Leaflet,Openstreetmap,我正在使用传单映射API。我想确定已单击多段线中的哪个点。多段线是我使用MapQuest Open中的方向服务渲染的多段线 有关守则如下: for ( var i = 0; i < latlngs.length; i++ ) { // the equals method uses a small fudge factor to decide if the two // points are the same. if ( latlng.equals( latln

我正在使用传单映射API。我想确定已单击多段线中的哪个点。多段线是我使用MapQuest Open中的方向服务渲染的多段线

有关守则如下:

for ( var i = 0; i < latlngs.length; i++ )
   {

   // the equals method uses a small fudge factor to decide if the two 
   // points are the same.

   if ( latlng.equals( latlngs[ i ] ))
      {
      return i;
      }
   }
我在多段线中的lat/lngs精度较低,如中所示:

'38.841289','-77.008842' 
因此,当我循环查找匹配项时,
equals()
永远不会返回true。显然,点击事件正在触发,所以传单知道我已经点击了多段线,但似乎没有一种干净的方法来获取点击的板条的实际偏移

我正在考虑降低鼠标点击返回的精度,但这“感觉”不是正确的解决方案

如有任何帮助/建议,将不胜感激

编辑:


L.LatLng.MAX_MARGIN
设置为
1.0E-3
似乎可行,但这似乎是一个非常粗糙的余量。

我想出了一个解决方案,可能不是coture,但似乎可行。我注意到在多段线中有一个_originalPoints数组。在作为点对象的多段线事件中还有layerPoint成员

我不喜欢使用未记录的API,但使用L.LineUtil.pointToSegmentDistance在点之间循环查找与单击点最近的点,其工作原理如下:

    var point = e.layerPoint;

var points = polyline._originalPoints;

for ( var i = 0; i < points.length; i++ )
    {

    if ( i < points.length - 2 )
        {

        if ( min_distance > L.LineUtil.pointToSegmentDistance( point, points[i], points[ i + 1] ) )
            {
            min_distance = L.LineUtil.pointToSegmentDistance( point, points[i], points[ i + 1] );
            min_offset = i;
            }

        }

    }
var point=e.layerPoint;
变量点=多段线。\原始点;
对于(变量i=0;iL.LineUtil.pointToSegmentDistance(点,点[i],点[i+1]))
{
最小距离=L.LineUtil.pointToSegmentDistance(点,点[i],点[i+1]);
最小偏移量=i;
}
}
}
我的传单代码:

var _getClosestPointIndex = function(lPoint, arrayLPoints) {
    var distanceArray = [];
    for ( var i = 0; i < arrayLPoints.length; i++ ) {
        distanceArray.push( lPoint.distanceTo(arrayLPoints[i]) );
    }
    return distanceArray.indexOf(  Math.min.apply(null, distanceArray) );
};    

var polyLine = L.polyline(arrayLatLngCollection, lineOpt);
        polyLine.addEventListener('click dblclick', function(e) {
            var index = _getClosestPointIndex(e.latlng, arrayLatLngCollection);
            var popup = L.popup()
                .setLatLng(new L.latLng(arrayLatLngCollection[index]))
                .setContent('<p>Hello world!<br />This is a nice popup.</p>')
                .openOn(self.map);
});
var\u getClosestPointIndex=函数(lPoint,arrayLPoints){
var distanceArray=[];
对于(var i=0;i这是一个很好的弹出窗口。

”) .openOn(self.map); });
单击可能位于两点之间的某个线段上。尝试使用Mhm。。。我看到它是以点计算的,而不是Latlngs。出于某种原因,我没有注意到这条消息。几年后,当我注意到你的答案时,我不得不再次更新代码。对不起,我花了这么长时间才接受。很好的解决方案,顺便说一句。
var _getClosestPointIndex = function(lPoint, arrayLPoints) {
    var distanceArray = [];
    for ( var i = 0; i < arrayLPoints.length; i++ ) {
        distanceArray.push( lPoint.distanceTo(arrayLPoints[i]) );
    }
    return distanceArray.indexOf(  Math.min.apply(null, distanceArray) );
};    

var polyLine = L.polyline(arrayLatLngCollection, lineOpt);
        polyLine.addEventListener('click dblclick', function(e) {
            var index = _getClosestPointIndex(e.latlng, arrayLatLngCollection);
            var popup = L.popup()
                .setLatLng(new L.latLng(arrayLatLngCollection[index]))
                .setContent('<p>Hello world!<br />This is a nice popup.</p>')
                .openOn(self.map);
});