Làm cách nào để trả về các thành phần địa chỉ riêng lẻ (thành phố, tiểu bang, v.v.) từ trình mã hóa địa lý GeoPy?


10

Tôi đang sử dụng GeoPy để địa chỉ mã địa lý đến lat, lng. Tôi cũng muốn trích xuất các thành phần địa chỉ được ghi thành từng mục (đường phố, thành phố, tiểu bang, zip) cho mỗi địa chỉ.

GeoPy trả về một chuỗi có địa chỉ - nhưng tôi không thể tìm thấy một cách đáng tin cậy để tách từng thành phần. Ví dụ:

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

API mã hóa địa lý của Google trả về các thành phần riêng lẻ này ... có cách nào để lấy chúng từ GeoPy không? (hoặc một công cụ mã hóa địa lý khác nhau?)

Câu trả lời:


8

Lubar, tôi đã thấy bài đăng của bạn tại Stack Overflow nhưng tôi sẽ đăng một câu trả lời tương tự ở đây để thống nhất. Đó là một câu hỏi hay. Tôi làm việc trong ngành xác minh địa chỉ và đã giải quyết loại vấn đề của bạn trước đây.

Tôi đã liên kết với câu hỏi Stack Overflow này trong một bình luận; và điều quan trọng cần biết là thực sự không có gì đảm bảo về định dạng của các địa chỉ đường phố hoàn chỉnh miễn phí. Như đã đề cập trong bài đăng được liên kết, các địa chỉ đầy đủ có thể trông giống như bất kỳ trong số này:

1) 102 đường chính Anytown, tiểu bang

2) 400n 600e # 2, 52173

3) số # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(Lý do được giải thích trong bài đăng được liên kết.) Tôi nhận ra rằng GeoPy trả về các địa chỉ theo một định dạng nhất định - tùy thuộc vào trình mã hóa địa lý được sử dụng (định dạng kết quả nằm ngoài sự kiểm soát của GeoPy), nhưng địa chỉ có thể tìm mọi cách trong một số cách nhất định thành phần (như có dấu phẩy) và điều quan trọng cần biết là các địa chỉ được tiêu chuẩn hóa không có dấu phẩy (theo USPS Publication 28).

Tôi đã giúp làm việc trên một API vừa được gọi là LiveAddress ; nó chỉ được nâng cấp để hỗ trợ mã hóa địa lý và phân tích địa chỉ một dòng.

GeoPy được thiết kế để mã hóa địa lý, không phân tích thành các thành phần (nhiệm vụ đó thực sự rất khó khăn vì những lý do tôi sẽ không vào đây). Tuy nhiên, LiveAddress sẽ thành phần hóa địa chỉ và trả về tọa độ và các thông tin khác về địa chỉ và chỉ khi địa chỉ là có thật; không có kết quả "đoán".

Để phân tích một địa chỉ một dòng thành các thành phần bằng Python, chỉ cần đặt toàn bộ địa chỉ vào trường "đường phố":

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)

Đối tượng JSON kết quả sẽ chứa một componentsđối tượng trông giống như thế này:

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

Phản hồi cũng sẽ bao gồm kết hợp First_line và Delivery_line_2 kết hợp để bạn không phải ghép nối thủ công nếu bạn cần chúng.


Một số khác có thể api address-parser.net/try.php
SIslam

3

không khó để viết tập tin json của bạn.

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

Tôi hy vọng nó sẽ giúp bạn...


1
Tôi phải downvote này, không phải vì ý định không tốt, mà vì hoàn toàn không có gì đảm bảo các thành phần địa chỉ được phân định bằng dấu phẩy. Xem câu hỏi này tại Stack Overflow về phân tích địa chỉ một dòng thành các thành phần. Mặc dù GeoPy có thể trả về một định dạng nhất định, các địa chỉ được tiêu chuẩn hóa không có dấu phẩy.
Matt

@Matt đây là giải pháp của tôi. có lẽ điều này không thể giải quyết vấn đề của anh ta nhưng có thể giúp anh ta tìm ra một cách tốt cho một giải pháp tốt .. điều đó hoàn toàn phụ thuộc vào anh ta ... tôi thấy bạn có một giải pháp, chỉ viết nó ở đây ... bên cạnh điều này bạn không cần phải viết khi bạn hạ cấp, tất cả tùy thuộc vào bạn..Không phải là bất cứ điều gì khác để giúp đỡ. chúc may mắn cho bạn ..
Aragon

2
Khi tôi nhấp vào nút Xuống, nó gợi ý tôi để lại nhận xét để giúp cải thiện câu trả lời, vì vậy tôi đã làm. Tôi không có ý ám chỉ rằng câu trả lời của bạn là không hữu ích hoặc không thuộc về nơi này; Nó chắc chắn tăng thêm giá trị cho cộng đồng! Đó là một giải pháp đơn giản mà những người khác có thể sẽ bỏ qua cho các vấn đề tương tự. Tôi chắc chắn rằng những người khác sẽ thấy nó hữu ích.
Matt

chỉ để bình luận ở đây - câu trả lời tốt cho câu hỏi. một cách để thực thi chất lượng của câu trả lời này sẽ là một biểu thức chính quy để xác định độ dài cụ thể của các số liên tiếp - như dự kiến ​​cho một mã zip. chỉ 2c của tôi.
jason m
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.