web-dev-qa-db-ja.com

Googleマップを使用して、ポイントがポリゴン内にあることを検出するにはどうすればよいですか?

google.maps.LatLnggoogle.maps.Polygonの中にあることを検出したいと思います。

どうやってやるの ?

乾杯、

13
Natim

その他の解決策: Google-Maps-Point-in-Polygon

ポイントがその中に存在するかどうかを検出するためのPolygonクラスのJavascriptGoogle Mapsv3拡張...

11
Andrei I

これはgoogle map V3で使用できます:-

google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons);

ポリゴンは、polygoncompleteの後に関数によって返されるオブジェクトです。

var polygons=null;
google.maps.event.addDomListener(drawingManager, "polygoncomplete", function(polygon) {
        polygons=polygon;
});

https://developers.google.com/maps/documentation/javascript/reference による参照

22
swapnil udare

Googleは、私がチェックしていないジオメトリライブラリ内に独自の実装を提供していますが、おそらく他の回答で説明されているEdgeのケースをカバーしています。

ContainsLocationメソッドを参照してください ここで説明ベースマップAPIにないため、ジオメトリライブラリを明示的にインポートする必要があることに注意してください

5
Paul Gibbs

このアルゴリズムを使用して、ポイントがポリゴンの内側にあることを検出しました: http://alienryderflex.com/polygon/

新しいメソッドcontainsをポリゴンに追加しました:

// Add a function contains(point) to the Google Maps API v.3

google.maps.Polygon.prototype.contains = function(point) {
  var j=0;
  var oddNodes = false;
  var x = point.lng();
  var y = point.lat();

  var paths = this.getPath();

  for (var i=0; i < paths.getLength(); i++) {
    j++;
    if (j == paths.getLength()) {j = 0;}
    if (((paths.getAt(i).lat() < y) && (paths.getAt(j).lat() >= y))
    || ((paths.getAt(j).lat() < y) && (paths.getAt(i).lat() >= y))) {
      if ( paths.getAt(i).lng() + (y - paths.getAt(i).lat())
      /  (paths.getAt(j).lat()-paths.getAt(i).lat())
      *  (paths.getAt(j).lng() - paths.getAt(i).lng())<x ) {
        oddNodes = !oddNodes
      }
    }
  }
  return oddNodes;
}

google.maps.Polyline.prototype.contains = google.maps.Polygon.prototype.contains;
4
Natim

複雑なアルゴリズムは必要ありません。htmlcanvasのisPointInPath()メソッドを使用してこれを実現できました。

http://www.w3schools.com/tags/canvas_ispointinpath.asp

キャンバス要素を作成します。 moveTo()、lineTo()メソッドを使用して、複数の端点を持つポリゴンを描画します。 isPointInPath()メソッドを使用して、point(x、y)がポリゴンの内側にあるかどうかを確認します。

<canvas id="canvas"></canvas>

//x,y are coordinate of the point that needs to be tested
//coordinates contains all endpoint of a polygon in format of x1,y1,x2,y2,x3,y3....
function isPointInPolygon(x, y, coordinates) {
var ctx = canvas.getContext("2d");
var coords = coordinates.split(',');

if (coords != null && coords.length > 4) {
    ctx.beginPath();
    ctx.moveTo(coords[0], coords[1]);
    for (j = 2; j < coords.length; j++) {
        ctx.lineTo(coords[j], coords[j + 1]);
        j++;
    }
    ctx.closePath();
    if (ctx.isPointInPath(x, y))
        return true;
    else
        return false;
}
return false;
}
2
love kumar

ここで説明するすべての方法は、何らかの形で失敗します。

アンドレイIとナティムによって与えられた方法 しない 測地線エッジのあるポリゴンを検​​討してください。これらの方法では、Googleマップの非測地線エッジがメルカトル図法の範囲内にあることを認識できません。これらの方法では、頂点が等距離の緯度/経度グリッド上にあり、緯度が1度で経度が1度であると想定しています。このエラーの結果として、これらのメソッドは、ポイントがポリゴンの外側にあることを示しますが、場合によっては内側に表示されます。これは、長い非垂直/非水平エッジで簡単に観察されます。 この問題を解決するには、最初にすべてのポイントをメルカトル図法の緯度、経度からX、Y座標に変換する必要があります。 メルカトル図法で座標を緯度/経度からx/yに変換する方法は次のとおりです。 (精度が低い) 等角航路ナビゲーションは別の方法の基礎として使用できます。 Googleマップの実験バージョン3.10はこの方法を実装しています。

Paul Gibbs、swapnil udare、およびAdiLesterが言及した方法 しますか 測地線エッジを考慮しますが、Google Maps v3.9以降、非測地線ポリゴンに対して上記と同じ方法を使用します。そのため、上記と同じ問題が発生します。

更新 -Googleマップの問題は、Googleマップv3.10の現在の実験バージョンで修正されています。

2
deAtog