Google maps 如何在google maps v3中获取多边形的中心?

Google maps 如何在google maps v3中获取多边形的中心?,google-maps,polygon,google-maps-api-3,Google Maps,Polygon,Google Maps Api 3,它不需要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()方法将多边形的每个点传递给对象,然

它不需要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
对象上的
getCenter()
方法。考虑下面的例子:

var-bounds=new google.maps.LatLngBounds();
var i;
//百慕大三角
变量polygords=[
新的google.maps.LatLng(25.774252,-80.190262),
新google.maps.LatLng(18.466465,-66.118292),
新google.maps.LatLng(32.321384,-64.757370),
新google.maps.LatLng(25.774252,-80.190262)
];
对于(i=0;i
您可以使用自己版本的缺失函数扩展Polygon类,我们称之为my_getBounds():

然后在这样的代码中使用它:

myPolygon.my_getBounds().getCenter()

。。。等等,它应该相当于v2行为

这里是我编写的一个自定义函数。请随意使用它

function polygonCenter(poly) {
    const vertices = poly.getPath();

    // put all latitudes and longitudes in arrays
    const longitudes = new Array(vertices.length).map((_, i) => vertices.getAt(i).lng());
    const latitudes = new Array(vertices.length).map((_, i) => vertices.getAt(i).lat());

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

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

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

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

请注意,对于凹多边形,边界矩形的中心可能完全位于多边形之外。如果您的多边形可能是凹面的,我建议使用最大内接圆的中心作为多边形的“中心”。您可以看到一个足够简单的算法。如果您的任务是在多边形上放置标签,这也将提供最美观的结果(在这种情况下,我建议使用此方法,即使您的多边形可能不是凹面)。

对于somone seaching,请在省道/颤振中找到答案 您可以使用下面的代码来实现相同的功能

 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);
  }
calculateCenter(列出点){
变量经度=点.map((i)=>i.经度).toList();
var latitudes=points.map((i)=>i.latitudes.toList();
纬度。排序();
经度。排序();
var lowX=纬度。第一;
var highX=纬度。最后;
var lowy=经度。第一;
var highy=经度。最后;
var centerX=低x+((高x-低x)/2);
var centerY=低y+((高y-低y)/2);
返回板条(centerX、centerY);
}

获取多边形中心的kotlin版本
mPoints
纬度
经度
的数组

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

我发现在v2中,我可以通过调用polygon.getBounds().getCenter()来实现这一点,但我想我必须按照你的方式来实现。谢谢,我不知道,这也可能在v3中起作用。我没有仔细看过谷歌地图API。但这种方法本质上就是这样的。看起来谷歌忘记了
Polygon.getBounds()
方法。它适用于
圆形
矩形
,但不适用于
多边形
类。如果多边形跨越国际日期线(例如:俄罗斯的国际边界),这将严重失败。正如@Canuk所述,在某些情况下,这将失败。理想情况下,您希望使用循环量的平均值,而不是算术平均值。很好地包装在这里:为什么这是更好的解决方案?在我看来,两种解决方案应该总是得到相同的答案。这会更快吗?@Nicolas:两者都会得到相同的解决方案,但实现起来更简单,依赖于Google API,而且由于代码更短(最差4行),一眼就能看出它的功能。这两种方法都应该具有可忽略的运行时,因此速度不是问题。类型错误:a是未定义的。因此,这是一个更好的解决方案,因为它将考虑地球的曲率。我发布的简单算法对于小区域来说是一个合理的近似值,但是如果你试图计算一个区域的地理中心,那么这将给出一个更好的答案。世界不是长方形的,只有地图。在谷歌搜索同一问题时发现此帖子。。这个建议对我来说非常有效!谢谢..哇,这工作真有魅力!!我认为最好的解决方案,谢谢@furiozo出于某种原因,这对我不起作用。当我试图在多边形对象上调用
my_getBounds()
函数时,它是未定义的。经过进一步实验,与Google Maps Javascript API v3的最新迭代相比,这似乎已经过时。Polygon类现在是
google.maps.Data.Polygon
,该类上没有
getPath()
方法。我今天(2015年8月21日)在google.maps.Polygon对象上一字不差地回答了这个问题,没有使用google maps API v3进行任何更改。
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))