3

我正在使用传单映射 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;
      }
   }

.equals() 应该将点与软糖因子进行比较。当我单击折线时,我会收到一个带有 lat/lngs 的事件,例如:

'38.83966582989183','-77.0083075761795' 

我在折线中的纬度/经度精度较低,如下所示:

'38.841289','-77.008842' 

因此,当我遍历寻找匹配项时,equals()永远不会返回 true。显然,点击事件正在触发,所以传单知道我点击了折线,但似乎没有一种干净的方法来获取点击的 latlng 的实际偏移量。

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

任何帮助/指针将不胜感激。

编辑:

设置L.LatLng.MAX_MARGIN1.0E-3似乎有效,但这似乎是一个非常粗略的边距。

4

2 回答 2

4

我的传单代码:

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);
});
于 2014-05-30T05:01:55.600 回答
1

我想出了一个可能不漂亮但似乎可行的解决方案。我注意到折线中有一个 _originalPoints 数组。polyline 事件中还有一个 layerPoint 成员,它是一个 Point 对象。

我不喜欢使用未记录的 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;
            }

        }

    }
于 2013-04-25T00:28:47.307 回答