Как вернуть отдельные компоненты адреса (город, штат и т. Д.) Из геокодера GeoPy?

10

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

GeoPy возвращает строку с адресом - но я не могу найти надежный способ отделить каждый компонент. Например:

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

API геокодирования Google возвращает эти отдельные компоненты ... есть ли способ получить их от GeoPy? (или другой инструмент геокодирования?)

Lubar
источник

Ответы:

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 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, поэтому вам не нужно вручную объединять их, если они вам нужны.

Matt
источник
Еще один апи может быть 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
Я должен понизить это не потому, что намерение не является хорошим, а потому, что нет абсолютно никакой гарантии, что компоненты адреса разделены запятой. Смотрите этот вопрос в Stack Overflow о разборе однострочных адресов в компонентах. Хотя GeoPy может возвращать определенный формат, стандартные адреса не имеют запятых.
Мэтт
@ Мэтт, это мое решение. может быть, это не может решить его проблему, но может помочь ему найти хороший путь для хорошего решения ... это полностью его решение ... я вижу, у вас есть решение, только напишите это здесь ... кроме этого вам не нужно пиши когда ты голосуешь, все зависит только от тебя .. Наша помощь ничем другим не поможет. удачи тебе ..
Арагон
2
Когда я нажал кнопку «Вниз», он предложил оставить комментарий, чтобы улучшить ответ, и я сделал это. Я не хотел подразумевать, что ваш ответ бесполезен или не принадлежит здесь; это, безусловно, добавляет ценность для сообщества! Это простое решение, которое другие, вероятно, пропустят для подобных проблем. Я уверен, что другие найдут это полезным.
Мэтт
просто комментировать здесь - хороший ответ на вопрос. одним из способов обеспечения качества этого ответа было бы регулярное выражение для определения конкретной длины чисел в строке - как ожидается для почтового индекса. только мой 2с.
Джейсон м