3

Leaflet マッピング 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() は、ポイントをファッジファクターと比較することになっています。ポリラインをクリックすると、次のような緯度/経度のイベントが表示されます。

'38.83966582989183','-77.0083075761795' 

ポリラインの緯度/経度は、次のように精度が低くなります。

'38.841289','-77.008842' 

そのため、一致を探してループしてequals()も true は返されません。明らかに、クリック イベントが発生しているため、リーフレットはポリラインをクリックしたことを認識していますが、クリックされた緯度経度の実際のオフセットを取得するきれいな方法はないようです。

マウスクリックから返される精度を下げることを検討していますが、それは正しい解決策のように「感じられません」。

ヘルプ/ポインタは大歓迎です。

編集:

に設定L.LatLng.MAX_MARGINする1.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 配列があることに気付きました。ポリライン イベントには、Point オブジェクトである 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;
            }

        }

    }
于 2013-04-25T00:28:47.307 に答える