web-dev-qa-db-fra.com

comment convertir la longitude et la latitude en pays ou ville?

J'ai besoin de convertir les coordonnées de longitude et de latitude en pays ou en ville, y a-t-il un exemple de cela en python?

merci d'avance!

24
godzilla

J'utilise l'API de Google.

from urllib2 import urlopen
import json
def getplace(lat, lon):
    url = "http://maps.googleapis.com/maps/api/geocode/json?"
    url += "latlng=%s,%s&sensor=false" % (lat, lon)
    v = urlopen(url).read()
    j = json.loads(v)
    components = j['results'][0]['address_components']
    country = town = None
    for c in components:
        if "country" in c['types']:
            country = c['long_name']
        if "postal_town" in c['types']:
            town = c['long_name']
    return town, country


print(getplace(51.1, 0.1))
print(getplace(51.2, 0.1))
print(getplace(51.3, 0.1))

Sortie:

(u'Hartfield', u'United Kingdom')
(u'Edenbridge', u'United Kingdom')
(u'Sevenoaks', u'United Kingdom')
29
Holy Mackerel

C'est ce qu'on appelle le géocodage inversé. Il y a une bibliothèque que j'ai pu trouver dans Python qui se concentre sur ceci: https://github.com/thampiman/reverse-geocoder

Quelques questions connexes avec d'autres idées:

8
pfctdayelise

En général, l'API Google est la meilleure approche. Il ne convenait pas à mon cas car j'ai dû traiter beaucoup d'entrées et l'api est lent.

J'ai codé une petite version qui fait la même chose mais télécharge d'abord une énorme géométrie et calcule les pays sur la machine.

import requests

from shapely.geometry import mapping, shape
from shapely.prepared import prep
from shapely.geometry import Point


data = requests.get("https://raw.githubusercontent.com/datasets/geo-countries/master/data/countries.geojson").json()

countries = {}
for feature in data["features"]:
    geom = feature["geometry"]
    country = feature["properties"]["ADMIN"]
    countries[country] = prep(shape(geom))

print(len(countries))

def get_country(lon, lat):
    point = Point(lon, lat)
    for country, geom in countries.iteritems():
        if geom.contains(point):
            return country

    return "unknown"

print(get_country(10.0, 47.0))
# Austria
6
linqu

Google a depuis déprécié l'accès sans clé à son API. Rendez-vous sur Google et inscrivez-vous pour une clé, vous obtenez ~ 1000 requêtes gratuites par jour. Le code dans la réponse acceptée doit être modifié comme ceci (impossible d'ajouter un commentaire, pas assez de répétition).

from urllib.request import urlopen
import json

def getplace(lat, lon):
    key = "yourkeyhere"
    url = "https://maps.googleapis.com/maps/api/geocode/json?"
    url += "latlng=%s,%s&sensor=false&key=%s" % (lat, lon, key)
    v = urlopen(url).read()
    j = json.loads(v)
    components = j['results'][0]['address_components']
    country = town = None
    for c in components:
        if "country" in c['types']:
            country = c['long_name']
        if "postal_town" in c['types']:
            town = c['long_name']

    return town, country

print(getplace(51.1, 0.1))
print(getplace(51.2, 0.1))
print(getplace(51.3, 0.1))
6
tibernut