2010-02-15 3 views
35

Y a-t-il un réglage automatique du niveau de zoom en fonction de la taille du pays sur lequel la carte a été centrée? Maps.google.com fait exactement ce dont j'ai besoin, ainsi, par exemple, si je recherche la Russie, j'obtiens un niveau de zoom tel que la Russie est juste à l'écran, et quand je cherche Cuba, j'obtiens un niveau de zoom plus élevé alors que Cuba correspond juste.Comment obtenir l'API Google Maps pour définir le niveau de zoom correct pour un pays?

Y a-t-il un moyen de donner à l'API Maps un emplacement dans un pays et d'obtenir un niveau de zoom approprié.

Sinon, je suppose que je devrais manuellement (pouah!) Créer ma propre table pour cette information. Ou cette information est-elle disponible gratuitement quelque part?

Répondre

45

Pour API v3, vérifiez la réponse ci-dessous.

Vous pouvez utiliser Google Maps Client-side Geocoder pour obtenir la zone de délimitation du pays, comme dans l'exemple suivant:

// API version 2 
var geocoder = new GClientGeocoder(); 

geocoder.getLocations("Russia", function (locations) { 

    var north = locations.Placemark[0].ExtendedData.LatLonBox.north; 
    var south = locations.Placemark[0].ExtendedData.LatLonBox.south; 
    var east = locations.Placemark[0].ExtendedData.LatLonBox.east; 
    var west = locations.Placemark[0].ExtendedData.LatLonBox.west; 

    var bounds = new GLatLngBounds(new GLatLng(south, west), 
            new GLatLng(north, east)); 

    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)); 
}); 

// API version 3 
// ... set north, south, east and west ... 
var bounds = new google.maps.LatLngBounds(new google.maps.LatLng(south, west), 
              new google.maps.LatLng(north, east)); 
map.fitBounds(bounds); 

Les captures d'écran ci-dessous montrent les résultats de la technique ci-dessus lors de la recherche pour la Russie et Cuba:

Zoom on Russia and Cuba

+2

Excellent, c'était parfait merci. Je travaille dans GWT et il ne peut pas encore accéder à ExtendedData, j'ai donc dû créer des méthodes JSNI pour le faire. Une chose qui m'a un peu arraché: assurez-vous que la carte est visible lorsque vous appelez getBoundsZoomLevel, sinon elle renvoie un niveau de zoom nul. – krishnaz

+0

@krishnaz: Bon travail. Merci d'avoir partagé le conseil 'getBoundsZoomLevel()'. –

+2

+1 Quel âge nous habitons ........ –

3

Si vous n'utilisez google maps api et juste utiliser leur géocodage vous pouvez utiliser cette formule:

var url = 'http://maps.google.com/maps/geo?q=YOUR_QUERY&output=json&oe=utf8&sensor=false&key=YOUR_KEYback=geoCodeDone'; 
jQuery.getScript(url); 


function geoCodeDone(data) 
{ 
    if (data.Status.code == 200) 
    { 
     lng = data.Placemark[0].Point.coordinates[0]; 
     lat = data.Placemark[0].Point.coordinates[1]; 

     var east = data.Placemark[0].ExtendedData.LatLonBox.east; 
     var west = data.Placemark[0].ExtendedData.LatLonBox.west; 

     var zoom = 11 - Math.round(Math.log(Math.abs(west-east))/Math.log(2)); 
    } 
} 
49

Pour V3 ce code a fonctionné pour moi:

var geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     map.setCenter(results[0].geometry.location); 
     map.fitBounds(results[0].geometry.viewport); 
     } 
    }); 
+2

A travaillé parfaitement. Merci d'avoir ajouté la version mise à jour pour V3. Très appréciée. –

+2

Génial. Fonctionne avec n'importe quel endroit. Villes, provinces, pays etc. – Phius

+0

Les arguments de 'setCenter' et' fitBounds' sont-ils corrects? Je n'arrive pas à faire fonctionner ça, j'ai une erreur JS disant "trop ​​de récursion" - 'map.setCenter (lat, lon);' fonctionne. –

1

Si vous ne souhaitez pas utiliser le client de géocodage de Google, en raison des limitations d'utilisation, vous pouvez utiliser votre propre liste. Vous pouvez en obtenir un à partir de ce github repo.

Voici un exemple de code utilisant la fonction getJSON jQuery et Google Maps API v3:

function initialize() { 
     // read the list of countries 
    $.getJSON('countries.json', function (countries) { 

     // will use the country with index 40 (Cyprus) 
     var index_country = 40; 
     var myOptions = { 
      center: new google.maps.LatLng(
       countries[index_country].center_lat, 
       countries[index_country].center_lng), 
     } 
     var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

     // set the bounds of the map 
     var bounds = new google.maps.LatLngBounds(
      new google.maps.LatLng(countries[index_country].sw_lat, countries[index_country].sw_lng), 
      new google.maps.LatLng(countries[index_country].ne_lat, countries[index_country].ne_lng)); 

     map.fitBounds(bounds); 
    }); 
} 
Questions connexes