Come restituire i singoli componenti dell'indirizzo (città, stato, ecc.) Dal geocoder GeoPy?


10

Sto usando GeoPy per geocodificare gli indirizzi in lat, lng. Vorrei anche estrarre i componenti dell'indirizzo dettagliati (via, città, provincia, CAP) per ciascun indirizzo.

GeoPy restituisce una stringa con l'indirizzo, ma non riesco a trovare un modo affidabile per separare ciascun componente. Per esempio:

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

L'API di geocodifica di Google restituisce questi singoli componenti ... c'è un modo per ottenerli da GeoPy? (o un altro strumento di geocodifica?)

Risposte:


8

Lubar, ho visto il tuo post su Stack Overflow ma pubblicherò una risposta simile qui per coerenza. È una buona domanda Lavoro nel settore della verifica degli indirizzi e ho già affrontato il tuo tipo di problema.

Ho collegato a questa domanda Stack Overflow in un commento; ed è importante sapere che non esiste alcuna garanzia circa il formato degli indirizzi completi a forma libera. Come menzionato nel post collegato, gli indirizzi completi possono apparire come uno di questi:

1) 102 main street Anytown, stato

2) 400n 600e # 2, 52173

3) punto 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(I motivi sono spiegati nel post collegato.) Mi rendo conto che GeoPy restituisce gli indirizzi in un determinato formato - a seconda del geocoder utilizzato (il cui formato risultante è fuori dal controllo di GeoPy), ma gli indirizzi possono apparire in tutti i modi all'interno di un certo componente (come avere le virgole) ed è importante sapere che gli indirizzi standardizzati non dispongono di virgole (secondo la Pubblicazione 28 dell'USPS).

Di recente ho aiutato a lavorare su un'API chiamata LiveAddress ; è stato appena aggiornato per supportare il geocoding e l'analisi dell'indirizzo a riga singola.

GeoPy è progettato per geocodificare, non analizzare i componenti (tale compito è in realtà molto difficile per motivi che non entrerò qui). LiveAddress sarà , tuttavia, componentize l'indirizzo e restituire le coordinate e altre informazioni circa l'indirizzo, e solo se gli indirizzi sono reali; nessun risultato "indovinato".

Per analizzare un indirizzo a riga singola in componenti usando Python, inserisci semplicemente l'indirizzo nel campo "street":

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)

L'oggetto JSON risultante conterrà un componentsoggetto simile a questo:

"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 risposta includerà anche la combinazione first_line e delivery_line_2, quindi non è necessario concatenarli manualmente se necessario.


Un altro API può essere address-parser.net/try.php
SIslam

3

non è difficile scrivere il tuo file 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"}'

spero che ti aiuti ...


1
Devo sottovalutare questo, non perché l'intento non sia buono, ma perché non c'è assolutamente alcuna garanzia che i componenti dell'indirizzo siano delimitati da una virgola. Vedi questa domanda in Stack Overflow sull'analisi degli indirizzi a riga singola nei componenti. Sebbene GeoPy possa restituire un determinato formato, gli indirizzi standardizzati non dispongono di virgole.
Matt

@Matt questa è la mia soluzione. forse questo non può risolvere il suo problema ma può aiutarlo a trovare un buon modo per una buona soluzione .. dipende completamente da lui ... vedo che hai una soluzione, scrivila solo qui ... accanto a questo non è necessario scrivere quando si effettua il downvoting, dipende tutto da te ... Il nostro non è nient'altro da aiutare. buona fortuna a te ..
Aragon,

2
Quando ho fatto clic sul pulsante Giù, mi ha suggerito di lasciare un commento per migliorare la risposta, così ho fatto. Non intendevo implicare che la tua risposta non sia stata utile o che non appartenga a questo; sicuramente aggiunge valore alla comunità! È una soluzione semplice che altri probabilmente trascureranno per problemi simili. Sono sicuro che altri lo troveranno utile.
Matt

solo per commentare qui - buona risposta alla domanda. un modo per imporre la qualità di questa risposta sarebbe una regex per identificare una specifica lunghezza di numeri in una riga, come previsto per un codice postale. solo il mio 2c.
Jason m
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.