2012-01-30 61 views
4

我想檢查一個點是否在多邊形。
目前,我有這個功能檢查一個點是否在多邊形(地圖)

pointInPolygon:function (point,polygon){ 
    var i; 
    var j=polygon.length-1; 
    var inPoly=false; 
    var lon = point.longitude; 
    var lat = point.latitude; 
    for (i=0; i<polygon.length; i++) 
    { 
     if (polygon[i][0]<lon && polygon[j][0]>=lon|| polygon[j][0]<lon && polygon[i][0]>=lon){ 
      if (polygon[i][0]+(lon-polygon[i][0])/(polygon[j][0]-polygon[i][0])*(polygon[j][1]-polygon[i][1])<lat){ 
       inPoly=!inPoly; 
      } 
     } 
     j=i; 
    } 
    return inPoly; 
} 

嘗試...這個功能似乎對簡單的多邊形(http://jsfiddle.net/zTmr7/3/)工作,但它不會爲我工作... 這裏是樣本數據多邊形:

polygon: Array[14] 
Array[2] 
     0: "-120.190625" 
     1: "29.6614549946937" 
Array[2] 
     0: "-116.87275390625" 
     1: "32.6320990313992" 
Array[2] 
     0: "-116.60908203125" 
     1: "34.0363970332393" 
Array[2] 
     0: "-120.89375" 
     1: "41.9203747676428" 
Array[2] 
     0: "-114.74140625" 
     1: "45.784484644005" 
Array[2] 
     0: "-115.971875" 
     1: "48.6489780115889" 
Array[2] 
     0: "-132.758984375" 
     1: "59.9891712248332" 
Array[2] 
     0: "-162.5099609375" 
     1: "68.919753529737" 
Array[2] 
     0: "-168.6623046875" 
     1: "68.9828872543805" 
Array[2] 
     0: "-168.4865234375" 
     1: "64.2551601036027" 
Array[2] 
     0: "-179.874356794357" 
     1: "51.0915874974707" 
Array[2] 
     0: "-179.999916362762" 
     1: "13.1823178795562" 
Array[2] 
     0: "-143.8771484375" 
     1: "19.9962034117847" 
Array[2] 
     0: "-120.190625" 
     1: "29.6614549946937" 

也許你能幫助... ...在此先感謝

PS。解決方案必須特別適用於Bing地圖或通用解決方案...

+0

你見過這個功能嗎? https://github.com/tparkin/Google-Maps-Point-in-Polygon – duncan 2012-01-30 16:06:01

回答

1

第一個if語句看起來不錯 - 您正在檢查點的經度是否在多邊形線段的經度內。

第二個if應該插入段的截距與點的確切經度,並確定截距是否高於或低於點。由於簡單的拼寫錯誤,我不認爲這就是它所做的。

if (polygon[i][1]+(lon-polygon[i][0])/(polygon[j][0]-polygon[i][0])*(polygon[j][1]-polygon[i][1])<lat){ 
      ^

你還應該包括一個獨立的情況下,當polygon[i][0]==polygon[j][0],這樣你就不會得到一個除以零錯誤。

+0

我從網上覆制函數...當你建議我我已經改變了if語句,但函數仍然沒有正常工作。你能修改整個功能並重新發布嗎? – T1000 2012-01-31 08:12:25

3

谷歌地圖API尚未提供檢查多邊形中的點的方法。經過一番研究,我偶然發現了Ray-casting算法,它將確定X-Y座標是否在繪製形狀內。這將轉化爲經度和緯度。以下內容擴展了google.maps.polygon.prototype以使用此算法。簡單地包括在代碼中的一個點這段代碼google.maps加載後:

google.maps.Polygon.prototype.Contains = function(point) { 
    var crossings = 0, path = this.getPath(); 

    // for each edge 
    for (var i=0; i < path.getLength(); i++) { 
     var a = path.getAt(i), 
      j = i + 1; 
     if (j >= path.getLength()) { 
      j = 0; 
     } 
     var b = path.getAt(j); 
     if (rayCrossesSegment(point, a, b)) { 
     crossings++; 
     } 
    } 

    // odd number of crossings? 
    return (crossings % 2 == 1); 

    function rayCrossesSegment(point, a, b) { 
    var px = point.lng(), 
     py = point.lat(), 
     ax = a.lng(), 
     ay = a.lat(), 
     bx = b.lng(), 
     by = b.lat(); 
    if (ay > by) { 
     ax = b.lng(); 
     ay = b.lat(); 
     bx = a.lng(); 
     by = a.lat(); 
    } 
    // alter longitude to cater for 180 degree crossings 
    if (px < 0) { px += 360 }; 
    if (ax < 0) { ax += 360 }; 
    if (bx < 0) { bx += 360 }; 

    if (py == ay || py == by) py += 0.00000001; 
    if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false; 
    if (px < Math.min(ax, bx)) return true; 

    var red = (ax != bx) ? ((by - ay)/(bx - ax)) : Infinity; 
    var blue = (ax != px) ? ((py - ay)/(px - ax)) : Infinity; 
    return (blue >= red); 
    } 
}; 

在這裏,我們通過定義名稱的功能擴展google.maps.Polygon的功能「包含」,可用於確定函數參數中提供的緯度經度是否在多邊形內。這裏我們利用Ray-casting算法並開發了一個使用它的函數。現在做了這麼多的練習後,我們可以檢查一個點如下:

var point = new google.maps.LatLng(52.05249047600099,-0.6097412109375); var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});如果(polygon.Contains(點)){//點在內部多邊形}

有關完整的代碼和演示,請訪問:http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

0

你可以用我的,我在github上已經反映了libkml變異的克隆這裏:https://github.com/gumdal/libkml-pointinpolygon

在這個開源的作者的幫助下,設計了一個模塊,它將指示給定的點是否在KML多邊形內。確保你檢查了分支「libkml-git」而不是git源的「主」分支。您感興趣的課程是「pointinpolygon.cc」。它是C++源代碼,您可以將其包含在您的項目中並與您的項目一起構建。

編輯 - 點多邊形問題的解決方案與其覆蓋的地圖無關。

0

true | false = google.maps.geometry.poly。containsLocation(googlePoint,googlePoly);

相關問題