121 votes

Google Maps: comment attribuer une valeur de latitude / longitude à un pays, à un état, à une province ou à une région?

J'ai besoin d'une liste de pays, d'états et de villes basée sur un ensemble de valeurs lat / long que j'ai. Je dois stocker ces informations de manière à préserver la hiérarchie et à éviter les doublons (par exemple, "USA", "États-Unis" et "États-Unis d'Amérique" sont le même pays; je ne veux qu'une instance de ce pays dans ma base de données). .

Est-ce possible de le faire avec Google Map API?

143voto

Daniel Vassallo Points 142049

Ce que vous cherchez s'appelle le géocodage inversé. Google fournit un serveur-côté géocodage inversé service par le biais de Google API de Géocodage, vous devriez être en mesure d'utiliser pour votre projet.

C'est de cette manière une réponse à la requête suivante:

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false

Réponse:

{
  "status": "OK",
  "results": [ {
    "types": [ "street_address" ],
    "formatted_address": "275-291 Bedford Ave, Brooklyn, NY 11211, USA",
    "address_components": [ {
      "long_name": "275-291",
      "short_name": "275-291",
      "types": [ "street_number" ]
    }, {
      "long_name": "Bedford Ave",
      "short_name": "Bedford Ave",
      "types": [ "route" ]
    }, {
      "long_name": "New York",
      "short_name": "New York",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "Brooklyn",
      "short_name": "Brooklyn",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Kings",
      "short_name": "Kings",
      "types": [ "administrative_area_level_2", "political" ]
    }, {
      "long_name": "New York",
      "short_name": "NY",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "11211",
      "short_name": "11211",
      "types": [ "postal_code" ]
    } ],
    "geometry": {
      "location": {
        "lat": 40.7142298,
        "lng": -73.9614669
      },
      "location_type": "RANGE_INTERPOLATED",
      "viewport": {
        "southwest": {
          "lat": 40.7110822,
          "lng": -73.9646145
        },
        "northeast": {
          "lat": 40.7173774,
          "lng": -73.9583193
        }
      }
    }
  },

  ... Additional results[] ...

Vous pouvez aussi choisir de recevoir la réponse en xml au lieu de json, par simple substitution d'json xml dans l'URI de la demande:

http://maps.googleapis.com/maps/api/geocode/xml?latlng=40.714224,-73.961452&sensor=false

Pour autant que je sais, Google est également de retour le même nom pour adresse composants, en particulier pour le haut niveau des noms comme noms de pays et les noms de ville. Néanmoins, gardez à l'esprit que, bien que les résultats sont très précis pour la plupart des applications, vous pouvez toujours trouver les occasionnels faute d'orthographe ou un résultat ambigu.

23voto

tabacitu Points 313

Vous avez une base de réponse ici: Géolocalisation HTML5, le plus simple pour obtenir le nom de la ville?

Mais pour ce que vous cherchez, je vous recommande cette manière.

Seulement si vous avez aussi besoin de administrative_area_level_1,pour stocker des choses différentes pour Paris, Texas, états-unis et à Paris, en Ile-de-France, de la France et de fournir un manuel de secours:

--

Il y a un problème dans Michal, en ce qu'elle prend le premier résultat, pas un en particulier. Il utilise les résultats de[0]. Comme je l'entends (j'ai juste modifié son code) est de ne prendre que le résultat dont le type est "localité", qui est toujours présente, même dans un éventuel manuel de secours dans le cas où le navigateur ne prend pas en charge la géolocalisation.

Sa façon: extraites résultats sont différents de l'aide http://maps.googleapis.com/maps/api/geocode/json?address=bucharest&sensor=false que de l'aide http://maps.googleapis.com/maps/api/geocode/json?latlng=44.42514,26.10540&sensor=false (recherche par nom / recherche par lat&gnl)

De cette façon: même récupéré les résultats.

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Reverse Geocoding</title> 

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 
  var geocoder;

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(successFunction, errorFunction);
} 
//Get the latitude and the longitude;
function successFunction(position) {
    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
    codeLatLng(lat, lng)
}

function errorFunction(){
    alert("Geocoder failed");
}

  function initialize() {
    geocoder = new google.maps.Geocoder();



  }

  function codeLatLng(lat, lng) {

    var latlng = new google.maps.LatLng(lat, lng);
    geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
      //console.log(results);
        if (results[1]) {
        var indice=0;
        for (var j=0; j<results.length; j++)
        {
            if (results[j].types[0]=='locality')
                {
                    indice=j;
                    break;
                }
            }
        alert('The good number is: '+j);
        console.log(results[j]);
        for (var i=0; i<results[j].address_components.length; i++)
            {
                if (results[j].address_components[i].types[0] == "locality") {
                        //this is the object you are looking for
                        city = results[j].address_components[i];
                    }
                if (results[j].address_components[i].types[0] == "administrative_area_level_1") {
                        //this is the object you are looking for
                        region = results[j].address_components[i];
                    }
                if (results[j].address_components[i].types[0] == "country") {
                        //this is the object you are looking for
                        country = results[j].address_components[i];
                    }
            }

            //city data
            alert(city.long_name + " || " + region.long_name + " || " + country.short_name)


            } else {
              alert("No results found");
            }
        //}
      } else {
        alert("Geocoder failed due to: " + status);
      }
    });
  }
</script> 
</head> 
<body onload="initialize()"> 

</body> 
</html> 

6voto

mkoryak Points 18135

J'ai utilisé cette question comme un point de départ de ma propre solution. Pensé qu'il était approprié de contribuer à mon code de retour depuis sa plus petite que tabacitu de l'

Dépendances:

Code:

if(geoPosition.init()){  

    var foundLocation = function(city, state, country, lat, lon){
        //do stuff with your location! any of the first 3 args may be null
        console.log(arguments);
    }

    var geocoder = new google.maps.Geocoder(); 
    geoPosition.getCurrentPosition(function(r){
        var findResult = function(results, name){
            var result =  _.find(results, function(obj){
                return obj.types[0] == name && obj.types[1] == "political";
            });
            return result ? result.short_name : null;
        };
        geocoder.geocode({'latLng': new google.maps.LatLng(r.coords.latitude, r.coords.longitude)}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK && results.length) {
                results = results[0].address_components;
                var city = findResult(results, "locality");
                var state = findResult(results, "administrative_area_level_1");
                var country = findResult(results, "country");
                foundLocation(city, state, country, r.coords.latitude, r.coords.longitude);
            } else {
                foundLocation(null, null, null, r.coords.latitude, r.coords.longitude);
            }
        });
    }, { enableHighAccuracy:false, maximumAge: 1000 * 60 * 1 });
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X