居中/设置缩放地图覆盖所有可见的标记?

我在地图上设置了多个标记,我可以静态地设置缩放级别和中心,但我想要的是,覆盖所有标记,尽可能放大,让所有市场可见

可用的方法如下

setZoom(zoom:number)

而且

setCenter(latlng:LatLng)

setCenter不支持多位置或位置数组输入,setZoom也不支持这种类型的功能

enter image description here

210669 次浏览

你需要使用fitBounds()方法。

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


map.fitBounds(bounds);

文档 from developers.google.com/maps/documentation/javascript:

fitBounds(bounds[, padding])

参数:

`bounds`:  [`LatLngBounds`][1]|[`LatLngBoundsLiteral`][1]
`padding` (optional):  number|[`Padding`][1]

返回值:没有

设置视口以包含给定的边界 注意:当映射被设置为display: none时,fitBounds函数将映射的大小读取为0x0,因此不做任何事情。要在隐藏映射时更改视口,请将映射设置为visibility: hidden,从而确保映射div具有实际大小。

用一些有用的技巧来扩展给定的答案:

var markers = //some array;
var bounds = new google.maps.LatLngBounds();
for(i=0;i<markers.length;i++) {
bounds.extend(markers[i].getPosition());
}


//center the map to a specific spot (city)
map.setCenter(center);


//center the map to the geometric center of all markers
map.setCenter(bounds.getCenter());


map.fitBounds(bounds);


//remove one zoom level to ensure no marker is on the edge.
map.setZoom(map.getZoom()-1);


// set a minimum zoom
// if you got only 1 marker or all markers are on the same address map will be zoomed too much.
if(map.getZoom()> 15){
map.setZoom(15);
}


//Alternatively this code can be used to set the zoom for just 1 marker and to skip redrawing.
//Note that this will not cover the case if you have 2 markers on the same address.
if(count(markers) == 1){
map.setMaxZoom(15);
map.fitBounds(bounds);
map.setMaxZoom(Null)
}
< p > 更新: < br > 对该主题的进一步研究表明,fitBounds()是异步的 并且在调用Fit Bounds之前,最好使用一个侦听器来进行缩放操作 谢谢@Tim, @xr280xr,关于这个主题的更多例子:所以:setzoom-after-fitbounds

google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
this.setZoom(map.getZoom()-1);


if (this.getZoom() > 15) {
this.setZoom(15);
}
});
map.fitBounds(bounds);

有这个MarkerClusterer客户端实用程序可用于谷歌Map,在谷歌地图开发人员文章中指定,下面简要介绍它的用法:

有很多方法可以达到你的要求:

  • 基于网格的聚类
  • 距离聚类
  • 视口标记管理
  • 融合表
  • 标记Clusterer运算
  • MarkerManager

你可以在上面提供的链接上阅读它们。

Marker Clusterer使用基于网格的集群聚类所有希望网格的标记。基于网格的聚类工作原理是将地图划分为一定大小的正方形(每次缩放时大小都会变化),然后将标记分组到每个网格正方形中。

< p >在聚类之前 聚类前 < / p > 聚类后< p > 聚类后 < / p >

我希望这就是你要找的东西。这将解决你的问题:)

数组的大小必须大于零。 Οtherwise你会有意想不到的结果。

function zoomeExtends(){
var bounds = new google.maps.LatLngBounds();
if (markers.length>0) {
for (var i = 0; i < markers.length; i++) {
bounds.extend(markers[i].getPosition());
}
myMap.fitBounds(bounds);
}
}