Google maps 如何在google maps v3中获取多边形的中心?
它不需要100%正确,它可以是边界矩形的中心。算法: 穿过多边形中的所有点。对于所有找到的点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()方法将多边形的每个点传递给对象,然
,最低的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))