2010-07-23 66 views
20

我有一个从用户数据动态生成的覆盖图,所以我需要知道如何找到该覆盖图的中心。Google Maps API:计算折线的中心/缩放

目前,我只是使用覆盖图中的第一个坐标,但这并不代表覆盖图的中心。因此,当我加载地图时,它不在叠加层上居中。

有没有人有一个很好的方法,通过计算中心,而不是硬编码它在叠加地图上居中的地图?

var latlng = new google.maps.LatLng(38.269239, -122.276010); 
    var myOptions = { 
     zoom: 15,//Calculate this somehow? 
     center: latlng,// Calculate value from array of coordinates? 
     mapTypeId: google.maps.MapTypeId.HYBRID 
    }; 

回答

78

如果你有一个坐标列表,你可以遍历它们并将它们添加到一个LatLngBounds对象。下面是V3 API一个例子,但在V2的概念是相似的:

var bounds = new google.maps.LatLngBounds(); 
for (var i = 0; i < coordinates.length; i++) { 
    bounds.extend(coordinates[i]); 
} 

之后,你可以得到中心与:

bounds.getCenter(); 

或者,你可以直接调用map.fitBounds(),它将围绕边界中心的地图居中并调整缩放,以便整个边界将完全适合视图端口。

map.fitBounds(bounds); 
+0

你是真棒!谢谢,这只是我需要的! – 2010-07-23 18:12:48

+0

这个方法可以用来计算缩放吗? – 2010-07-23 18:13:29

+0

只需在初始化过程中使用任何位置和缩放级别,然后如上所述调用'map.fitBounds(bounds);'。如果你想强制执行一些最大缩放级别,你需要暂时注册一个'zoomChangeBoundsListener'。告诉我你是否也需要一个例子。 – tux21b 2010-07-23 18:20:16

2

LatLngBounds的getCenter函数并不总是在折线内提供一个点。看来使用的算法很简单。我试图找到一个解决方案,并将发布在这里,如果找到一个。

10

基于@ tux21b,

 var bounds = new google.maps.LatLngBounds(); 
     polyline.getPath().forEach(function(e){//can't do polyline.getPath()[i] because it's a MVCArray 
      bounds.extend(e); 
     })   
     _map.fitBounds(bounds); 
相关问题