您可能想要聽dragend
事件,而如果地圖被拖出超出允許範圍,將其移回到裏面。使用LatLngBounds
對象來定義邊界是很好的,因爲您可以使用方法,如果給定的lat/lng參數在邊界內,則返回true。
您應該也可以限制縮放級別,因爲通過縮小用戶仍然能夠「看到」邊界外的地圖。
因此,你可能要嘗試下面的例子:從上面的例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps JavaScript API v3 Example: Limit Panning</title>
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="map" style="width: 400px; height: 300px;"></div>
<script type="text/javascript">
var minZoomLevel = 5;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: minZoomLevel,
center: new google.maps.LatLng(38.50, -90.50),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// Bounds for North America
var strictBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(28.70, -127.50),
new google.maps.LatLng(48.85, -55.90));
// Listen for the dragend event
google.maps.event.addListener(map, 'dragend', function() {
if (strictBounds.contains(map.getCenter())) return;
// Out of bounds - Move the map back within the bounds
var c = map.getCenter(),
x = c.lng(),
y = c.lat(),
maxX = strictBounds.getNorthEast().lng(),
maxY = strictBounds.getNorthEast().lat(),
minX = strictBounds.getSouthWest().lng(),
minY = strictBounds.getSouthWest().lat();
if (x < minX) x = minX;
if (x > maxX) x = maxX;
if (y < minY) y = minY;
if (y > maxY) y = maxY;
map.setCenter(new google.maps.LatLng(y, x));
});
// Limit the zoom level
google.maps.event.addListener(map, 'zoom_changed', function() {
if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel);
});
</script>
</body>
</html>
截圖。用戶將不能夠在這種情況下,再往南或遠東拖動:
感謝您的回答。我注意到了這種方式(但沒有計算)。但是如果他拖得更多,它仍然會允許用戶看到地圖的其他部分。我正在尋找一種方式,在他嘗試訪問地圖的禁止區域的同一時刻打破用戶的拖動。 – hsz 2010-07-08 16:34:35
@hsz:在這種情況下,您可能想要聽'drag'事件而不是'dragend',但阻止看起來不會很好。你可能更喜歡使用'panTo'而不是'setCenter'。 – 2010-07-08 16:57:22