编程语言
首页 > 编程语言> > javascript – 显示Infowindow后阻止谷歌地图移动

javascript – 显示Infowindow后阻止谷歌地图移动

作者:互联网

我正在尝试在Google地图上显示信息窗口.它显示完美,当你将鼠标悬停在标记上时,它会加载一个信息窗,但是地图会跳转到适合窗口的状态.我不希望地图移动,而是根据地图设置其位置. Booking.com有类似的东西.

编辑:添加了我的代码

这是我的代码的精简版本.我从AJAX服务获取所有信息,此服务返回响应(其中包含更多信息).

$.ajax({
    url: 'URL',
    dataType: "json",
    type: "GET",
    success: function(response) {
        // delete all markers
        clearOverlays();

        var infowindow = new google.maps.InfoWindow();

        for (var i = 0; i < response.length; i++) {
            item = response[i];

            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(item.lat, item.lng),
                map: map,
                url: item.detail_url
            });

            markersArray.push(marker);

            // display infowindow
            google.maps.event.addListener(marker, "mouseover", (function(marker, item) {
                return function() {
                    infowindow.setOptions({
                        content: 'SOME CONTENT HERE FOR INFOWINDOW'
                    });

                    infowindow.open(map, marker);
                }
            })(marker, item));

            // remove infowindow
            google.maps.event.addListener(marker, 'mouseout', function() {
                infowindow.close();
            });

            // marker click
            google.maps.event.addListener(marker, 'click', function() {
                window.location.href = marker.url;
            });
        }
    }
});

如下所示,第一张图像显示标记底部显示的信息窗口,而第二张图像显示标记顶部显示的信息窗口.地图不会移动,但infowindow会将其位置设置在地图的边界内.

解决方法:

在设置信息窗口选项infowindow.setOptions的声明中,添加以下选项以在显示infowindow时禁用地图平移,disableAutoPan:true.

但是,这也意味着您需要计算您可用的房地产,以便在地图上显示信息窗口,并使用头寸选项给它一个位置.否则,将无法保证您的信息窗口在地图上完全可见.

https://developers.google.com/maps/documentation/javascript/reference#InfoWindowOptions

编辑:如何计算屏幕房地产

我意识到,当我的部分问题是实际设置infowindow的位置时,我的建议是计算可用于设置信息窗口位置的屏幕空间.所以我已经提供了一个更新我的答案,你可以如何计算屏幕空间并调整你的infowindow的位置.

关键是首先将您的点从LatLng转换为像素,然后找出地图上标记的像素坐标与地图中心的像素坐标的关系.以下代码段演示了如何完成此操作.

getPixelFromLatLng: function (latLng) {
    var projection = this.map.getProjection();
    //refer to the google.maps.Projection object in the Maps API reference
    var point = projection.fromLatLngToPoint(latLng);
    return point;
}

获得像素坐标后,您需要找出标记当前所在的地图画布的哪个象限.这是通过将标记的X和Y坐标与地图进行比较来实现的,如下所示:

quadrant += (point.y > center.y) ? "b" : "t";
quadrant += (point.x < center.x) ? "l" : "r";

在这里,我根据它与地图中心的相对位置确定该点是位于地图的右下角,左下角,右上角还是左上角.请记住,这就是我们使用像素而不是LatLng值的原因,因为LatLng值将始终产生相同的结果 – 但实际情况是标记可以位于地图画布的任何象限中,具体取决于平移.

一旦你知道了标记所在的象限,就可以给infowindow提供偏移值来定位它,使它在地图上可见 – 就像这样:

if (quadrant == "tr") {
    offset = new google.maps.Size(-70, 185);
} else if (quadrant == "tl") {
    offset = new google.maps.Size(70, 185);
} else if (quadrant == "br") {
    offset = new google.maps.Size(-70, 20);
} else if (quadrant == "bl") {
    offset = new google.maps.Size(70, 20);
}
//these values are subject to change based on map canvas size, infowindow size

确定偏移值后,您可以在调用infoWindow.open()方法的任何侦听器上调整infowindow的pixelOffset.这是通过对infowindows使用setOptions()方法完成的:

infowindow.setOptions({pixelOffset : self.getInfowindowOffset(self.map, marker)}); 

这是上述解决方案的工作JSFiddle example.

注意:你会注意到infowindow上显示臭名昭着的“箭头”,显示你信息窗口的位置,这是默认谷歌地图设置信息窗口的一部分,我找不到一个正确的方法来摆脱它.有一个建议here,但我无法让它工作.或者,您可以使用infobox libraryinfobubble library – 它为您提供更多样式选项.

标签:infowindow,javascript,google-maps,google-maps-api-3
来源: https://codeday.me/bug/20190928/1827490.html