代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

谷歌地图-当地图不可见时,缩放以适应标记不起作用

  •  3
  • Herb Caudill  · 技术社区  · 15 年前

    我正在使用googlemapsapiv2。我将标记添加到地图,然后缩放以适应这些标记。如果地图是可见的,我可以这样做。但是如果没有,例如,如果我有一个tabstrip,并且在页面加载时没有选择地图的tab,那么当我显示地图时,缩放级别和中心是错误的。

    下面是一个简单的测试用例(使用jquery):

    <script type="text/javascript">
    
        var scale = Math.random() * 20;
    
        $(document).ready(function() {
            var $container = $('#container');
            // $container.hide();
            var map = new GMap2($('#map')[0]);
            $container.show();
            var markerBounds = new GLatLngBounds();
            for (var i = 0; i < 10; i++) {
                var randomPoint = new GLatLng(38.935394 + (Math.random() - 0.5) * scale, -77.061382 + (Math.random() - 0.5) * scale);
                map.addOverlay(new GMarker(randomPoint));
                markerBounds.extend(randomPoint);
            }
            map.setCenter(markerBounds.getCenter(), map.getBoundsZoomLevel(markerBounds));
        });
    
    </script>
    
    <div id="container">
        <div id="map" style="margin: 100px; width: 450px; height: 300px;"></div>
    </div>
    

    这样做很好,但是如果您取消注释 $container.hide() 都累坏了。

    有没有办法让google maps api在不可见的div上正常工作?

    2 回复  |  直到 10 年前
        1
  •  1
  •   Halvor Holsten Strand mtorres    10 年前

    你只需要创建 GMaps2() 比什么都重要。那么你就可以 hide() 容器,添加点,得到 getBoundsZoomLevel() , show() 再来一次,应该会好的。

    请尝试以下操作:

    $(document).ready(function() {
       var $container = $('#container');
    
       // First create the Map.
       var map = new GMap2($('#map')[0]);
    
       // The container can be hidden immediately afterwards.
       $container.hide();
    
       // Now you can do whatever you like!
       var markerBounds = new GLatLngBounds();
       for (var i = 0; i < 10; i++) {
          var randomPoint = new GLatLng( 38.935394 + (Math.random() - 0.5) * scale, 
                                        -77.061382 + (Math.random() - 0.5) * scale);
          map.addOverlay(new GMarker(randomPoint));
          markerBounds.extend(randomPoint);
       }
       map.setCenter(markerBounds.getCenter(), map.getBoundsZoomLevel(markerBounds));
    
       // Finally unhide the container.
       $container.show();
    });
    

    getBoundsZoomLevel

        2
  •  2
  •   Herb Caudill    15 年前

    这就是我最终所做的,为了它的价值。

                $(".TabPanel").watch("display,visibility", function() {
                    $(".MapContainer", this).each(function() {
                        if ($(this).is(":visible") == true) {
                            $(this).zoomToFitMarkers();
                        };
                    });
                });
    

    这种用途 Rick Strahl's monitoring plugin for jQuery 查看选项卡面板的可见性更改,然后重新应用缩放逻辑。

    为了完整起见 zoomToFitMarkers 扩展:

    $.fn.zoomToFitMarkers = function() {
        var map = this[0];
        map.gmap.checkResize();
        map.bounds = new GLatLngBounds();
        if (!!map.gmap.getOverlays) {
            for (i = 0; i < map.gmap.getOverlays.length; i++) {
                map.bounds.extend(map.gmap.getOverlays[i].getLatLng());
            }
            if (map.bounds && !map.bounds.isEmpty()) {
                var zoomLevel = map.gmap.getBoundsZoomLevel(map.bounds);
                zoomLevel = zoomLevel > 9 ? 9 : zoomLevel;
                zoomLevel = zoomLevel < 2 ? 2 : zoomLevel;
                map.gmap.setCenter(map.bounds.getCenter(), zoomLevel);
            }
        }
        map.gmap.checkResize();
    };
    

    这依赖于两个约定:

    1. GMAP2对象存储在 map.gmap 在哪里 map 是目标dom元素:

      var map= $("div#MapTarget")[0];
      map.gmap = new google.maps.Map2(map);
      
    2. 每次将标记添加到地图时,它都存储在一个数组中以供将来使用:

      var marker = new GMarker(point);
      map.gmap.addOverlay(marker);
      // Keep track of new marker in getOverlays array
      if (!map.gmap.getOverlays) map.gmap.getOverlays = new Array();
      map.gmap.getOverlays.push(marker);