我有一组点,我想在嵌入式谷歌地图(API v3)上绘制。我希望边界容纳所有的点,除非缩放级别太低(即,缩小太多)。我的方法是这样的:

var bounds = new google.maps.LatLngBounds();

// extend bounds with each point

gmap.fitBounds(bounds); 
gmap.setZoom( Math.max(6, gmap.getZoom()) );

这行不通。最后一行“gmap.setZoom()”如果在fitBounds之后直接调用,则不会改变地图的缩放级别。

有没有一种方法来获得缩放级别的边界而不应用到地图?还有其他解决方法吗?


当前回答

如果我没记错的话,我假设你想让你的所有点在地图上以最高的缩放级别可见。我通过将地图的缩放级别初始化为16来实现这一点(不确定它是否是V3上可能的最高缩放级别)。

var map = new google.maps.Map(document.getElementById('map_canvas'), {
  zoom: 16,
  center: marker_point,
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

然后我做了边界的事情:

var bounds = new google.maps.LatLngBounds();

// You can have a loop here of all you marker points
// Begin loop
bounds.extend(marker_point);
// End loop

map.fitBounds(bounds);

结果: 成功!

其他回答

有同样的问题,需要适应地图上的许多标记。 这解决了我的问题:

申报范围 koderoid提供的使用方案(用于每个标记集bounds.extend(objLatLng)) 执行fitbounds后映射完成: google.maps.event。addListenerOnce(map, 'idle', function() { 地图。fitBounds(边界); });

请尝尝这个。

// Find out what the map's zoom level is
zoom = map.getZoom();
if (zoom == 1) {
  // If the zoom level is that low, means it's looking around the
world.
  // Swap the sw and ne coords
  viewportBounds = new
google.maps.LatLngBounds(results[0].geometry.location, initialLatLng);
  map.fitBounds(viewportBounds);
}

如果这对你有帮助的话。

愿一切都好!

计算完边界后,你可以检查左上角和右下角之间的距离;然后你可以通过测试距离来了解缩放级别(如果距离太远,缩放级别会很低),然后你可以选择是否使用setbound方法或setZoom..

我使用:

gmap.setZoom(24); //this looks a high enough zoom value
gmap.fitBounds(bounds); //now the fitBounds should make the zoom value only less

这将使用较小的24和必要的缩放级别根据你的代码,但它可能会改变缩放无论如何,并不关心你有多少缩小。

在这个函数中,您只需要动态添加元数据来存储几何类型,因为该函数接受任何几何。

“fitGeometries”是一个扩展映射对象的JSON函数。

"geometries"是一个通用的javascript数组,而不是MVCArray()。

geometry.metadata = { type: "point" };
var geometries = [geometry];

fitGeometries: function (geometries) {
    // go and determine the latLngBounds...
    var bounds = new google.maps.LatLngBounds();
    for (var i = 0; i < geometries.length; i++) {
        var geometry = geometries[i];
        switch (geometry.metadata.type)
        {
            case "point":
                var point = geometry.getPosition();
                bounds.extend(point);
                break;
            case "polyline":
            case "polygon": // Will only get first path
                var path = geometry.getPath();
                for (var j = 0; j < path.getLength(); j++) {
                    var point = path.getAt(j);
                    bounds.extend(point);
                }
                break;
        }
    }
    this.getMap().fitBounds(bounds);
},