Comment renvoyer des composants d'adresse individuels (ville, état, etc.) à partir du géocodeur GeoPy?

10

J'utilise GeoPy pour géocoder des adresses en lat, lng. Je voudrais également extraire les composants d'adresse détaillés (rue, ville, état, code postal) pour chaque adresse.

GeoPy renvoie une chaîne avec l'adresse - mais je ne trouve pas de moyen fiable de séparer chaque composant. Par exemple:

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

L'API de géocodage de Google renvoie ces composants individuels ... existe-t-il un moyen de les obtenir de GeoPy? (ou un autre outil de géocodage?)

lubar
la source

Réponses:

8

Lubar, j'ai vu votre message sur Stack Overflow mais je vais poster une réponse similaire ici pour plus de cohérence. C'est une bonne question. Je travaille dans l'industrie de la vérification d'adresse et j'ai déjà abordé votre type de problème.

J'ai lié à cette question Stack Overflow dans un commentaire; et il est important de savoir qu'il n'y a vraiment aucune garantie quant au format des adresses de rue de forme libre complètes. Comme mentionné dans le post lié, les adresses complètes peuvent ressembler à n'importe laquelle de ces:

1) 102 rue principale Anytown, état

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Les raisons sont expliquées dans le message lié.) Je me rends compte que GeoPy renvoie des adresses dans un certain format - en fonction du géocodeur utilisé (quel format résultant est hors du contrôle de GeoPy), mais les adresses peuvent regarder toutes sortes de façons dans un certain (comme avoir des virgules), et il est important de savoir que les adresses normalisées n'ont pas de virgule (selon la publication USPS 28).

J'ai aidé à travailler sur une API récemment appelée LiveAddress ; il vient d'être mis à niveau pour prendre en charge le géocodage et l'analyse d'adresses sur une seule ligne.

GeoPy est conçu pour géocoder, pas pour analyser les composants (cette tâche est en fait vraiment difficile pour des raisons que je n'entrerai pas ici). LiveAddress sera , cependant, componentize l'adresse et le retour des coordonnées et d' autres informations sur l'adresse, et seulement si les adresses sont réels; aucun résultat "deviné".

Pour analyser une adresse sur une seule ligne en composants à l'aide de Python, mettez simplement l'adresse entière dans le champ "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'objet JSON résultant contiendra un componentsobjet qui ressemblera à ceci:

"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 réponse inclura également la combinaison de first_line et delivery_line_2 afin que vous n'ayez pas à les concaténer manuellement si vous en avez besoin.

Mat
la source
Un autre api peut être address-parser.net/try.php
SIslam
3

il n'est pas difficile d'écrire votre fichier 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"}'

J'espère que ça t'aide...

Aragon
la source
1
Je dois voter contre, non pas parce que l'intention n'est pas bonne, mais parce qu'il n'y a absolument aucune garantie que les composants d'adresse sont délimités par une virgule. Consultez cette question sur Stack Overflow à propos de l'analyse des adresses unifilaires en composants. Bien que GeoPy puisse renvoyer un certain format, les adresses normalisées n'ont pas de virgule.
Matt
@Matt c'est ma solution. peut-être que cela ne peut pas résoudre son problème mais peut l'aider à trouver un bon moyen pour une bonne solution .. cela dépend entièrement de lui ... je vois que vous avez une solution, écrivez-la seulement ici ... à côté de cela, vous n'avez pas besoin de écrivez quand vous votez, c'est à vous de décider ... Notre aide n'est pas autre chose. bonne chance à toi ..
Aragon
2
Lorsque j'ai cliqué sur le bouton Bas, il m'a suggéré de laisser un commentaire pour aider à améliorer la réponse, alors je l'ai fait. Je ne voulais pas laisser entendre que votre réponse n'est pas utile ou n'a pas sa place ici; cela ajoute certainement de la valeur à la communauté! C'est une solution simple que d'autres ignoreront probablement pour des problèmes similaires. Je suis sûr que d'autres le trouveront utile.
Matt
juste pour commenter ici - bonne réponse à la question. un moyen de renforcer la qualité de cette réponse serait une expression régulière pour identifier une longueur spécifique de nombres dans une rangée - comme cela est prévu pour un code postal. juste mon 2c.
jason m