100%正確である必要はありません。境界矩形の中心にできます。
アルゴリズム:
ポリゴン内のすべてのポイントを実行します。すべてのポイントを見つけます。
x1
、最低のx
座標y1
、最低のy
座標x2
、最高のx
座標y2
、最高のy
座標これで境界矩形ができました。次を使用して中心を調整できます。
center.x = x1 + ((x2 - x1) / 2);
center.y = y1 + ((y2 - y1) / 2);
マシューの答え は良い解決策です。ただし、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());
不足している関数の独自のバージョンで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の動作と同等である必要があります
これが私が書いたカスタム関数です。気軽に使用してください。
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));
}
凹多角形の場合、境界矩形の中心は完全に多角形の外側にある可能性があることに注意してください。多角形が凹んでいる可能性がある場合、最大の内接円の中心を多角形の「中心」として使用することをお勧めします。十分に単純なアルゴリズムを見ることができます ここ(p。4) 。タスクがポリゴンにラベルを配置することである場合、これは最も美しい外観をもたらします(この場合、ポリゴンが凹面でない場合でもこの方法を使用することをお勧めします)。