如何在谷歌地图v3中获得多边形的中心?

时间:2010-06-20 21:34:02

标签: google-maps polygon google-maps-api-3

它不需要100%正确,它可以是边界矩形的中心。

7 个答案:

答案 0 :(得分:188)

Matthew's answer是一个很好的解决方案。但是,在使用Google Maps API v3时,您可能希望通过extend()方法将多边形的每个点传递给LatLngBounds对象,然后最后调用getCenter()方法。 LatLngBounds对象。请考虑以下示例:

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());

答案 1 :(得分:59)

算法:

遍历多边形中的所有点。找到所有要点;

  • x1,最低x坐标
  • y1,最低y坐标
  • x2,最高x坐标
  • y2,最高y坐标

您现在拥有了边界矩形,可以使用以下方法计算出中心:

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

答案 2 :(得分:47)

你可以使用自己版本的缺失函数扩展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行为

答案 3 :(得分:7)

这是我写的自定义函数。随意使用它。

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));
}

答案 4 :(得分:2)

请注意,在凹多边形的情况下,边界矩形的中心可能完全在多边形之外。如果您的多边形可能凹陷,我建议使用最大内切圆的中心作为&#34;中心&#34;多边形您可以看到一个足够简单的算法here (p. 4)。如果你的任务是在多边形上放置一个标签,这也会给出最美观的结果(在这种情况下,我建议使用这种方法,即使你的多边形可能不是凹的)。

答案 5 :(得分:1)

用喷粉刺/颤振寻找汤姆的答案 您可以使用以下代码实现相同的目的。

 calculateCenter(List<LatLng> points) {
    var longitudes = points.map((i) => i.longitude).toList();
    var latitudes = points.map((i) => i.latitude).toList();

    latitudes.sort();
    longitudes.sort();

    var lowX = latitudes.first;
    var highX = latitudes.last;
    var lowy = longitudes.first;
    var highy = longitudes.last;

    var centerX = lowX + ((highX - lowX) / 2);
    var centerY = lowy + ((highy - lowy) / 2);

    return LatLng(centerX, centerY);
  }

答案 6 :(得分:0)

获取多边形中心的kotlin版本。 mPointslatitudelongitude的数组。

val bounds = LatLngBounds.Builder()

for(i in 0 until mPoints.size) {
    val point = LatLng(mPoints[i].latitude, mPoints[i].longitude)

    bounds.include(point)
}
mMap.moveCamera(CameraUpdateFactory.newLatLng(bounds.build().center))