Wie kann ich einzelne Adresskomponenten (Stadt, Bundesland usw.) vom GeoPy-Geocoder zurückgeben?

10

Ich verwende GeoPy, um Adressen in lat, lng zu geocodieren. Ich möchte auch die aufgeschlüsselten Adresskomponenten (Straße, Stadt, Bundesland, Postleitzahl) für jede Adresse extrahieren.

GeoPy gibt einen String mit der Adresse zurück - aber ich kann keinen zuverlässigen Weg finden, um jede Komponente zu trennen. Zum Beispiel:

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

Die Google-Geokodierungs-API gibt diese einzelnen Komponenten zurück. Gibt es eine Möglichkeit, diese von GeoPy abzurufen? (oder ein anderes Geokodierungswerkzeug?)

lubar
quelle

Antworten:

8

Lubar, ich habe Ihren Beitrag bei Stack Overflow gesehen, werde aber aus Gründen der Konsistenz hier eine ähnliche Antwort veröffentlichen. Das ist eine gute Frage. Ich arbeite in der Adressüberprüfungsbranche und habe Ihr Problem bereits zuvor angegangen.

Ich habe in einem Kommentar auf diese Stapelüberlauffrage verwiesen . und es ist wichtig zu wissen, dass es wirklich keine Garantie für das Format vollständiger Freiform-Straßenadressen gibt. Wie im verlinkten Beitrag erwähnt, können vollständige Adressen wie folgt aussehen:

1) 102 Hauptstraße Anytown, Bundesstaat

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Die Gründe werden im verlinkten Beitrag erläutert.) Mir ist klar, dass GeoPy Adressen in einem bestimmten Format zurückgibt - abhängig vom verwendeten Geocoder (welches resultierende Format außerhalb der Kontrolle von GeoPy liegt), aber Adressen können innerhalb eines bestimmten Formats auf alle möglichen Arten aussehen Komponente (wie Kommas), und es ist wichtig zu wissen, dass standardisierte Adressen keine Kommas haben (gemäß USPS-Publikation 28).

Ich habe kürzlich bei der Arbeit an einer API namens LiveAddress geholfen . Es wurde gerade aktualisiert, um Geokodierung und einzeilige Adressanalyse zu unterstützen.

GeoPy wurde entwickelt, um Geocodes zu erstellen und nicht in Komponenten zu analysieren (diese Aufgabe ist aus Gründen, auf die ich hier nicht näher eingehen werde, wirklich schwierig). LiveAddress wird jedoch die Adress- und Rückgabekoordinaten sowie andere Informationen über die Adresse komponieren , und zwar nur dann, wenn die Adressen echt sind. Keine "erratenen" Ergebnisse.

Um eine einzeilige Adresse mit Python in Komponenten zu analysieren, geben Sie einfach die gesamte Adresse in das Feld "Straße" ein:

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)

Das resultierende JSON-Objekt enthält ein componentsObjekt, das ungefähr so ​​aussieht:

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

Die Antwort enthält auch die Kombination aus first_line und Delivery_line_2, sodass Sie diese nicht manuell verketten müssen, wenn Sie sie benötigen.

Matt
quelle
Eine andere API kann address-parser.net/try.php
SIslam
3

Es ist nicht schwer, Ihre JSON-Datei zu schreiben.

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

ich hoffe es hilft dir ...

Aragon
quelle
1
Ich muss dies ablehnen, nicht weil die Absicht nicht gut ist, sondern weil es absolut keine Garantie gibt, dass die Adresskomponenten durch ein Komma getrennt sind. Weitere Informationen zum Parsen einzeiliger Adressen in Komponenten finden Sie unter Stapelüberlauf. Während GeoPy möglicherweise ein bestimmtes Format zurückgibt, haben standardisierte Adressen keine Kommas.
Matt
@ Matt das ist meine Lösung. Vielleicht kann dies sein Problem nicht lösen, kann ihm aber helfen, einen guten Weg für eine gute Lösung zu finden. Das liegt ganz bei ihm. Ich sehe, Sie haben eine Lösung. Schreiben Sie sie nur hier. Außerdem brauchen Sie das nicht Schreiben Sie, wenn Sie abstimmen, es liegt ganz bei Ihnen. Unsere ist nichts anderes zu helfen. Viel Glück für Sie ..
Aragon
2
Als ich auf die Schaltfläche "Nach unten" geklickt habe, wurde vorgeschlagen, einen Kommentar zu hinterlassen, um die Antwort zu verbessern. Ich wollte nicht implizieren, dass Ihre Antwort nicht hilfreich ist oder nicht hierher gehört. Es ist sicherlich ein Mehrwert für die Community! Es ist eine einfache Lösung, die andere bei ähnlichen Problemen wahrscheinlich übersehen werden. Ich bin sicher, dass andere es nützlich finden werden.
Matt
Nur um hier zu kommentieren - gute Antwort auf die Frage. Ein Weg, um die Qualität dieser Antwort zu erzwingen, wäre ein regulärer Ausdruck, um eine bestimmte Länge von Zahlen in einer Reihe zu identifizieren - wie es für eine Postleitzahl erwartet wird. nur meine 2c.
Jason m