web-dev-qa-db-ja.com

Google Maps V3でポリゴンの中心を取得するにはどうすればよいですか?

100%正確である必要はありません。境界矩形の中心にできます。

55
ANd

アルゴリズム:

ポリゴン内のすべてのポイントを実行します。すべてのポイントを見つけます。

  • x1、最低のx座標
  • y1、最低のy座標
  • x2、最高のx座標
  • y2、最高のy座標

これで境界矩形ができました。次を使用して中心を調整できます。

center.x = x1 + ((x2 - x1) / 2);
center.y = y1 + ((y2 - y1) / 2);
62

マシューの答え は良い解決策です。ただし、Google Maps API v3を使用する場合は、extend()メソッドを介してポリゴンの各ポイントを LatLngBounds オブジェクトに渡し、最後にLatLngBoundsオブジェクトでgetCenter()メソッドを呼び出します。次の例を考えてみましょう。

var bounds = new google.maps.LatLngBounds();
var i;

// The Bermuda Triangle
var polygonCoords = [
  new google.maps.LatLng(25.774252, -80.190262),
  new google.maps.LatLng(18.466465, -66.118292),
  new google.maps.LatLng(32.321384, -64.757370),
  new google.maps.LatLng(25.774252, -80.190262)
];

for (i = 0; i < polygonCoords.length; i++) {
  bounds.extend(polygonCoords[i]);
}

// The Center of the Bermuda Triangle - (25.3939245, -72.473816)
console.log(bounds.getCenter());
192
Daniel Vassallo

不足している関数の独自のバージョンでPolygonクラスを拡張できます。これをmy_getBounds()と呼びましょう。

google.maps.Polygon.prototype.my_getBounds=function(){
    var bounds = new google.maps.LatLngBounds()
    this.getPath().forEach(function(element,index){bounds.extend(element)})
    return bounds
}

そして、このようなコードで使用するよりも:

myPolygon.my_getBounds().getCenter()

...など、v2の動作と同等である必要があります

47
furiozo

これが私が書いたカスタム関数です。気軽に使用してください。

function polygonCenter(poly) {
    var latitudes = [];
    var longitudes = [];
    var vertices = poly.getPath();

    // put all latitudes and longitudes in arrays
    for (var i = 0; i < vertices.length; i++) {
        longitudes.Push(vertices.getAt(i).lng());
        latitudes.Push(vertices.getAt(i).lat());
    }

    // sort the arrays low to high
    latitudes.sort();
    longitudes.sort();

    // get the min and max of each
    var lowX = latitudes[0];
    var highX = latitudes[latitudes.length - 1];
    var lowy = longitudes[0];
    var highy = longitudes[latitudes.length - 1];

    // center of the polygon is the starting point plus the midpoint
    var centerX = lowX + ((highX - lowX) / 2);
    var centerY = lowy + ((highy - lowy) / 2);

    return (new google.maps.LatLng(centerX, centerY));
}
6
Jared Beach

凹多角形の場合、境界矩形の中心は完全に多角形の外側にある可能性があることに注意してください。多角形が凹んでいる可能性がある場合、最大の内接円の中心を多角形の「中心」として使用することをお勧めします。十分に単純なアルゴリズムを見ることができます ここ(p。4) 。タスクがポリゴンにラベルを配置することである場合、これは最も美しい外観をもたらします(この場合、ポリゴンが凹面でない場合でもこの方法を使用することをお勧めします)。

3
gkdm