Dan*_*llo 194

马修的答案是一个很好的解决方案.但是,在使用Google Maps API v3时,您可能希望LatLngBounds通过该extend()方法将多边形的每个点传递给对象,然后最终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());
Run Code Online (Sandbox Code Playgroud)

  • 此外,这是一个更好的解决方案,因为它将考虑到地球的曲率.我发布的琐碎算法对于小区域来说是一个合理的近似,但是如果你试图找出一个区域的地理中心,那么这将给出一个更好的答案.世界不是长方形,只有地图. (4认同)
  • 为什么这是更好的解决方案?对我来说,似乎两种解决方案都应该总是得到相同的答案.这更快吗? (3认同)
  • @Nicolas:两者都会得到相同的解决方案,但这更容易实现,依赖于Googles API,并且由于代码更短(最差的4行),因此一目了然.任何一种方法都应该具有可忽略的运行时间,因此速度不是问题. (3认同)
  • 这很好,除非您的多边形是“L”形状,在这种情况下,“bounds.getCenter()”将离开多边形。 (3认同)
  • 在这里很好地包装:http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js (2认同)

Mat*_*ley 63

算法:

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

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

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

center.x = x1 + ((x2 - x1) / 2);
center.y = y1 + ((y2 - y1) / 2);
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我发现在v2中,我只能通过调用polygon.getBounds().getCenter()来做到这一点,但我想我必须按照你的方式去做.谢谢 (6认同)
  • 如果多边形越过国际日期变更线(例如:俄罗斯的国际边界),这将失败。 (3认同)

小智 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
}
Run Code Online (Sandbox Code Playgroud)

而不是在像这样的代码中使用它:

myPolygon.my_getBounds().getCenter()
Run Code Online (Sandbox Code Playgroud)

......等等,它应该等同于v2的行为

  • 在谷歌搜索同一问题时发现了这个帖子..这个建议对我来说很完美!谢谢.. (2认同)
  • 哇它的工作就像一个魅力!! 我认为最好的解决方案,谢谢@furiozo (2认同)

Jar*_*ach 6

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

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));
}
Run Code Online (Sandbox Code Playgroud)


Wis*_*zer 5

对于在 dart/flutter 中寻找答案的人,您可以使用以下代码实现相同的目标。

 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);
  }
Run Code Online (Sandbox Code Playgroud)