¿Cómo devolver componentes de direcciones individuales (ciudad, estado, etc.) desde el geocodificador GeoPy?

10

Estoy usando GeoPy para geocodificar direcciones para lat, lng. También me gustaría extraer los componentes de dirección detallados (calle, ciudad, estado, código postal) para cada dirección.

GeoPy devuelve una cadena con la dirección, pero no puedo encontrar una forma confiable de separar cada componente. Por ejemplo:

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

La API de geocodificación de Google devuelve estos componentes individuales ... ¿hay alguna forma de obtenerlos de GeoPy? (o una herramienta de geocodificación diferente?)

lubar
fuente

Respuestas:

8

Lubar, vi tu publicación en Stack Overflow pero voy a publicar una respuesta similar aquí por coherencia. Es una buena pregunta Trabajo en la industria de verificación de direcciones y he abordado su tipo de problema anteriormente.

Me vinculé a esta pregunta de desbordamiento de pila en un comentario; y es importante saber que realmente no hay garantía sobre el formato de las direcciones completas de forma libre. Como se menciona en la publicación vinculada, las direcciones completas pueden verse como cualquiera de estas:

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

(Las razones se explican en la publicación vinculada). Me doy cuenta de que GeoPy devuelve direcciones en un formato determinado, dependiendo del geocodificador utilizado (cuyo formato resultante está fuera del control de GeoPy), pero las direcciones pueden verse de muchas maneras dentro de un determinado componente (como tener comas), y es importante saber que las direcciones estandarizadas no tienen comas (de acuerdo con la publicación 28 de USPS).

Recientemente ayudé a trabajar en una API llamada LiveAddress ; se acaba de actualizar para admitir geocodificación y análisis de direcciones de una sola línea.

GeoPy está diseñado para geocodificar, no analizar en componentes (esa tarea es realmente difícil por razones por las que no entraré aquí). LiveAddress será , sin embargo, componentizar la dirección y las coordenadas y otra información pertinente acerca de la dirección, y sólo si las direcciones son reales; sin resultados "adivinados".

Para analizar una dirección de una sola línea en componentes usando Python, simplemente ponga la dirección completa en el campo "calle":

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)

El objeto JSON resultante contendrá un componentsobjeto que se verá así:

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

La respuesta también incluirá first_line y delivery_line_2 combinados para que no tenga que concatenarlos manualmente si los necesita.

Mate
fuente
Otra API puede ser address-parser.net/try.php
SIslam
3

No es difícil escribir su archivo 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 te ayude...

Aragón
fuente
1
Tengo que rechazar esto, no porque la intención no sea buena, sino porque no hay absolutamente ninguna garantía de que los componentes de la dirección estén delimitados con una coma. Vea esta pregunta en Stack Overflow sobre el análisis de direcciones de una sola línea en componentes. Si bien GeoPy puede devolver cierto formato, las direcciones estandarizadas no tienen comas.
Matt
@ Matt, esta es mi solución. tal vez esto no pueda resolver su problema, pero puede ayudarlo a encontrar una buena manera de encontrar una buena solución ... eso depende completamente de él ... veo que tiene una solución, solo escríbala aquí ... además de esto, no necesita escriba cuando haga downvoting, todo depende de usted ... Nuestro no es nada más para ayudar. buena suerte ..
Aragon
2
Cuando hice clic en el botón Abajo, sugirió dejar un comentario para ayudar a mejorar la respuesta, así que lo hice. No quise decir que su respuesta no sea útil o que no pertenezca aquí; ¡sin duda agrega valor a la comunidad! Es una solución simple que otros probablemente pasarán por alto por problemas similares. Estoy seguro de que otros lo encontrarán útil.
Matt
solo para comentar aquí: buena respuesta para la pregunta. Una forma de hacer cumplir la calidad de esta respuesta sería una expresión regular para identificar una longitud específica de números en una fila, como se espera para un código postal. solo mi 2c.
Jason m