J'essaie de définir les limites où vous pouvez faire glisser la carte à l'aide de Google Maps API V3
Voici la solution pour v2 http://econym.org.uk/gmap/example_range.htm a> qui fonctionne assez bien. p>
Cependant, avec API V3, ce n'est pas si bon: lorsque vous utilisez la même fonction de bilomènes (), la carte se contracte lorsque vous atteignez la liaison tandis que Carte.SetCenter () modifie le centre de la carte. P>
Comment le réparer? Quelle est la solution pour API V3? P>
7 Réponses :
J'ai eu le même problème, mais cela devrait trier le sort (c'est la même fonction, l'événement à écouter est changé de "déplacer" ou "glisser" sur "Centre_changed", fonctionne comme un charme!: < Pré> xxx pré> p>
J'ai utilisé cela et ça marche génial. À votre santé!
Qu'est-ce que autorisé code> défini sur?
Authérité des choses est un objet Latlngbounds (essentiellement une paire de latitudes / longitudes) . Cela fonctionne vraiment bien BTW, fait exactement ce que cela devrait pour moi!
Cela ne prend pas en compte le niveau de zoom, afin que vous puissiez toujours aller bien en dehors d'une zone prévue.
Ce script obtient les limites initiales ( autorisés code>) et limitez les limites sur
glisser code> et
zoom_changed code>. De plus, le zoom est limité sur <7.
XXX PRE> P>
C'est la seule réponse que j'ai trouvée qui prend en compte les limites extérieures et pas seulement le centre. S'appuyant sur le centre seul vous permet de bien paniquer à l'extérieur d'une zone prévue en fonction du niveau de zoom.
merci @sairafi. Votre réponse m'a été très proche. J'avais une erreur dans laquelle Getbounds n'était pas défini, alors je l'ai enveloppé dans un autre auditeur pour vous assurer que la carte était entièrement chargée.
southWest = new google.maps.LatLng(48.59475380744011,22.247364044189453); northEast = new google.maps.LatLng(48.655344320891444,22.352420806884766); var limBound = new google.maps.LatLngBounds(southWest,northEast); var lastCenter; var option = {zoom:15, center: limBound.getCenter(), mapTypeId: google.maps.MapTypeId.ROADMAP}; var map = new google.maps.Map(document.getElementById('divMap'),option); google.maps.event.addListener(map,'zoom_changed', function() { minZoom(15); }); google.maps.event.addListener(map,'drag',function(e){ limitBound(limBound); }); function minZoom(minZoom){ if (map.getZoom()<minZoom) {map.setZoom(minZoom);} }; function limitBound(bound) { if (bound.getNorthEast().lat() > map.getBounds().getNorthEast().lat() && bound.getNorthEast().lng() > map.getBounds().getNorthEast().lng() && bound.getSouthWest().lat() < map.getBounds().getSouthWest().lat() && bound.getSouthWest().lng() < map.getBounds().getSouthWest().lng()) { lastCenter=map.getCenter(); $('#divText').text(lastCenter.toString()); } if (bound.contains(map.getCenter())) { map.setCenter(lastCenter); } }
pls check this Google Maps API V3: Puis-je metzoom Après Fitbounds? P>
Carte.fitbounds (MAPBONDS); P>
@sairafi et @devin
Merci pour vos deux réponses. Je pourrais donc j'ai changé Le SetCenter () en bas à PANTO () P> Le deuxième problème était que si vous établissez des limites sur la charge initiale, vous devez utiliser Google.maps.event.addlisteneronce (carte, 'Idle'. ..) événement sinon il conserve la réinitialisation des limites de la carte actuellement visible. p> Enfin, j'utilise l'événement Drag pour les centres de suivi, pour une raison quelconque qui a fonctionné plus en douceur. P> Le code résultant est-ce: p> google.maps.event.addListenerOnce(map,'idle',function() {
allowedBounds = map.getBounds();
});
google.maps.event.addListener(map,'drag',function() {
checkBounds();
});
function checkBounds() {
if(! allowedBounds.contains(map.getCenter()))
{
var C = map.getCenter();
var X = C.lng();
var Y = C.lat();
var AmaxX = allowedBounds.getNorthEast().lng();
var AmaxY = allowedBounds.getNorthEast().lat();
var AminX = allowedBounds.getSouthWest().lng();
var AminY = allowedBounds.getSouthWest().lat();
if (X < AminX) {X = AminX;}
if (X > AmaxX) {X = AmaxX;}
if (Y < AminY) {Y = AminY;}
if (Y > AmaxY) {Y = AmaxY;}
map.panTo(new google.maps.LatLng(Y,X));
}
}
Vous devrez peut-être également envisager des coordonnées d'emballage, la distorsion de la courbe et la centralisation des dimensions liées si la carte redimensionne ou zoomez dans / out. Ceci est particulièrement nécessaire si vos limites occupe un pourcentage important de la carte entière (par exemple, comme un continent).
L'un des problèmes avec les checkbounds () est que cela ne prend pas en compte que la plupart des valeurs de latitude aux pôles Nord / Sud, qui ont une distorsion non linéaire qui permet de limiter les limites précises (j'utilise des multiplicateurs de nombres magiques approximatifs qui ne fonctionneront pas dans toutes les situations). À droite, vous devriez d'abord convertir les limites en coordonnées du monde 2D linéaires pour voir à quel point les limites sont en termes de coordonnées mondiales, que de cartographier le point central cible actuel de la coordonnée mondiale à la position de la latitude réelle cible. Pour les valeurs de longitude, cela ne semble pas être une grande partie de la question et l'approche de coupure linéaire semble suffisamment précise, le problème principal est avec l'emballage des coordonnées de longitude qui sont comptabilisées (quelque peu) dans le code ci-dessous. P>
// Persitant variables var allowedBounds; // assign something here var lastValidCenter; // initialize this using map.getCenter() function checkBounds() { // when bounds changes due to resizing or zooming in/out var currentBounds = map.getBounds(); if (currentBounds == null) return; var allowed_ne_lng = allowedBounds.getNorthEast().lng(); var allowed_ne_lat = allowedBounds.getNorthEast().lat(); var allowed_sw_lng = allowedBounds.getSouthWest().lng(); var allowed_sw_lat = allowedBounds.getSouthWest().lat(); var wrap; var cc = map.getCenter(); var centerH = false; var centerV = false; // Check horizontal wraps and offsets if ( currentBounds.toSpan().lng() > allowedBounds.toSpan().lng() ) { centerH = true; } else { // test positive and negative wrap respectively wrap = currentBounds.getNorthEast().lng() < cc.lng(); var current_ne_lng = !wrap ? currentBounds.getNorthEast().lng() : allowed_ne_lng +(currentBounds.getNorthEast().lng() + 180 ) + (180 - allowed_ne_lng); wrap = currentBounds.getSouthWest().lng() > cc.lng(); var current_sw_lng = !wrap ? currentBounds.getSouthWest().lng() : allowed_sw_lng - (180-currentBounds.getSouthWest().lng()) - (allowed_sw_lng+180); } // Check vertical wraps and offsets if ( currentBounds.toSpan().lat() > allowedBounds.toSpan().lat() ) { centerV = true; } else { // test positive and negative wrap respectively wrap = currentBounds.getNorthEast().lat() < cc.lat(); if (wrap) { alert("WRAp detected top") } // else alert("no wrap:"+currentBounds); wrap = false; var current_ne_lat = !wrap ? currentBounds.getNorthEast().lat() : allowed_ne_lat + (currentBounds.getNorthEast().lat() +90) + (90 - allowed_ne_lat); wrap = currentBounds.getSouthWest().lat() > cc.lat(); if (wrap) { alert("WRAp detected btm") } //alert("no wrap:"+currentBounds); var current_sw_lat = !wrap ? currentBounds.getSouthWest().lat() : allowed_sw_lat - (90-currentBounds.getSouthWest().lat()) - (allowed_sw_lat+90); } // Finalise positions var centerX = cc.lng(); var centerY = cc.lat(); if (!centerH) { if (current_ne_lng > allowed_ne_lng) centerX -= current_ne_lng-allowed_ne_lng; if (current_sw_lng < allowed_sw_lng) centerX += allowed_sw_lng-current_sw_lng; } else { centerX = allowedBounds.getCenter().lng(); } if (!centerV) { if (current_ne_lat > allowed_ne_lat) { centerY -= (current_ne_lat-allowed_ne_lat) * 3; // approximation magic numbeer. Adjust as u see fit, or use a more accruate pixel measurement. } if (current_sw_lat < allowed_sw_lat) { centerY += (allowed_sw_lat-current_sw_lat)*2.8; // approximation magic number } } else { centerY = allowedBounds.getCenter().lat(); } map.setCenter(lastValidCenter = new google.maps.LatLng(centerY,centerX)); } function limitBound(bound) // Occurs during dragging, pass allowedBounds to this function in most cases. Requires persistant 'lastValidCenter=map.getCenter()' var reference. { var mapBounds = map.getBounds(); if ( mapBounds.getNorthEast().lng() >= mapBounds.getSouthWest().lng() && mapBounds.getNorthEast().lat() >= mapBounds.getSouthWest().lat() // ensure no left/right, top/bottom wrapping && bound.getNorthEast().lat() > mapBounds.getNorthEast().lat() // top && bound.getNorthEast().lng() > mapBounds.getNorthEast().lng() // right && bound.getSouthWest().lat() < mapBounds.getSouthWest().lat() // bottom && bound.getSouthWest().lng() < mapBounds.getSouthWest().lng()) // left { lastValidCenter=map.getCenter(); // valid case, set up new valid center location } // if (bound.contains(map.getCenter())) // { map.panTo(lastValidCenter); // } } // Google map listeners google.maps.event.addListener(map, 'zoom_changed', function() { //var zoom = map.getZoom(); checkBounds(); }); google.maps.event.addListener(map, "bounds_changed", function() { checkBounds(); }); google.maps.event.addListener(map, 'center_changed', function() { limitBound(allowedBounds); });