我正在使用Google Maps
,我希望能够禁止用户将地图拖出指定的边界。
var strictBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(49.00, 14.07),
new google.maps.LatLng(54.50, 24.09)
);
我该怎么办?我尝试使用drag
事件,但没有运气..
google.maps.event.addListener(map, 'drag', function() {
if (
!strictBounds.contains(map.getBounds().getNorthEast())
|| !strictBounds.contains(map.getBounds().getSouthWest())
) {
// map is out of bounds here
}
});
如何阻止用户拖动strictBounds
?
答案 0 :(得分:2)
您可能希望收听dragend
事件,如果地图被拖到允许范围之外,请将其移回内部。使用LatLngBounds
对象来定义边界是很好的,因为您将能够使用contains()
方法,如果给定的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>
以上示例的屏幕截图。在这种情况下,用户将无法再向南或远东拖动:
答案 1 :(得分:0)
试试这个:
var strictBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(49.00, 14.07),
new google.maps.LatLng(54.50, 24.09)
);
google.maps.event.addListener(map, 'drag', function() {
if (!strictBounds.intersects(map.getBounds()) ) {
// map is out of bounds here
map.setCenter(strictBounds.getCenter());
}
});
它不太理想,它只是将地图中心移回strictBounds中心,理想情况下你会尝试计算它们试图拖过的边界的最近边缘。它也有点慢,因为他们已经超出界限,但这是API的问题
答案 2 :(得分:0)
这很有效,虽然它有点跳跃:
// Boundaries
var southBound = 33;
var westBound = -119;
var northBound = 34;
var eastBound = -118;
// Intersect boxes for stopping drag
var topBox = new google.maps.LatLngBounds(
new google.maps.LatLng(northBound, westBound),
new google.maps.LatLng(northBound + 1, eastBound)
);
var rightBox = new google.maps.LatLngBounds(
new google.maps.LatLng(southBound, eastBound),
new google.maps.LatLng(northBound, eastBound + 1)
);
var bottomBox = new google.maps.LatLngBounds(
new google.maps.LatLng(southBound - 1, westBound),
new google.maps.LatLng(southBound, eastBound)
);
var leftBox = new google.maps.LatLngBounds(
new google.maps.LatLng(southBound, westBound - 1),
new google.maps.LatLng(northBound, westBound)
);
// Last known good center point
var lastGoodCenter = map.getCenter();
// Listen for dragging
google.maps.event.addListener(map, 'drag', function() {
// If the map's bounds intersect with one of the stop boxes
if (map.getBounds().intersects(topBox) || map.getBounds().intersects(rightBox)
|| map.getBounds().intersects(bottomBox) || map.getBounds().intersects(leftBox)){
// Go back to the good center
map.setCenter(lastGoodCenter);
}else{
// Or set this new center as good
lastGoodCenter = map.getCenter();
}
});