2015-03-31 19 views
0

我需要檢查多段線是否在標記下運行。標記和多段線在該點處應該具有相同的寬度。問題是我的地圖上有多個標記。我似乎無法弄清楚如何才能找到正確的折線。單擊標記並突出顯示底層多段線

標記/折線的對象:

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

折線跨越標記包含相同經緯度點作爲標記,但我不能得到正確的結果。我認爲這更是一個數學問題

圖片瞭解更多信息:

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

附:對不起,我的英語不好

+0

看看turf.js.它具有簡單的地理分析工具。如果使用普通JavaScript,則可以在線路圖層組中循環幾何圖形。你可以做一名蹲伏者嗎? – 2015-03-31 18:37:17

+0

這是否始終是穿過標記的折線的起點或終點? – maRtin 2015-04-01 09:37:44

回答

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以增加標記被視爲「在線」上的線周圍的緩衝區。

改編自此answer by Cyrille Ka