google-maps - 使用 fitbounds 时,在 map 范围内包括打开的信息窗口

标签 google-maps google-maps-api-3 infowindow fitbounds

我有一张 map ,其中包含带有信息窗口的多个标记。信息窗口需要在页面加载时打开。使用 setbounds 将 map 居中以合并所有标记,这是可行的,但它还需要在边界内包含信息窗口。目前,信息窗口在某些地方被裁剪。

JS:

function initialize() {
    var map = new google.maps.Map(document.getElementById('map-canvas'));
    var bounds = new google.maps.LatLngBounds();
    var myLatlng1 = new google.maps.LatLng(51.525209,-0.09402479999994284)
    var contentString1 = '<div class="map-content"><p>Test1<br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf</p></div>'
    var infowindow1 = new google.maps.InfoWindow({content: contentString1});
    var marker1 = new google.maps.Marker({position: myLatlng1,map: map,title: 'Test1'});

    google.maps.event.addListener(marker1, 'click', function() {infowindow1.open(map,marker1);});
    infowindow1.open(map,marker1);
    bounds.extend(myLatlng1);

    var myLatlng2 = new google.maps.LatLng(51.52106840183588,-0.10866641049801729)
    var contentString2 = '<div class="map-content"><p><br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf<br/ >dsfasdf</p></div>'
    var infowindow2 = new google.maps.InfoWindow({content: contentString2});
    var marker2 = new google.maps.Marker({position: myLatlng2,map: map,title: 'Test2'});
    google.maps.event.addListener(marker2, 'click', function() {infowindow2.open(map,marker2);});
    infowindow2.open(map,marker2);
    bounds.extend(myLatlng2)

    //  Fit these bounds to the map
    map.fitBounds(bounds);
}
google.maps.event.addDomListener(window, 'load', initialize);

CSS:
#map-canvas { width: 100%; height: 520px; }

你可以在这里看到一个 fiddle :http://jsfiddle.net/mKKVM/

任何人都可以建议如何在边界内获取信息窗口?

最佳答案

概念证明 jsfiddle

  • 正常显示 map
  • 计算从标记 anchor 到信息窗口上边缘的像素距离
  • 计算从标记 anchor 到信息窗口左边缘的像素距离
  • 计算从标记 anchor 到信息窗口右边缘的像素距离
  • 用边界右角加上信息窗口宽度的一半和边界顶部加上信息窗口的高度的两个点扩展原始边界。
  • 用边界左角减去信息窗口宽度的一半和边界顶部加上信息窗口高度的两点来扩展原始边界。
  • 使 map 适应新的边界。

  • 大概可以细化使用3点上中、左中、右中,这是第一次剪裁,概念证明,大概可以清理和细化。
    function initialize() {
      var map = new google.maps.Map(document.getElementById('map-canvas'));
      var projection = null; 
      google.maps.event.addListener(map,'projection_changed', function() {
        projection = map.getProjection();
      }); 
    
      var bounds = new google.maps.LatLngBounds();
      if (!projection) 
        google.maps.event.addListener(map, 'idle', computeBounds);
      else 
        computeBounds();
    
      var myLatlng1 = new google.maps.LatLng(51.525209,-0.09402479999994284);
      bounds.extend(myLatlng1);
      var myLatlng2 = new google.maps.LatLng(51.52106840183588,-0.10866641049801729);
      bounds.extend(myLatlng2);
      //  Fit these bounds to the map
      map.fitBounds(bounds);
    
      function computeBounds() {    
    
        var contentString1 = '<div class="map-content"><p>Test1<br />dsfasdf<br />dsfasdf<br />dsfasdf<br />dsfasdf<br />dsfasdf<br />dsfasdf</p></div>'
        var infowindow1 = new google.maps.InfoWindow({content: contentString1});
        var marker1 = new google.maps.Marker({position: myLatlng1,map: map,title: 'Test1'});
    
        google.maps.event.addListener(marker1, 'click', function() {
          infowindow1.open(map,marker1);
        });
        infowindow1.open(map,marker1);
        google.maps.event.addListenerOnce(infowindow1,'domready',calcInfoWindowBounds); 
    
        var contentString2 = '<div class="map-content"><p><br />dsfasdf<br />dsfasdf<br />dsfasdf<br />dsfasdf<br />dsfasdf</p></div>'
        var infowindow2 = new google.maps.InfoWindow({content: contentString2});
        var marker2 = new google.maps.Marker({position: myLatlng2,map: map,title: 'Test2'});
        google.maps.event.addListener(marker2, 'click', function() {
          infowindow2.open(map,marker2);
        });
        infowindow2.open(map,marker2);
    
        google.maps.event.addListenerOnce(infowindow2,'domready',calcInfoWindowBounds); 
    
        function calcInfoWindowBounds(){
          domEls = document.getElementsByClassName('map-content');
          var markerSpace = 32+8;
          var maxTop = 0;
          var maxLeft = 0;
          var maxRight = 0;
          for (var i=0; i<domEls.length; i++) {
            var topOfWindow = domEls[i].offsetHeight + markerSpace;
            var leftOfWindow = domEls[i].offsetWidth/2;
            var rightOfWindow = domEls[i].offsetWidth/2;
    
            if (topOfWindow > maxTop) maxTop = topOfWindow;
            if (leftOfWindow > maxLeft) maxLeft = leftOfWindow;
            if (rightOfWindow > maxRight) maxRight = rightOfWindow;
          }
    
          var leftBounds = projection.fromLatLngToPoint(new google.maps.LatLng(bounds.getNorthEast().lat(),bounds.getSouththWest().lng()));
          var rightBounds = projection.fromLatLngToPoint(new google.maps.LatLng(bounds.getNorthEast()));
          var topBounds0 = rightBounds.y + maxTop;
          var rightBounds0 = rightBounds.x + maxRight;
          var leftBounds0 = leftBounds.x - maxLeft;
          bounds.extend(projection.fromPointToLatLng(leftBounds0,topBounds0));
          bounds.extend(projection.fromPointToLatLng(rightBounds0,topBounds0));
          map.fitBounds(bounds);
        }   
    
      }
    
    }
    google.maps.event.addDomListener(window, 'load', initialize);
    

    关于google-maps - 使用 fitbounds 时,在 map 范围内包括打开的信息窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002001/

    相关文章:

    google-maps - Google Maps API v3 - 如何检测 map 何时更改为全屏模式?

    php - 使用 PHP 将知名文本 (WKT) 从 MySQL 转换为 Google Maps 多边形

    javascript - 加载谷歌地图控件元素时的回调

    android - 如何解决Android Studio中的依赖项中有2个具有相同包名的库?

    关闭并重新打开对话框后,jQuery 对话框和 Google map 无法正常运行

    android - 如何在 Android Google Maps API v2 上管理多边形的 InfoWindows

    android - 如何在谷歌地图中获取当前位置

    javascript - 我的谷歌地图多边形边界和缩放不起作用

    ios - 以编程方式关闭标记的信息窗口 google maps iOS

    ios - 在 iOS 中移动 Google map 信息窗口