是否可以將Google地圖v3限制在某個區域?我想只允許顯示某個區域(例如國家),並且不允許用戶在別處滑動。另外我想限制縮放級別 - 例如只在6和9級之間。我想使用所有的基本地圖類型。谷歌地圖v3 - 限制可視區域和縮放級別
有什麼辦法可以達到這個目的嗎?
我在使用StyledMap限制縮放級別方面取得了部分成功,但我成功的只限於ROADMAP,我無法通過這種方式限制縮放其他基本類型。
感謝所有幫助
是否可以將Google地圖v3限制在某個區域?我想只允許顯示某個區域(例如國家),並且不允許用戶在別處滑動。另外我想限制縮放級別 - 例如只在6和9級之間。我想使用所有的基本地圖類型。谷歌地圖v3 - 限制可視區域和縮放級別
有什麼辦法可以達到這個目的嗎?
我在使用StyledMap限制縮放級別方面取得了部分成功,但我成功的只限於ROADMAP,我無法通過這種方式限制縮放其他基本類型。
感謝所有幫助
你可以聽dragend
事件,如果地圖拖動允許的範圍以外,將其移回內部。您可以在LatLngBounds
對象中定義允許的邊界,然後使用方法檢查新的緯度/經度中心是否在邊界內。
您還可以非常輕鬆地限制縮放級別。
考慮下面的例子:從上面的例子Fiddle Demo
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps JavaScript API v3 Example: Limit Panning and Zoom</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">
// This is the minimum zoom level that we'll allow
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;
// We're 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>
截圖。用戶將不能夠在這種情況下,再往南或遠東拖動:
限制縮放級別更好的辦法可能是使用了minZoom
/maxZoom
選項,而不是反應事件?
var opt = { minZoom: 6, maxZoom: 9 };
map.setOptions(opt);
,或者可以映射初始化過程中指定的選項,如:
var map = new google.maps.Map(document.getElementById('map-canvas'), opt);
更好的方法來限制範圍...使用的含有從上面的海報邏輯。
var dragStartCenter;
google.maps.event.addListener(map, 'dragstart', function(){
dragStartCenter = map.getCenter();
});
google.maps.event.addListener(this.googleMap, 'dragend', function(){
if (mapBounds.contains(map.getCenter())) return;
map.setCenter(this.dragStart);
});
這是我的變體,以解決可視區域的限制問題。
google.maps.event.addListener(this.map, 'idle', function() {
var minLat = strictBounds.getSouthWest().lat();
var minLon = strictBounds.getSouthWest().lng();
var maxLat = strictBounds.getNorthEast().lat();
var maxLon = strictBounds.getNorthEast().lng();
var cBounds = self.map.getBounds();
var cMinLat = cBounds.getSouthWest().lat();
var cMinLon = cBounds.getSouthWest().lng();
var cMaxLat = cBounds.getNorthEast().lat();
var cMaxLon = cBounds.getNorthEast().lng();
var centerLat = self.map.getCenter().lat();
var centerLon = self.map.getCenter().lng();
if((cMaxLat - cMinLat > maxLat - minLat) || (cMaxLon - cMinLon > maxLon - minLon))
{ //We can't position the canvas to strict borders with a current zoom level
self.map.setZoomLevel(self.map.getZoomLevel()+1);
return;
}
if(cMinLat < minLat)
var newCenterLat = minLat + ((cMaxLat-cMinLat)/2);
else if(cMaxLat > maxLat)
var newCenterLat = maxLat - ((cMaxLat-cMinLat)/2);
else
var newCenterLat = centerLat;
if(cMinLon < minLon)
var newCenterLon = minLon + ((cMaxLon-cMinLon)/2);
else if(cMaxLon > maxLon)
var newCenterLon = maxLon - ((cMaxLon-cMinLon)/2);
else
var newCenterLon = centerLon;
if(newCenterLat != centerLat || newCenterLon != centerLon)
self.map.setCenter(new google.maps.LatLng(newCenterLat, newCenterLon));
});
strictBounds
是new google.maps.LatLngBounds()
類型的一個對象。 self.gmap
存儲Google地圖對象(new google.maps.Map()
)。
它確實有效,但如果你的邊界覆蓋了它們,不僅忘記考慮穿越第0經絡和平行線的痔瘡。
接受Daniel Vassallo的算法對我無法正常工作。這裏有幾個主要的區別。 – 2012-08-19 12:51:57
出於某種原因
if (strictBounds.contains(map.getCenter())) return;
我沒有工作(也許是南半球的問題)。我不得不改變它:
function checkBounds() {
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 > maxX || y < minY || y > maxY) {
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));
}
}
希望它會幫助別人。
這可能對您有幫助。
var myOptions = {
center: new google.maps.LatLng($lat,$lang),
zoom: 7,
disableDefaultUI: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
縮放級別可以根據需要定製。
這並沒有解決將縮放級別限制在一個範圍內的原始問題。只在級別6和9之間,它設置*默認*縮放級別並刪除默認UI(即'+'/'-'),這有點矯枉過正。 – Alastair 2013-10-05 18:30:48
一個解決方案就像是,如果你知道具體的緯度/經度。
google.maps.event.addListener(map, 'idle', function() {
map.setCenter(new google.maps.LatLng(latitude, longitude));
map.setZoom(8);
});
如果沒有特定的緯度/經度
google.maps.event.addListener(map, 'idle', function() {
map.setCenter(map.getCenter());
map.setZoom(8);
});
或
google.maps.event.addListener(map, 'idle', function() {
var bounds = new google.maps.LatLngBounds();
map.setCenter(bounds.getCenter());
map.setZoom(8);
});
要限制在3.0版+變焦。 在您的地圖設置中添加默認縮放級別和minZoom或maxZoom(或兩者,如果需要) 縮放級別爲0到19. 如果需要限制,您必須聲明deafult縮放級別。都是區分大小寫的!
function initialize() {
var mapOptions = {
maxZoom:17,
minZoom:15,
zoom:15,
....
這可用於將地圖重新居中到特定位置。這是我需要的。
var MapBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(35.676263, 13.949096),
new google.maps.LatLng(36.204391, 14.89038));
google.maps.event.addListener(GoogleMap, 'dragend', function()
{
if (MapBounds.contains(GoogleMap.getCenter()))
{
return;
}
else
{
GoogleMap.setCenter(new google.maps.LatLng(35.920242, 14.428825));
}
});
myOptions = {
center: myLatlng,
minZoom: 6,
maxZoom: 9,
styles: customStyles,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
這不回答這個問題。 – 2015-10-14 01:27:06
作爲中間2016,有限制可視區域沒有官方途徑。大多數限制界限的臨時解決方案都存在缺陷,因爲它們不會嚴格限制界限以適應地圖視圖,而只是在地圖中心超出指定界限時纔會限制界限。如果你想限制的範圍,以覆蓋圖像像我這樣的,這可能會導致行爲像如下圖所示,在墊層圖是我們的圖像疊加下可見:
爲了解決這個問題,我有創建了一個library,它成功地限制了界限,因此您無法移出覆蓋圖。
但是,作爲其他現有的解決方案,它有一個「振動」的問題。當用戶足夠積極地平鋪地圖時,在釋放鼠標左鍵後,地圖仍然繼續自行平移,逐漸放緩。我總是將地圖返回到邊界,但這會導致一些震動。此平移效果目前無法用Js API提供的任何方式停止。看來,直到谷歌增加了像map.stopPanningAnimation()的支持,我們將無法創造一個流暢的體驗。
例使用上述庫,最流暢的嚴格界限的經驗,我能得到:
function initialise(){
var myOptions = {
zoom: 5,
center: new google.maps.LatLng(0,0),
mapTypeId: google.maps.MapTypeId.ROADMAP,
};
var map = new google.maps.Map(document.getElementById('map'), myOptions);
addStrictBoundsImage(map);
}
function addStrictBoundsImage(map){
\t var bounds = new google.maps.LatLngBounds(
\t \t new google.maps.LatLng(62.281819, -150.287132),
\t \t new google.maps.LatLng(62.400471, -150.005608));
\t var image_src = 'https://developers.google.com/maps/documentation/' +
\t \t 'javascript/examples/full/images/talkeetna.png';
\t var strict_bounds_image = new StrictBoundsImage(bounds, image_src, map);
}
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("maps", "3",{other_params:"sensor=false"});
</script>
<body style="margin:0px; padding:0px;" onload="initialise()">
\t <div id="map" style="height:400px; width:500px;"></div>
<script type="text/javascript"src="https://raw.githubusercontent.com/matej-pavla/StrictBoundsImage/master/StrictBoundsImage.js"></script>
</body>
該庫還能夠自動計算最小縮放制約。然後使用minZoom
映射的屬性限制縮放級別。
希望這可以幫助那些想要解決方案的人完全尊重給定的界限,並且不想讓他們擺脫困境。
該決定看起來不乾淨。爲什麼'if(x maxX)x = maxX;'不排除對方?爲什麼您將畫布放在minX/maxX和maxX/maxY座標上,儘管它們不是中心的座標? –
2012-08-19 11:06:08
而不是'dragend'事件,您可以在地圖實例([工作示例](http://jsfiddle.net/32pc6f5v/))上使用'draggable:false') – machineaddict 2014-09-24 11:43:35
這不是使用「zoom_changed」事件的好技術限制用戶。因爲第一次它總是會超出最低等級,然後使用你的代碼,所以你再次設置最小縮放,這將使屏幕變得更加簡單。 – 2015-07-16 04:50:56