web-dev-qa-db-ja.com

経度と緯度から国または都市に変換する方法は?

経度と緯度の座標を国または都市のいずれかに変換する必要があります。Pythonでのこの例はありますか?

前もって感謝します!

24
godzilla

私はGoogleのAPIを使用しています。

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))

出力:

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

これは逆ジオコーディングと呼ばれます。 Pythonこれに焦点を当てたライブラリが1つあります: https://github.com/thampiman/reverse-geocoder

他のアイデアといくつかの関連する質問:

8
pfctdayelise

一般に、Google APIが最善のアプローチです。多数のエントリを処理する必要があり、APIが遅いため、私のケースには適していませんでした。

同じことをする小さなバージョンをコーディングしましたが、最初に巨大なジオメトリをダウンロードし、マシン上の国を計算しました。

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はAPIへのキーレスアクセスを廃止しました。 googleにアクセスしてキーを登録すると、1日あたり1,000クエリまで無料で取得できます。受け入れられた回答のコードは、このように変更する必要があります(コメントを追加できない、担当者が不十分)。

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