设置地图缩放以覆盖所有标记;确保以特定标记为中心

Posted

技术标签:

【中文标题】设置地图缩放以覆盖所有标记;确保以特定标记为中心【英文标题】:Set Zoom of Map to cover all markers; making sure center at a specific marker 【发布时间】:2016-04-26 01:13:58 【问题描述】:

我们可以通过此代码缩放地图并将其居中以显示所有标记:

var markers = //some array (all of them should be visible);
var Themarker = //a marker that should be the center
var bounds = new google.maps.LatLngBounds();
for(i=0;i<markers.length;i++) 
 bounds.extend(markers[i].getPosition());

map.fitBounds(bounds);

但是如何确定:

    所有标记都是可见的(上面的代码就是这样做的) 地图的中心是Themarker(以上代码不这样做)

地图可以通过map.panTo(Themarker.getPosition()); 以Themarker 为中心,但在最后使用它会使标记滑出视图。

【问题讨论】:

Themarkermarkers 数组的一部分吗? 不是我的情况,但如果你有解决方案,我可以使用 【参考方案1】:

您可以考虑以下解决方案来调整视口,以便在更改地图中心后使所有标记可见:

function initialize() 

    var center = new google.maps.LatLng(-31.953159, 115.849915); //Perth

    var options = 
        center,
        zoom: 20,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    ;
    var map = new google.maps.Map(document.getElementById("map-div"), options);


    var locations = [
            id: 1, name: "Brisbane", coords: [-33.867396, 151.206854],
             id: 2, name: "Sydney", coords: [-27.46758, 153.027892] ,
             id: 3, name: "Perth", coords: [-31.953159, 115.849915] ,
             id: 4, name: 'Canberra', coords: [-35.279014, 149.124449] 
    ];

    var markers = [];
    var bounds = new google.maps.LatLngBounds();
    locations.forEach(function (loc) 
        var pos = new google.maps.LatLng(loc.coords[0], loc.coords[1]);
        var marker = createMarker(map, pos);
        markers.push(marker);
        bounds.extend(pos);
    );
    map.fitBounds(bounds);
 
    map.panTo(center);  //change map center

    google.maps.event.addListenerOnce(map, 'idle', function () 
        resizeMapView(map, markers); //adjust viewport
    );


   




function resizeMapView(map, markers) 
    var mapBounds = map.getBounds(); // get bounds of the map object's viewport
   
    var result = markers.filter(function(marker)   //determine wether map contains all the markers
        if (!mapBounds.contains(marker.getPosition())) 
            return true;
        
    );
    if (result.length > 0) 
        var zoom = map.getZoom();
        map.setZoom(zoom - 1);
        resizeMapView(map, markers);
    



function createMarker(map,position) 
    return new google.maps.Marker(
        position: position,
        map: map
    );



google.maps.event.addDomListener(window, 'load', initialize);
html, body 
    height: 100%;
    margin: 0;
    padding: 0;


#map-div 
    height: 100%;
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<div id="map-div"></div>

JSFiddle

【讨论】:

以上是关于设置地图缩放以覆盖所有标记;确保以特定标记为中心的主要内容,如果未能解决你的问题,请参考以下文章

如何居中/设置地图缩放以覆盖 Xamarin.Forms 上可见的所有标记?

特定标记上的中心地图和其他标记上的 fitToBounds

如何设置谷歌地图缩放级别以显示所有标记?

有没有办法在 AGM 地图中设置边界和缩放级别?

带有多个标记的谷歌地图自动中心

缩放以适合 LeafletJS 地图上的所有标记