gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:22:57 27 4
gpt4 key购买 nike

我有一张 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com