Як повернути окремі компоненти адреси (місто, штат тощо) з геокодера GeoPy?


10

Я використовую GeoPy для геокодування адрес до lat, lng. Я також хотів би витягти деталізовані компоненти адреси (вулиця, місто, штат, поштовий індекс) для кожної адреси.

GeoPy повертає рядок з адресою - але я не можу знайти надійний спосіб розділити кожен компонент. Наприклад:

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

API геокодування Google повертає ці окремі компоненти ... Чи є спосіб отримати їх від GeoPy? (чи інший інструмент геокодування?)

Відповіді:


8

Любаре, я бачив вашу публікацію в Stack Overflow, але збираюся опублікувати аналогічну відповідь тут для послідовності. Це гарне запитання. Я працюю в галузі перевірки адрес і раніше вирішував вашу проблему.

Я зв'язав це запитання щодо переповнення стека у коментарі; і важливо знати, що насправді немає гарантій щодо формату повних адрес вулиць безкоштовно. Як згадується у пов’язаному дописі, повні адреси можуть мати вигляд будь-якого з них:

1) 102 головна вулиця Anytown, штат

2) 400n 600e # 2, 52173

3) по # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Причини пояснюються у зв’язаному дописі.) Я розумію, що GeoPy повертає адреси у певному форматі - залежно від використовуваного геокодера (який формат виходить поза контролем GeoPy), але адреси можуть шукати всілякі способи в певному режимі компонента (наприклад, що має коми), і важливо знати, що в стандартизованих адресах немає коми (відповідно до USPS Publication 28).

Я допоміг працювати над API, недавно званий LiveAddress ; він був просто модернізований для підтримки геокодування та однорядного розбору адрес.

GeoPy призначений для геокодування, а не для розбору компонентів (це завдання насправді дуже складне з причин, я сюди не потрапляю). LiveAddress буде , однак, компонентізація адреси і повернути координати та іншу інформацію про адресу, і тільки якщо адреси реальні; жодних "здогадалися" результатів.

Щоб розібрати однорядну адресу на компоненти за допомогою Python, просто покладіть всю адресу в поле "вулиця":

import json
import pprint
import urllib

LOCATION = 'https://api.smartystreets.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, тому вам не доведеться об'єднувати їх вручну, якщо вони вам потрібні.


Ще один апі може бути address-parser.net/try.php
SIslam

3

не важко написати свій файл json.

import json

result = '123 Main Street, Los Angeles, CA, 90034, USA'

sp = result.split(',')
dumpJson = json.dumps({'street':sp[0], 'city': sp[1], 'state': sp[2], 
                      'zip': sp[3], 'country': sp[4]})


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

я сподіваюся, що це допоможе тобі ...


1
Я маю спростувати це не тому, що наміри не є хорошими, а тому, що немає абсолютно ніякої гарантії, що компоненти адреси розміщені комою. Дивіться це запитання у «Переповнюванні стека» щодо розбору однорядних адрес на компоненти. Хоча GeoPy може повертати певний формат, стандартизовані адреси не мають коми.
Метт

@Matt це моє рішення. можливо, це не може вирішити його проблему, але може допомогти йому знайти хороший шлях для хорошого рішення .. це повністю залежить від нього ... я бачу, у вас є рішення, напишіть його тут ... поряд з цим вам не потрібно пишіть, коли ви зволікаєте, все залежить від вас. Наші не є чим іншим допомогти. удачі вам ..
Арагон

2
Коли я натиснув кнопку "Вниз", він запропонував залишити коментар, щоб допомогти покращити відповідь, і я це зробив. Я не мав на увазі, що ваша відповідь не корисна або не належить тут; це, безумовно, додає цінності громаді! Це просте рішення, яке інші, ймовірно, не помітять за подібні проблеми. Я впевнений, що інші знайдуть це корисним.
Метт

просто прокоментувати тут - хороша відповідь на запитання. способом забезпечення якості цієї відповіді буде регулярний вираз для визначення конкретної довжини чисел підряд - як це очікується для поштового індексу. просто мій 2с.
jason m
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.