2014-04-23 58 views
-3

一個多邊形在谷歌地圖上繪製的一組多邊形,現在我想實現給定一個位置與某些緯度/經度它所在的多邊形的哪一個。算法找到一個多邊形中的經緯度或長或不包含

注:多邊形也引起給出了使用谷歌地圖API的緯度/多頭

那麼,有沒有它的任何API或我怎麼能轉換成經/緯度位置XY平面,這樣我可以檢查一個給定的點在哪個區域使用面積公式?

回答

1

使用下面光線投射alogrithm可以幫助ü解決這個問題

google.maps.Polygon.prototype.Contains = function(point) { 
     // ray casting alogrithm 
     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); 
     } 
    }; 
相關問題