161 votes

Étant donné les coordonnées lat/long, comment peut-on trouver la ville/le pays ?

Par exemple, si nous avons cet ensemble de coordonnées

"latitude": 48.858844300000001,
"longitude": 2.2943506,

Comment peut-on connaître la ville/pays ?

2 votes

Vous aurez probablement besoin d'une sorte de base de données. J'essaierais moi-même de jouer avec l'API de Google Maps... elle prend en charge la lat/long.

1 votes

185voto

Michael Borgwardt Points 181658

Une autre option :

  • Téléchargez la base de données des villes à partir de http://download.geonames.org/export/dump/
  • Ajouter chaque ville sous la forme d'une correspondance lat/long -> ville à un index spatial tel qu'un R-Tree (certaines bases de données ont également cette fonctionnalité).
  • Utiliser la recherche du plus proche voisin pour trouver la ville la plus proche pour un point donné.

Avantages :

  • Ne dépend pas de la disponibilité d'un serveur externe.
  • Très rapide (fait facilement des milliers de recherches par seconde)

Inconvénients :

  • Pas de mise à jour automatique
  • Nécessite un code supplémentaire si l'on veut distinguer le cas où la ville la plus proche se trouve à des dizaines de kilomètres.
  • Peut donner des résultats bizarres près des pôles et de la ligne internationale de changement de date (bien qu'il n'y ait pas de villes à ces endroits de toute façon).

6 votes

Cela donnera également des résultats bizarres pour les villes à l'intérieur des villes, par exemple certains endroits de Rome peuvent donner "Cité du Vatican" - en fonction de la lat/lon spécifiée dans la base de données pour chacun.

2 votes

Ils ont également une api REST et semble assez décent : api.geonames.org/

11 votes

Un exemple aurait été inestimable

109voto

Kevin Points 4419

Le libre API de géocodage Google fournit ce service via une API HTTP REST. Remarque : l'API est usage et taux limité mais vous pouvez payer pour un accès illimité.

Essayez ce lien pour voir un exemple de la sortie (ceci est en json, la sortie est aussi disponible en XML)

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

0 votes

J'accepte cette réponse parce que c'est celle que je finirai par choisir :) La réponse de Michael est certainement une bonne option !

5 votes

Le géocodage inversé de Google n'est autorisé que s'il est associé à une carte Google. Si vous souhaitez une solution qui n'a pas de telles restrictions (bien qu'elle soit commerciale et ne propose que des villes américaines), consultez : askgeo.com

0 votes

Mapquest api est une autre option ici, car elle n'a pas de limites de débit dans certains cas et des limites de débit très élevées pour divers besoins de géocodage.

5voto

Kai Husen Points 33

J'ai passé environ 30 minutes à essayer de trouver un exemple de code permettant de faire cela en Javascript. Je n'ai pas trouvé de réponse rapide et claire à la question que vous avez posée. Alors... j'ai fait le mien. J'espère que les gens pourront l'utiliser sans avoir à creuser dans l'API ou à regarder du code qu'ils n'ont aucune idée de comment lire. Ha si rien d'autre je peux référencer ce post pour mes propres trucs... Bonne question et merci pour le forum de discussion !

Il s'agit d'utiliser l'API de Google.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>

.

//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        //GET USER CURRENT LOCATION
        var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

        //CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
        var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
                var locItemCount = results.length;
                var locCountryNameCount = locItemCount - 1;
                var locCountryName = results[locCountryNameCount].formatted_address;

                if (locCountryName == "Australia") {
                    //SET COOKIE FOR GIVING
                    jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' }); 
                }
        });
    }
}

3voto

steenhulthin Points 1360

Cela dépend vraiment des restrictions technologiques dont vous disposez.

L'une des solutions consiste à disposer d'une base de données spatiale contenant les contours des pays et des villes qui vous intéressent. Par contour, j'entends que les pays et les villes sont stockés sous forme de polygones de type spatial. Votre jeu de coordonnées peut être converti en point de type spatial et interrogé sur les polygones pour obtenir le nom du pays ou de la ville où se trouve le point.

Voici quelques-unes des bases de données qui prennent en charge le type spatial : SQL server 2008 , MySQL , postGIS - une extension de postgreSQL et Oracle .

Si vous souhaitez utiliser un service au lieu d'avoir votre propre base de données, vous pouvez utiliser le service de Yahoo. GeoPlanet . Pour l'approche par les services, vous pouvez consulter les sites suivants ce réponse sur gis.stackexchange.com qui couvre la disponibilité des services pour résoudre votre problème.

0voto

Summved Jain Points 29

Veuillez vérifier la réponse ci-dessous. Cela fonctionne pour moi

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){

        initialize(position.coords.latitude,position.coords.longitude);
    }); 
}

function initialize(lat,lng) {
    //directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    //directionsService = new google.maps.DirectionsService();
    var latlng = new google.maps.LatLng(lat, lng);

    //alert(latlng);
    getLocation(latlng);
}

function getLocation(latlng){

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                    alert("location is::"+loc);
                }
            }
        });

}

function getCountry(results)
{
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                return shortname;
            }
            else
            {
                return longname;
            }
        }
    }

}

function isNullOrWhitespace(text) {
    if (text == null) {
        return true;
    }
    return text.replace(/\s/gi, '').length < 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