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!
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')
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:
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
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))