单击标记并突出显示基础折线

时间:2015-03-31 11:32:31

标签: javascript jquery html5 css3 leaflet

我需要检查折线是否在标记下运行。标记和折线在该点应具有相同的latLng。问题是我的地图上有多个标记。我似乎无法弄清楚如何选择正确的折线。

标记/折线的对象:

{  
    latLng:     Array with latLng's,  
    marker:     Leaflet marker/polyline layer object,  
    selected:   boolean  
}

穿过标记的折线包含​​与标记相同的latlng点,但我无法获得正确的结果。我认为这更像是一个数学问题

图片了解更多信息:

http://i.stack.imgur.com/CABjB.png

P.S。抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

markerLatLng = marker.getLatLng()

for(var i = 0; i < latLng.length-1; i++){
    if (isBetween(latLng[i], latLng[i+1], markerLatLng)){
        // marker is between this line segment
        selected = true; //or do what you want to here 
    }
}    

def isBetween(a, b, c){
    crossproduct = (c.lng - a.lng) * (b.lat - a.lat) - (c.lat - a.lat) * (b.lng - a.lng);
    if(Math.abs(crossproduct) > epsilon) return false; //epsilon = 0 for integers, use small number operations on floating point coordinates

    dotproduct = (c.lat - a.lat) * (b.lat - a.lat) + (c.lng - a.lng)*(b.lng - a.lng);
    if(dotproduct < 0) return false;

    squaredlengthba = (b.lat - a.lat)*(b.lat - a.lat) + (b.lng - a.lng)*(b.lng - a.lng);
    if(dotproduct > squaredlengthba) return false;

    return true;
}

注意:浮点算术错误会让你感到悲伤。修改epsilon以增加考虑标记的线周围的缓冲区&#34;在线&#34;。

改编自answer by Cyrille Ka