Étant donné les coordonnées lat/long, Comment Pouvons-nous trouver la ville/le pays?

par exemple si nous avons cet ensemble de coordonnées

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

Comment trouver la ville / le pays?

112
demandé sur ming yeow 2011-05-28 05:17:51

12 réponses

La libre Google API de Géocodage fournit ce service via un HTTP API REST. Remarque, L'API est utilisation et le taux limité , mais vous pouvez payer pour l'accès illimité.

essayez ce lien pour voir un exemple de la sortie (c'est dans json, la sortie est aussi disponible en XML)

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

84
répondu Kevin 2017-11-28 03:56:39

une autre option:

  • Téléchargez la base de données des villes de http://download.geonames.org/export/dump /
  • ajouter chaque ville en tant que lat / long -> cartographie de la ville à un indice spatial tel Qu'un arbre R (certains DBs ont également la 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 sera disponible
  • Très rapide (facilement fait des milliers de recherches par seconde)

inconvénients:

  • Pas automatiquement à jour
  • nécessite un code supplémentaire si vous voulez distinguer le cas où la ville la plus proche est des dizaines de miles de distance
  • peut donner des résultats bizarres près des pôles et de la ligne de date internationale (bien qu'il n'y ait pas de villes dans ces endroits de toute façon
138
répondu Michael Borgwardt 2014-06-24 18:48:21

Vous avez besoin de geopy

pip install geopy

et ensuite:

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

print(location.address)

pour obtenir plus d'information:

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'}
24
répondu Farsheed 2016-08-09 11:19:28

je cherchais une fonctionnalité similaire et j'ai vu les données " http://download.geonames.org/export/dump / " partagé sur la réponse précédente (merci pour le partage, c'est une excellente source), et mis en œuvre un service basé sur les city1000.txt des données.

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

il est déployé sur OpenShift (RedHat Platform). Premier appel après une longue période d'inactivité peut prendre un certain temps, mais, habituellement, la performance est satisfaisante. N'hésitez pas à utiliser ce service comme vous le souhaitez...

Aussi, vous pouvez trouver la source du projet à https://github.com/turgos/Location .

20
répondu turgos 2018-01-17 07:04:41

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

17
répondu Rega 2016-01-03 01:38:09

j'ai passé environ 30min à essayer de trouver un exemple de code pour faire ceci en Javascript. Je ne pouvais pas trouver un moyen rapide de réponse claire à la question que vous avez posté. Si... J'ai fait mon propre. Espérons que les gens puissent utiliser ceci sans avoir à creuser dans L'API ou regarder le code qu'ils n'ont aucune idée comment lire. Ha si rien d'autre je peux faire référence à ce post pour mes propres trucs.. Bonne question et merci pour le forum de discussion!

cela 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
répondu Kai Husen 2014-01-21 19:14:49

j'ai utilisé Geocoder , une bonne bibliothèque Python qui prend en charge plusieurs fournisseurs, y compris Google, Geonames, et OpenStreetMaps, à ne mentionner que quelques . J'ai essayé D'utiliser la bibliothèque GeoPy, et il y a souvent des temps morts. Le développement de votre propre code pour GeoNames n'est pas la meilleure utilisation de votre temps et vous pourriez finir par obtenir le code unstable. Geocoder est très simple à utiliser dans mon expérience, et a assez bon documentation . Vous trouverez ci-dessous un exemple de code pour rechercher la ville par latitude et longitude, ou trouver la 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
répondu Ham Sam 2017-03-08 09:37:10

cela dépend vraiment des restrictions technologiques que vous avez.

Une façon est d'avoir une base de données spatiales avec le contour des pays et des villes qui vous intéressent. Par grandes lignes, je veux dire que les pays et les villes sont considérés comme le polygone de type spatial. Votre ensemble de coordonnées peut être converti en point de type spatial et interrogé en fonction des polygones pour obtenir le nom du pays/de la ville où le point est situé.

voici quelques-uns des bases de données qui supportent 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 pour cela, vous pouvez utiliser Yahoo GeoPlanet . Pour l'approche service, vous pourriez vouloir consulter this answer on gis.stackexchange.com , qui couvre la disponibilité des services pour résoudre votre problème.

3
répondu steenhulthin 2017-04-13 12:33:45

vous pouvez utiliser L'API Geocoding de Google

Soufflet est fonction php qui retourne Adresse, Ville, État et 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
répondu Nishad Up 2015-12-05 08:00:49

je sais que cette question est très ancienne, mais j'ai travaillé sur la même question et j'ai trouvé un paquet extrêmement efficace et pratique, reverse_geocoder , construit par Ajay Thampi. Le code est disponible ici . Il est basé sur une implémentation parallélisée des arbres K-D qui est 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 cette base de données, déjà surligné par @turgos.

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

1
répondu Giorgio Balestrieri 2017-10-25 17:38:55

veuillez cocher la réponse ci-dessous. Il travaille 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
répondu Summved Jain 2013-08-30 08:27:03

si vous utilisez L'API Places de Google, voici comment obtenir le pays et la ville à partir de l'objet place en utilisant 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
répondu vedo27 2016-10-03 19:27:39