Jak zwrócić poszczególne elementy adresu (miasto, stan itp.) Z geokodera GeoPy?

10

Używam GeoPy do geokodowania adresów do lat, lng. Chciałbym również wyodrębnić szczegółowe elementy adresu (ulica, miasto, stan, kod pocztowy) dla każdego adresu.

GeoPy zwraca ciąg z adresem - ale nie mogę znaleźć niezawodnego sposobu na oddzielenie każdego komponentu. Na przykład:

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

Interfejs API geokodowania Google zwraca te poszczególne składniki ... czy istnieje sposób na uzyskanie ich z GeoPy? (lub inne narzędzie do geokodowania?)

lubar
źródło

Odpowiedzi:

8

Lubar, widziałem twój post na Stack Overflow, ale zamierzam opublikować podobną odpowiedź tutaj w celu zachowania spójności. To dobre pytanie. Pracuję w branży weryfikacji adresów i już wcześniej rozwiązałem Twój problem.

W komentarzu powiązałem to pytanie dotyczące przepełnienia stosu ; i ważne jest, aby wiedzieć, że tak naprawdę nie ma gwarancji co do formatu pełnych dowolnych adresów ulic. Jak wspomniano w łączonym poście, kompletne adresy mogą wyglądać następująco:

1) 102 główna ulica Anytown, stan

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Powody są wyjaśnione w łączonym poście.) Zdaję sobie sprawę, że GeoPy zwraca adresy w określonym formacie - w zależności od użytego geokodera (którego wynikowy format jest poza kontrolą GeoPy), ale adresy mogą wyglądać na różne sposoby w określonym składnik (na przykład przecinki) i ważne jest, aby wiedzieć, że w standardowych adresach nie ma przecinków (zgodnie z publikacją USPS 28).

Pomogłem niedawno pracować nad interfejsem API o nazwie LiveAddress ; właśnie został zaktualizowany do obsługi geokodowania i parsowania adresu w jednym wierszu.

GeoPy jest zaprojektowany do geokodowania, a nie parsowania na komponenty (to zadanie jest naprawdę bardzo trudne z powodów, dla których nie będę tu wchodził). LiveAddress będzie jednak składać adres i zwracać współrzędne oraz inne informacje o adresie i tylko wtedy, gdy adresy będą prawdziwe; brak „odgadniętych” wyników.

Aby parsować adres jednowierszowy w komponenty za pomocą Pythona, po prostu umieść cały adres w polu „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)

Wynikowy obiekt JSON będzie zawierał componentsobiekt, który będzie wyglądał mniej więcej tak:

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

Odpowiedź będzie również zawierać kombinację first_line i delivery_line_2, więc nie musisz ręcznie łączyć tych, jeśli ich potrzebujesz.

Matt
źródło
Jeszcze jedno API może być address-parser.net/try.php
SIslam
3

nie jest trudno napisać plik 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"}'

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
1
Muszę to zlekceważyć, nie dlatego, że intencja nie jest dobra, ale ponieważ nie ma absolutnie żadnej gwarancji, że składniki adresu są oddzielone przecinkiem. Zobacz to pytanie w sekcji Przepełnienie stosu dotyczące parsowania adresów jednowierszowych na komponenty. Chociaż GeoPy może zwracać określony format, w standardowych adresach nie ma przecinków.
Matt
@Matt to jest moje rozwiązanie. może ten problem nie rozwiąże jego problemu, ale może pomóc mu znaleźć dobry sposób na dobre rozwiązanie ... to zależy od niego ... widzę, że masz rozwiązanie, napisz tylko tutaj ... poza tym nie musisz pisz, gdy oddajesz głos, wszystko zależy od ciebie. Naszym nie ma nic innego, jak pomóc. powodzenia…
Aragon,
2
Kiedy kliknąłem przycisk W dół, zasugerowałem, że zostawię komentarz, aby poprawić odpowiedź, więc zrobiłem to. Nie chciałem sugerować, że twoja odpowiedź jest nieprzydatna lub nie należy tutaj; z pewnością stanowi wartość dodaną dla społeczności! To proste rozwiązanie, które inni prawdopodobnie przeoczą w przypadku podobnych problemów. Jestem pewien, że inni uznają to za przydatne.
Matt
skomentuj tutaj - dobra odpowiedź na pytanie. sposobem na wymuszenie jakości tej odpowiedzi byłoby wyrażenie regularne w celu zidentyfikowania określonej długości liczb w rzędzie - zgodnie z oczekiwaniami dla kodu pocztowego. tylko mój 2c.
jason m