33

我正在使用来自 Google API v3 的地理编码器来显示一个国家/地区的地图。我得到了该国家/地区的推荐视口,但是当我想使地图适合该视口时,它不起作用(请参阅下面代码中调用 fitBounds 函数之前和之后的边界)。

我究竟做错了什么?

如何将地图的视口设置为results[0].geometry.viewport

var geocoder = new google.maps.Geocoder();
geocoder.geocode(
    {'address': '{{countrycode}}'},
    function(results, status) {
        var bounds = new google.maps.LatLngBounds();
        bounds = results[0].geometry.viewport;
        console.log(bounds);          // ((35.173, -12.524), (45.244, 5.098))
        console.log(map.getBounds()); // ((34.628, -14.683), (58.283, 27.503))
        map.fitBounds(bounds);               
        console.log(map.getBounds()); // ((25.740, -24.806), (52.442, 17.380))
    }
);
4

2 回答 2

73

发生这种情况是因为fitBounds()需要使用可能的最大缩放级别捕捉到适合地图画布的视口。另一方面,地理编码器返回的视口不依赖于地图画布的大小、布局或缩放级别。因此,该fitBounds()方法会调整地图的视口,以便在LatLngBounds地图的中心完整地查看传递的内容。

您可能需要检查以下示例以获得更清晰的演示:

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps fitBounds Demo</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script> 
</head> 
<body> 
   <div id="map" style="width: 500px; height: 350px"></div> 

   <script type="text/javascript"> 
      var myOptions = { mapTypeId: google.maps.MapTypeId.ROADMAP };
      var map = new google.maps.Map(document.getElementById("map"), myOptions);
      var geocoder = new google.maps.Geocoder();

      geocoder.geocode({'address': 'RU'}, function (results, status) {
         var ne = results[0].geometry.viewport.getNorthEast();
         var sw = results[0].geometry.viewport.getSouthWest();

         map.fitBounds(results[0].geometry.viewport);               

         var boundingBoxPoints = [
            ne, new google.maps.LatLng(ne.lat(), sw.lng()),
            sw, new google.maps.LatLng(sw.lat(), ne.lng()), ne
         ];

         var boundingBox = new google.maps.Polyline({
            path: boundingBoxPoints,
            strokeColor: '#FF0000',
            strokeOpacity: 1.0,
            strokeWeight: 2
         });

         boundingBox.setMap(map);
      }); 
   </script> 
</body> 
</html>

以下是上述示例中各个国家/地区的一些屏幕截图。红色边界框是地理编码器返回的视口。注意边界框和实际视口之间的差异,通过以下方式调整fitBounds()

国家:美国

我们

国家:俄罗斯

俄罗斯

国家: IT

它

于 2010-03-22T23:45:16.120 回答
3

只是为了让您知道可以通过哪种方式自定义它,我准备了一个示例,说明如果您希望在视口中放松一些边界框,您可以做什么

于 2012-10-30T10:49:08.840 回答