GeoPy geocoder'dan adres adreslerini (şehir, eyalet vb.) Nasıl iade edebilirim?


10

Lat, lng adreslerini coğrafi kodlamak için GeoPy kullanıyorum. Ayrıca her adres için ayrıntılı adres bileşenlerini (sokak, şehir, eyalet, posta kodu) ayıklamak istiyorum.

GeoPy adresi ile bir dize döndürür - ancak her bileşeni ayırmak için güvenilir bir yol bulamıyorum. Örneğin:

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

Google coğrafi kodlama API'sı bu ayrı bileşenleri döndürüyor ... Bunları GeoPy'den almanın bir yolu var mı? (veya farklı bir coğrafi kodlama aracı mı?)

Yanıtlar:


8

Lubar, yazınızı Stack Overflow'da gördüm ama tutarlılık için benzer bir cevap göndereceğim. Güzel bir soru. Adres doğrulama endüstrisinde çalışıyorum ve daha önce böyle bir sorunla başa çıktım.

Ben bağlantılı bu yığın taşması söz yorumunda; ve tam serbest biçimli sokak adreslerinin biçimi hakkında gerçekten bir garanti olmadığını bilmek önemlidir. Bağlantılı gönderide belirtildiği gibi, tam adresler aşağıdakilerden herhangi birine benzeyebilir:

1) 102 ana cadde Anytown, eyalet

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Nedenleri bağlantılı yazı açıklanmıştır.) GeoPy adresleri belirli bir biçimde döndürür - kullanılan coğrafi kodlayıcı bağlı (sonuç biçimi GeoPy'nin kontrolü dışında), ama adresleri belirli bir şekilde her türlü yol bakabilirsiniz bileşeni (virgül kullanmak gibi) ve standart adreslerin virgül içermediğini bilmek önemlidir (USPS Yayını 28'e göre).

Kısa süre önce LiveAddress olarak adlandırılan bir API üzerinde çalışmaya yardımcı oldum ; coğrafi kodlama ve tek satırlı adres ayrıştırmayı destekleyecek şekilde yeni sürüme geçirildi.

GeoPy, bileşenleri ayrıştırmak yerine coğrafi kodlamak üzere tasarlanmıştır (bu görev, buraya girmeyeceğim nedenlerden dolayı gerçekten zordur). LiveAddress olacak , ancak, adres componentize ve adresiyle ilgili koordinatları ve diğer bilgileri dönün ve adreslerin gerçek yalnızca; "tahmin edilen" sonuç yok.

Tek satırlık bir adresi Python kullanarak bileşenlere ayrıştırmak için tüm adresi "sokak" alanına koymanız yeterlidir:

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)

Ortaya çıkan JSON nesnesi components, şuna benzer bir nesne içerecektir :

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

Yanıt, ayrıca, birleştirilen first_line ve delivery_line_2 öğelerini de içerecektir, böylece ihtiyacınız varsa bunları manuel olarak birleştirmeniz gerekmez.


Bir diğeri API olabilir address-parser.net/try.php
SIslam

3

json dosyanızı yazmak zor değildir.

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

umarım sana yardımcı olur ...


1
Niyeti iyi olmadığı için değil, adres bileşenlerinin virgülle ayrıldığına dair kesin bir garanti olmadığı için bunu düşürmek zorundayım. Tek satırlı adresleri bileşenlere ayrıştırma hakkında Stack Overflow'daki bu soruya bakın . GeoPy belirli bir biçim döndürebilir, ancak standartlaştırılmış adreslerde virgül yoktur.
Matt

@Matt bu benim çözümüm. belki bu sorununu çözemez ama iyi bir çözüm için iyi bir yol bulmada ona yardımcı olabilir .. bu tamamen ona kalmış ... bir çözümün olduğunu görüyorum, sadece buraya yaz ... bunun yanında ihtiyacın yok Eğer aşağı oy zaman yazmak, hepsi size kalmış .. Bizim yardım etmek için başka bir şey değil. Sana iyi şanslar ..
Aragon

2
Aşağı düğmesini tıkladığımda, cevabı geliştirmeye yardımcı olmak için bir yorum bırakmamı önerdi, bu yüzden yaptım. Cevabınızın yararlı olmadığını veya buraya ait olmadığını ima etmek istemedim; kesinlikle topluma değer katar! Diğerlerinin muhtemelen benzer sorunlar için göz ardı edeceği basit bir çözümdür. Eminim başkaları bunu faydalı bulacaktır.
Matt

sadece burada yorum yapmak - soru için iyi bir cevap. bu cevabın kalitesini güçlendirmenin bir yolu, bir posta kodunda beklendiği gibi, bir satırdaki belirli bir sayı uzunluğunu tanımlamak için bir normal ifade olacaktır. sadece benim 2c.
jason m
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.