如何在谷歌地图v3中获取多边形的中心?
它不需要100%正确,它可以是边界矩形的中心。
algorithm:
遍历多边形中的所有点。 对于所有的点发现;
-
x1
,最低的x
坐标 -
y1
,最低的y
坐标 -
x2
,最高的x
坐标 -
y2
,最高的y
坐标
你现在有了边界矩形,可以使用下面的方法计算出中心:
center.x = x1 + ((x2 - x1) / 2); center.y = y1 + ((y2 - y1) / 2);
马修的答案是一个很好的解决scheme。 但是,使用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的行为
@Matthew Scharley的回答是我的algorithm。 这可能是坏的。 要温柔。 我写了它,因为V3 API中的getCenter()函数仅适用于矩形和圆形,而不适用于多边形。
function polygonCenter(poly) { var lowx, highx, lowy, highy, lats = [], lngs = [], vertices = poly.getPath(); for(var i=0; i<vertices.length; i++) { lngs.push(vertices.getAt(i).lng()); lats.push(vertices.getAt(i).lat()); } lats.sort(); lngs.sort(); lowx = lats[0]; highx = lats[vertices.length - 1]; lowy = lngs[0]; highy = lngs[vertices.length - 1]; center_x = lowx + ((highx-lowx) / 2); center_y = lowy + ((highy - lowy) / 2); return (new google.maps.LatLng(center_x, center_y)); }
请注意,在凹多边形的情况下,边界矩形的中心可能完全位于多边形之外。 如果你的多边形可能是凹的,我build议使用最大的内切圆的中心作为多边形的“中心”。 你可以在这里看到一个简单的algorithm(第4页) 。 如果你的任务是在多边形上放置一个标签,这也将给出最美观的结果(在这种情况下,即使你的多边形不是凹的,我build议使用这种方法)。