我正在使用Google Maps API v2。我将标记添加到地图,然后缩放以适合这些标记。如果地图可见,我的工作正常。但如果不是 - 例如,如果我有一个标签,并且在页面加载时没有选择地图的标签 - 那么当我显示地图时,缩放级别和中心是错误的。
这是一个简单的测试用例(使用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上正常工作?
答案 0 :(得分:2)
这就是我最终做的事情,以及它的价值。
$(".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();
};
这取决于几个惯例:
GMap2对象存储在map.gmap
中,其中map
是目标DOM元素:
var map= $("div#MapTarget")[0];
map.gmap = new google.maps.Map2(map);
每次将标记添加到地图中时,都会将其存储在数组中以供将来使用:
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);
答案 1 :(得分:1)
您需要做的就是先创建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();
});