web-dev-qa-db-fra.com

Étant donné les coordonnées lat/long, comment pouvons-nous connaître la ville/le pays?

Par exemple, si nous avons ces coordonnées

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

Comment pouvons-nous trouver la ville/pays?

122
ming yeow

L'API gratuite Google Geocoding API fournit ce service via une API HTTP REST. Notez que l’API est usage et taux limités , mais vous pouvez payer pour un accès illimité.

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

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

86
Kevin

Une autre option:

  • Téléchargez la base de données des villes à partir de http://download.geonames.org/export/dump/
  • Ajoutez chaque ville en tant que latitude/longitude -> Cartographie de la ville à un index spatial tel qu'un arbre R (certaines bases de données ont également cette fonctionnalité)
  • Utilisez la recherche du plus proche voisin pour trouver la ville la plus proche pour un point donné

Avantages: 

  • Ne dépend pas d'un serveur externe pour être disponible
  • Très rapide (fait facilement des milliers de recherches par seconde)

Désavantages:

  • Pas automatiquement à jour
  • Nécessite un code supplémentaire si vous souhaitez distinguer le cas où la ville la plus proche est à des dizaines de kilomètres
  • Peut donner des résultats étranges près des pôles et de la ligne de date internationale (bien qu’il n’y ait aucune ville à ces endroits de toute façon
149
Michael Borgwardt

Vous avez besoin de geopy

pip install geopy

et alors:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

pour obtenir plus d'informations:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}
30
Farsheed

Je cherchais une fonctionnalité similaire et j'ai vu les données " http://download.geonames.org/export/dump/ " partagées dans une réponse précédente (merci du partage, c'est une excellente source) et mis en place un service basé sur les données cities1000.txt.

Vous pouvez le voir courir à _ { http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 } _(lien brisé) Il suffit de changer la latitude et la longitude pour vos emplacements.

Il est déployé sur OpenShift (RedHat Platform). Le premier appel après une longue période d'inactivité peut prendre un certain temps, mais les performances sont généralement satisfaisantes. N'hésitez pas à utiliser ce service comme bon vous semble ...

En outre, vous pouvez trouver la source du projet à l'adresse https://github.com/turgos/Location .

20
turgos

Une alternative Open Source est Nominatim d'Open Street Map. Tout ce que vous avez à faire est de définir les variables dans une URL et renvoie la ville/le pays de cet emplacement. Veuillez vérifier le lien suivant pour la documentation officielle: Nominatim

20
Rega

J'ai passé environ 30 minutes à essayer de trouver un exemple de code expliquant comment 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 à chercher dans l'API ou à regarder du code qu'ils ne savent pas lire. Ha si rien d’autre je ne peux citer ce post pour mes propres affaires. Belle question et merci pour le forum de discussion!

Ceci utilise l'API 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: '/' }); 
                }
        });
    }
}
5
Kai Husen

J'ai utilisé Geocoder , une bonne bibliothèque Python qui prend en charge plusieurs fournisseurs, notamment Google, Geonames et OpenStreetMaps, pour ne citer que quelques-uns . J'ai essayé d'utiliser la bibliothèque GeoPy et cela entraîne souvent des délais d'attente. Développer votre propre code pour GeoNames n’est pas la meilleure utilisation de votre temps et vous risquez d’avoir un code instable. D'après mon expérience, Geocoder est très simple à utiliser et contient assez de documentation . Vous trouverez ci-dessous un exemple de code permettant de rechercher une ville par latitude et longitude ou de rechercher une latitude/longitude par nom de ville.

import geocoder

g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton

g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084
5
Hamman Samuel

Cela dépend vraiment de vos restrictions technologiques. 

Une solution consiste à disposer d'une base de données spatiale avec le contour des pays et des villes qui vous intéressent. Par résumé, je veux dire que les pays et les villes sont stockés sous forme de polygone de type spatial. Votre ensemble de coordonnées peut être converti en point de type spatial et interrogé contre les polygones pour obtenir le nom du pays/de la ville où se trouve le point. 

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

Si vous souhaitez utiliser un service plutôt que de disposer de votre propre base de données, vous pouvez utiliser Yahoo GeoPlanet . Pour l’approche des services, vous pouvez consulter this answer sur gis.stackexchange.com , qui couvre la disponibilité des services permettant de résoudre votre problème. 

3
steenhulthin

Je sais que cette question est vraiment ancienne, mais j’ai travaillé sur le même problème et j’ai trouvé un paquet extrêmement efficace et pratique, reverse_geocoder, construit par Ajay Thampi . Le code est disponible ici . Il repose sur une implémentation parallélisée d'arbres K-D extrêmement efficace pour de grandes quantités de points (il m'a fallu quelques secondes pour obtenir 100 000 points.

Il est basé sur this database, déjà mis en évidence par @turgos.

Si votre tâche est de trouver rapidement le pays et la ville d’une liste de coordonnées, c’est un excellent outil.

2

Vous pouvez utiliser Google Geocoding API

Bellow est une fonction php qui renvoie l'adresse, la ville, l'état et le pays

public function get_location($latitude='', $longitude='')
{
    $geolocation = $latitude.','.$longitude;
    $request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false'; 
    $file_contents = file_get_contents($request);
    $json_decode = json_decode($file_contents);
    if(isset($json_decode->results[0])) {
        $response = array();
        foreach($json_decode->results[0]->address_components as $addressComponet) {
            if(in_array('political', $addressComponet->types)) {
                    $response[] = $addressComponet->long_name; 
            }
        }

        if(isset($response[0])){ $first  =  $response[0];  } else { $first  = 'null'; }
        if(isset($response[1])){ $second =  $response[1];  } else { $second = 'null'; } 
        if(isset($response[2])){ $third  =  $response[2];  } else { $third  = 'null'; }
        if(isset($response[3])){ $fourth =  $response[3];  } else { $fourth = 'null'; }
        if(isset($response[4])){ $fifth  =  $response[4];  } else { $fifth  = 'null'; }


        $loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
        if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $fourth;
            $loc['country'] = $fifth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null'  ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $third;
            $loc['country'] = $fourth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
            $loc['city'] = $first;
            $loc['state'] = $second;
            $loc['country'] = $third;
        }
        else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['state'] = $first;
            $loc['country'] = $second;
        }
        else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['country'] = $first;
        }
      }
      return $loc;
}
1
Nishad Up

Si vous utilisez l'API Google Sites, voici comment vous pouvez obtenir le pays et la ville de l'objet Lieu à l'aide de Javascript:

function getCityAndCountry(location) {
  var components = {};
  for(var i = 0; i < location.address_components.length; i++) {
    components[location.address_components[i].types[0]] = location.address_components[i].long_name;
  }

  if(!components['country']) {
    console.warn('Couldn\'t extract country');
    return false;
  }

  if(components['locality']) {
    return [components['locality'], components['country']];
  } else if(components['administrative_area_level_1']) {
    return [components['administrative_area_level_1'], components['country']];
  } else {
    console.warn('Couldn\'t extract city');
    return false;
  }
}
0
vedo27

Loc2country est un outil basé sur Golang qui renvoie le code de pays ISO alpha-3 pour les coordonnées de localisation données (lat/lon). Il répond en microsecondes. Il utilise une carte geohash to country. 

Les données geohash sont générées à l’aide de georaptor .

Nous utilisons geohash au niveau 6 pour cet outil, c’est-à-dire des boîtes de 1,2 km x 600 m.

0
Ashwin Nair

S'il vous plaît vérifier la réponse ci-dessous. Ça marche 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;
}
0
Summved Jain