10

GeoPy を使用して住所を緯度経度にジオコーディングしています。また、各住所の項目別の住所コンポーネント (番地、都市、州、郵便番号) を抽出したいと考えています。

GeoPy はアドレスを含む文字列を返しますが、各コンポーネントを分離する信頼できる方法が見つかりません。例えば:

123 Main Street, Los Angeles, CA 90034, USA =>
{street: '123 Main Street', city: 'Los Angeles', state: 'CA', zip: 90034, country: 'USA'}

Google ジオコーディング API はこれらの個々のコンポーネントを返します... GeoPy からこれらを取得する方法はありますか? (または別のジオコーディング ツール?)

4

4 に答える 4

26

Nominatim()ジオコーダー (geopy の標準的なオープン ソース ジオコーダー)から個々の住所コンポーネントを取得することもできます。

from geopy.geocoders import Nominatim

# address is a String e.g. 'Berlin, Germany'
# addressdetails=True does the magic and gives you also the details
location = geolocator.geocode(address, addressdetails=True)

print(location.raw)

与える

{'type': 'house',
 'class': 'place',
 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright',
 'display_name': '2, Stralauer Allee, Fhain, Friedrichshain-Kreuzberg, Berlin, 10245, Deutschland',
 'place_id': '35120946',
 'osm_id': '2825035484',
 'lon': '13.4489063',
 'osm_type': 'node',
 'address': {'country_code': 'de',
             'road': 'Stralauer Allee',
             'postcode': '10245',
             'house_number': '2',
             'state': 'Berlin',
             'country': 'Deutschland',
             'suburb': 'Fhain',
             'city_district': 'Friedrichshain-Kreuzberg'},
 'lat': '52.5018003',
 'importance': 0.421,
 'boundingbox': ['52.5017503', '52.5018503', '13.4488563', '13.4489563']}

location.raw['address']

コンポーネントのみのディクショナリを取得します。

その他のパラメーターについては geopy のドキュメントをすべてのアドレス コンポーネントについては Nomintimを参照してください。

于 2016-11-07T22:59:24.970 に答える
2

結果のアドレスを常に同じ形式にしたかったので、これがそのような分割を実装した方法です。連結をスキップして各値を再実行する必要があります...またはリストに入れます。君による。

 def getaddress(self, lat, lng, language="en"):
        try:
            geolocator = Nominatim()
            string = str(lat) + ', ' +str(lng)
            location = geolocator.reverse(string, language=language)
            data = location.raw
            data = data['address']
            address = str(data)

            street = district = postalCode= state = country = countryCode = ""

            district    =str(data['city_district'])
            postalCode  =str(data['postcode'])
            state       =str(data['state'])
            country     =str(data['country'])
            countryCode =str(data['country_code']).upper()
            address = street +' '+ district  +' '+  postalCode  +' '+  state  +' '+  country  +' '+  countryCode
        except:
            address="Error"
        return str(address.decode('utf8'))
于 2017-06-07T09:42:53.197 に答える
1

私は少し前にLiveAddressと呼ばれるものを書くのを手伝いました。単一行 (自由形式) の住所をサポートし、ジオコーディング機能を実装するようにアップグレードされました。

GeoPy はジオコーディング ユーティリティであり、住所パーサー/標準化ツールではありません。ただし、 LiveAddress API、不足している情報を入力して、アドレスの有効性を検証することもできます。Google や Yahoo などのサービスは住所を概算しますが、LiveAddress などの CASS 認定サービスは実際に住所を検証し、住所が本物でない限り結果を返しません。

LiveAddress の実装に関して多くの調査と開発を行った後、このスタック オーバーフローの投稿 に要約を書きました。これは、住所が入ってきて、最終的に解析の問題 (米国の住所の場合) の解決策につながる可能性がある、クレイジーでありながら完全な形式のいくつかを文書化したものです。

Python を使用して 1 行の住所をコンポーネントに解析するには、住所全体を「street」フィールドに入力するだけです。

import json
import pprint
import urllib

LOCATION = 'https://api.qualifiedaddress.com/street-address/'
QUERY_STRING = urllib.urlencode({ # entire query sting must be URL-Encoded
    'auth-token': r'YOUR_API_KEY_HERE',
    'street': '1 infinite loop cupertino ca 95014'
})
URL = LOCATION + '?' + QUERY_STRING

response = urllib.urlopen(URL).read()
structure = json.loads(response)
pprint.pprint(structure)

結果の JSON オブジェクトには、次のcomponentsようなオブジェクトが含まれます。

"components": {
        "primary_number": "1",
        "street_name": "Infinite",
        "street_suffix": "Loop",
        "city_name": "Cupertino",
        "state_abbreviation": "CA",
        "zipcode": "95014",
        "plus4_code": "2083",
        "delivery_point": "01",
        "delivery_point_check_digit": "7"
}

応答には first_line と delivery_line_2 の組み合わせも含まれるため、必要な場合にそれらを手動で連結する必要はありません。住所の緯度経度などの情報も表示されます。

于 2012-07-09T12:40:33.693 に答える