Como retornar componentes de endereço individuais (cidade, estado etc.) do geocoder GeoPy?

10

Estou usando o GeoPy para geocodificar endereços para lat, lng. Também gostaria de extrair os componentes de endereço discriminados (rua, cidade, estado, CEP) para cada endereço.

O GeoPy retorna uma string com o endereço - mas não consigo encontrar uma maneira confiável de separar cada componente. Por exemplo:

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

A API de geocodificação do Google retorna esses componentes individuais ... existe uma maneira de obtê-los do GeoPy? (ou uma ferramenta de geocodificação diferente?)

lubar
fonte

Respostas:

8

Lubar, vi sua postagem no Stack Overflow, mas vou postar uma resposta semelhante aqui para garantir a consistência. É uma boa pergunta. Eu trabalho no setor de verificação de endereços e já lidei com seu tipo de problema antes.

Eu vinculei a esta questão do Stack Overflow em um comentário; e é importante saber que realmente não há garantia sobre o formato de endereços completos de forma livre. Conforme mencionado na postagem vinculada, os endereços completos podem se parecer com qualquer um destes:

1) 102 main street Anytown, estado

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(As razões são explicadas na postagem vinculada.) Percebo que o GeoPy retorna endereços em um determinado formato - dependendo do geocoder usado (cujo formato resultante está fora de controle do GeoPy), mas os endereços podem parecer de várias maneiras dentro de um certo componente (como vírgulas), e é importante saber que endereços padronizados não têm vírgulas (de acordo com a publicação 28 do USPS).

Ajudei a trabalhar em uma API recentemente chamada LiveAddress ; foi atualizado apenas para oferecer suporte à geocodificação e à análise de endereço de linha única.

O GeoPy foi projetado para geocodificar, não analisar componentes (essa tarefa é realmente muito difícil por razões que não abordarei aqui). LiveAddress vai , no entanto, inserir componentes o endereço e retornar coordenadas e outras informações sobre o endereço, e somente se os endereços são reais; nenhum resultado "adivinhado".

Para analisar um endereço de linha única em componentes usando Python, basta colocar o endereço inteiro no campo "rua":

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)

O objeto JSON resultante conterá um componentsobjeto que será algo parecido com isto:

"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"
}

A resposta também incluirá o first_line e delivery_line_2 combinados, para que você não precise concatená-los manualmente, se precisar deles.

Matt
fonte
Outra API pode ser address-parser.net/try.php
SIslam
3

não é difícil escrever o seu arquivo 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"}'

espero que ajude você ...

Aragão
fonte
1
Eu tenho que diminuir isso, não porque a intenção não seja boa, mas porque não há absolutamente nenhuma garantia de que os componentes de endereço sejam delimitados por vírgula. Veja esta pergunta no Stack Overflow sobre a análise de endereços de linha única em componentes. Embora o GeoPy possa retornar um determinado formato, os endereços padronizados não têm vírgulas.
Matt
@ Matt, esta é a minha solução. talvez isso não possa resolver o problema dele, mas possa ajudá-lo a encontrar um bom caminho para uma boa solução .. isso é completamente dele ... eu vejo que você tem uma solução, apenas escreva aqui ... ao lado disso, você não precisa escrever quando você votar, tudo depende de você .. O nosso não é mais nada para ajudar. boa sorte para você ..
Aragon
2
Quando cliquei no botão Para baixo, sugeri que eu deixasse um comentário para ajudar a melhorar a resposta. Não pretendi sugerir que sua resposta é inútil ou não pertence a este lugar; certamente agrega valor à comunidade! É uma solução simples que provavelmente outras pessoas ignoram para problemas semelhantes. Tenho certeza de que outros acharão útil.
Matt
apenas para comentar aqui - boa resposta para a pergunta. uma maneira de reforçar a qualidade dessa resposta seria um regex para identificar um comprimento específico de números em uma linha - como é esperado para um CEP. apenas o meu 2c.
Jason m