【问题标题】:Google Maps API 3 - Show All Markers on Screen, but Keep CenterpointGoogle Maps API 3 - 在屏幕上显示所有标记,但保持中心点
【发布时间】:2017-10-12 04:22:28
【问题描述】:

这与this question 非常相似。我想确保所有标记都显示在当前缩放级别。但是,我还想事先选择中心点(用户的当前位置)。如果圆圈是标记,而正方形是我想要的中心点,那么在下图中,链接的解决方案将创建第一个(左、上)图像。我想要第二张(右下)图片。

【问题讨论】:

    标签: javascript cordova google-maps-api-3


    【解决方案1】:

    您可以创建一个LatLngBounds 对象并使用您的每个标记坐标扩展它。然后获取您的边界对象东北和西南坐标,并检查这些坐标是否包含在当前地图边界内。如果没有,请缩小并重试。

    下面的大部分代码都是在特定范围内生成随机标记。真正有趣的部分是我调用bounds.extend(position)fitAllBounds 函数的地方。

    var map, bounds;
    
    function initialize() {
    
      var southWest = new google.maps.LatLng(40, -70);
      var northEast = new google.maps.LatLng(35, -80);
      var lngSpan = northEast.lng() - southWest.lng();
      var latSpan = northEast.lat() - southWest.lat();
    
      var center = new google.maps.LatLng(40, -70);
    
      map = new google.maps.Map(document.getElementById("map-canvas"), {
        zoom: 12,
        center: center,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });
    
      // Add center marker
      new google.maps.Marker({
        position: center,
        label: 'C',
        map: map
      });
    
      // Create the bounds object
      bounds = new google.maps.LatLngBounds();
    
      // Create random markers
      for (var i = 0; i < 20; i++) {
    
        // Calculate a random position
        var position = new google.maps.LatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random());
    
        var marker = new google.maps.Marker({
          position: position,
          map: map
        });
    
        google.maps.event.addListener(marker, 'click', (function(marker, i) {
          return function() {
            map.setZoom(5);
            map.setCenter(marker.position);
          }
        })(marker, i));
    
        // Extend the bounds with the last marker position
        bounds.extend(position);
      }
    
      // Fit all bounds once, when the map is ready
      google.maps.event.addListenerOnce(map, 'idle', function() {
    
        fitAllBounds(bounds);
      });
    }
    
    function fitAllBounds(b) {
    
      // Get north east and south west markers bounds coordinates
      var ne = b.getNorthEast();
      var sw = b.getSouthWest();
    
        // Get the current map bounds
      var mapBounds = map.getBounds();
    
      // Check if map bounds contains both north east and south west points
      if (mapBounds.contains(ne) && mapBounds.contains(sw)) {
    
        // Everything fits
        return;
    
      } else {
    
        var mapZoom = map.getZoom();
    
        if (mapZoom > 0) {
    
          // Zoom out
          map.setZoom(mapZoom - 1);
    
          // Try again
          fitAllBounds(b);
        }
      }
    }
    
    initialize();
    #map-canvas {
      height: 200px;
      width: 200px;
    }
    <div id="map-canvas"></div>
    
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>

    这里也在 JSFiddle 上:

    JSFiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2014-10-10
      • 2017-02-16
      • 2014-07-29
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多