Bagaimana cara mengembalikan komponen alamat individual (kota, negara bagian, dll.) Dari geocoder GeoPy?

10

Saya menggunakan GeoPy untuk geocode alamat ke lat, lng. Saya juga ingin mengekstrak komponen alamat yang diperinci (jalan, kota, negara bagian, pos) untuk setiap alamat.

GeoPy mengembalikan sebuah string dengan alamat - tetapi saya tidak dapat menemukan cara yang dapat diandalkan untuk memisahkan setiap komponen. Sebagai contoh:

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

Google geocoding API mengembalikan komponen individual ini ... adakah cara untuk mendapatkannya dari GeoPy? (atau alat geocoding yang berbeda?)

lubar
sumber

Jawaban:

8

Lubar, saya melihat posting Anda di Stack Overflow tetapi saya akan memposting jawaban yang sama di sini untuk konsistensi. Itu pertanyaan yang bagus. Saya bekerja di industri verifikasi alamat dan telah mengatasi masalah Anda sebelumnya.

Saya menautkan pertanyaan Stack Overflow ini dalam komentar; dan penting untuk mengetahui bahwa sebenarnya tidak ada jaminan tentang format alamat jalan bentuk lengkap lengkap. Seperti disebutkan dalam pos tertaut, alamat lengkap dapat terlihat seperti ini:

1) 102 jalan utama Anytown, negara bagian

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Alasannya dijelaskan dalam posting tertaut.) Saya menyadari bahwa GeoPy mengembalikan alamat dalam format tertentu - tergantung pada geocoder yang digunakan (format yang dihasilkan di luar kendali GeoPy), tetapi alamat dapat melihat segala macam cara dalam suatu tertentu komponen (seperti memiliki koma), dan penting untuk mengetahui bahwa alamat standar tidak memiliki koma (menurut USPS Publikasi 28).

Saya membantu mengerjakan API yang baru-baru ini disebut LiveAddress ; itu baru saja ditingkatkan untuk mendukung penguraian geocoding dan alamat jalur tunggal.

GeoPy dirancang untuk melakukan geocode, bukan menguraikan komponen (tugas itu sebenarnya sangat sulit karena alasan saya tidak akan masuk ke sini). LiveAddress akan , bagaimanapun, komponen alamat dan mengembalikan koordinat dan informasi lain tentang alamat, dan hanya jika alamat itu nyata; tidak ada hasil "tebak".

Untuk mem-parsing alamat baris tunggal ke dalam komponen menggunakan Python, cukup masukkan seluruh alamat ke dalam bidang "jalan":

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)

Objek JSON yang dihasilkan akan berisi componentsobjek yang akan terlihat seperti ini:

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

Responsnya juga akan mencakup first_line gabungan dan delivery_line_2 sehingga Anda tidak harus menggabungkannya secara manual jika Anda memerlukannya.

Mat
sumber
Satu api lain dapat address-parser.net/try.php
SIslam
3

tidak sulit untuk menulis file json Anda.

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

Saya harap ini membantu Anda ...

Aragon
sumber
1
Saya harus membatalkan ini, bukan karena maksudnya tidak baik, tetapi karena sama sekali tidak ada jaminan komponen alamat dibatasi dengan koma. Lihat pertanyaan ini di Stack Overflow tentang penguraian alamat satu baris ke dalam komponen. Sementara GeoPy dapat mengembalikan format tertentu, alamat standar tidak memiliki koma.
Matt
@Matt ini solusi saya. mungkin ini tidak dapat menyelesaikan masalahnya tetapi dapat membantunya dalam menemukan cara yang baik untuk solusi yang baik .. itu sepenuhnya terserah padanya ... saya melihat Anda memiliki solusi, hanya menulis di sini ... di samping ini Anda tidak perlu menulis ketika Anda downvoting, semuanya terserah Anda..Kami bukan hal lain untuk membantu. semoga sukses ..
Aragon
2
Ketika saya mengklik tombol Down, itu menyarankan saya meninggalkan komentar untuk membantu meningkatkan jawabannya, jadi saya melakukannya. Saya tidak bermaksud mengatakan bahwa jawaban Anda tidak membantu atau tidak cocok di sini; tentu saja menambah nilai bagi komunitas! Ini solusi sederhana yang mungkin diabaikan orang lain untuk masalah yang sama. Saya yakin orang lain akan merasakan manfaatnya.
Matt
hanya komentar di sini - jawaban yang bagus untuk pertanyaan itu. cara untuk menegakkan kualitas jawaban ini akan menjadi regex untuk mengidentifikasi panjang angka tertentu dalam satu baris - seperti yang diharapkan untuk kode pos. hanya 2c saya.
jason m