7 Réponses :


19
votes

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


4 commentaires

J'ai utilisé cela et ça marche génial. À votre santé!


Qu'est-ce que autorisé 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.



4
votes

Ce script obtient les limites initiales ( autorisés ) et limitez les limites sur glisser et zoom_changed . De plus, le zoom est limité sur <7.

 XXX                                  

1 commentaires

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.



1
votes

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. XXX


0 commentaires

0
votes
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);
                    }
             }

0 commentaires

0
votes

pls check this Google Maps API V3: Puis-je metzoom Après Fitbounds?

Carte.fitbounds (MAPBONDS);


0 commentaires

0
votes

@sairafi et @devin

Merci pour vos deux réponses. Je pourrais pas strud> pour que cela fonctionne pour travailler en chrome / Windows 7 parce que les .comtains () Vérifiez Evlauté à la fois vrai et faux dès que vous avez frappé la limite. P>

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));
        } 
    }


0 commentaires

6
votes

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);
}); 


0 commentaires