จะส่งคืนส่วนประกอบที่อยู่ส่วนบุคคล (เมืองรัฐ ฯลฯ ) จาก Geocoder GeoPy ได้อย่างไร


10

ฉันใช้ GeoPy เพื่อระบุที่อยู่ทางภูมิศาสตร์เป็น lat, lng ฉันต้องการแยกส่วนประกอบที่อยู่ที่แยกรายการ (ถนนเมืองรัฐรหัสไปรษณีย์) สำหรับแต่ละที่อยู่

GeoPy ส่งคืนสตริงด้วยที่อยู่ - แต่ฉันไม่สามารถหาวิธีที่เชื่อถือได้ในการแยกแต่ละองค์ประกอบ ตัวอย่างเช่น:

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

API การเข้ารหัสทางภูมิศาสตร์ของ Google จะส่งคืนองค์ประกอบแต่ละรายการเหล่านี้ ... มีวิธีรับสิ่งเหล่านี้จาก GeoPy หรือไม่ (หรือเครื่องมือการเข้ารหัสภูมิศาสตร์อื่น)

คำตอบ:


8

ตอนนี้, ฉันเห็นโพสต์ของคุณที่ Stack Overflow แต่จะโพสต์คำตอบที่คล้ายกันที่นี่เพื่อความสอดคล้อง มันเป็นคำถามที่ดี ฉันทำงานในอุตสาหกรรมการตรวจสอบที่อยู่และแก้ไขปัญหาของคุณมาก่อน

ฉันเชื่อมโยงกับคำถาม Stack Overflowในความคิดเห็น และสิ่งสำคัญคือต้องรู้ว่าไม่มีการรับประกันเกี่ยวกับรูปแบบของที่อยู่ถนนอิสระที่สมบูรณ์ ตามที่กล่าวไว้ในโพสต์ที่เชื่อมโยงที่อยู่ที่สมบูรณ์สามารถมีลักษณะดังนี้:

1) 102 ถนนสายหลัก Anytown รัฐ

2) 400n 600e # 2, 52173

3) po # 104 60203

4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345

5) 205 1105 14 90210

(เหตุผลอธิบายในโพสต์ที่เชื่อมโยงกัน) ฉันรู้ว่า GeoPy ส่งคืนที่อยู่ในรูปแบบที่แน่นอน - ขึ้นอยู่กับ geocoder ที่ใช้ (ซึ่งรูปแบบผลลัพธ์นั้นอยู่นอกเหนือการควบคุมของ GeoPy) แต่ที่อยู่สามารถมองหาวิธีต่างๆ องค์ประกอบ (เช่นมีเครื่องหมายจุลภาค) และเป็นสิ่งสำคัญที่จะต้องทราบว่าที่อยู่มาตรฐานไม่มีเครื่องหมายจุลภาค (อ้างอิงจาก USPS Publication 28)

ฉันช่วยทำงานใน API เพียงเมื่อเร็ว ๆ นี้เรียกว่าLiveAddress ; มันเพิ่งอัพเกรดเพื่อรองรับการเข้ารหัสภูมิศาสตร์และการแยกวิเคราะห์ที่อยู่บรรทัดเดียว

GeoPy ถูกออกแบบมาเพื่อเข้ารหัสภูมิศาสตร์ไม่แยกวิเคราะห์ส่วนประกอบ (งานนั้นยากจริง ๆ ด้วยเหตุผลที่ฉันจะไม่เข้าไปที่นี่) อย่างไรก็ตาม LiveAddress จะจัดองค์ประกอบที่อยู่และพิกัดการส่งคืนและข้อมูลอื่น ๆ เกี่ยวกับที่อยู่และเฉพาะในกรณีที่ที่อยู่นั้นเป็นของจริง ไม่มีผลลัพธ์ "เดา"

ในการแยกที่อยู่บรรทัดเดียวเป็นส่วนประกอบโดยใช้ Python เพียงแค่ใส่ที่อยู่ทั้งหมดลงในช่อง "ถนน":

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)

วัตถุ JSON ที่เป็นผลลัพธ์จะมีcomponentsวัตถุซึ่งจะมีลักษณะดังนี้:

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

การตอบกลับจะรวมการรวม first_line และ delivery_line_2 ไว้ด้วยกันดังนั้นคุณไม่จำเป็นต้องต่อข้อมูลเหล่านั้นด้วยตนเองหากคุณต้องการ


API อีกอันหนึ่งสามารถเป็นaddress-parser.net/try.php
SIslam

3

การเขียนไฟล์ 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"}'

ฉันหวังว่ามันจะช่วยคุณ ...


1
ฉันต้อง downvote นี้ไม่ใช่เพราะเจตนาไม่ดี แต่เพราะไม่มีการรับประกันแน่นอนว่าที่อยู่ขององค์ประกอบนั้นคั่นด้วยเครื่องหมายจุลภาค ดูคำถามนี้ที่ Stack Overflowเกี่ยวกับการแยกที่อยู่บรรทัดเดียวเป็นส่วนประกอบ ในขณะที่ GeoPy อาจกลับมาเป็นรูปแบบที่แน่นอนที่อยู่มาตรฐานไม่มีจุลภาค
Matt

@Matt นี่คือทางออกของฉัน บางทีนี่ไม่สามารถแก้ปัญหาของเขา แต่สามารถช่วยเขาในการหาวิธีที่ดีสำหรับการแก้ปัญหาที่ดี .. นั่นขึ้นอยู่กับเขาอย่างสมบูรณ์ ... ฉันเห็นคุณมีวิธีแก้ปัญหาเพียงเขียนที่นี่ ... ข้างนี้คุณไม่จำเป็นต้อง เขียนเมื่อคุณ downvoting มันขึ้นอยู่กับคุณ .. เราไม่ได้มีอะไรให้ช่วย ขอให้คุณโชคดี ..
Aragon

2
เมื่อฉันคลิกปุ่มลงมันแนะนำให้ฉันแสดงความคิดเห็นเพื่อช่วยปรับปรุงคำตอบดังนั้นฉันจึงทำได้ ฉันไม่ได้หมายความว่าคำตอบของคุณไม่เป็นประโยชน์หรือไม่ได้อยู่ที่นี่ มันเพิ่มคุณค่าให้กับชุมชนอย่างแน่นอน! มันเป็นวิธีง่ายๆที่คนอื่นอาจมองข้ามปัญหาที่คล้ายกัน ฉันแน่ใจว่าคนอื่นจะพบว่ามีประโยชน์
Matt

เพียงแค่แสดงความคิดเห็นที่นี่ - คำตอบที่ดีสำหรับคำถาม วิธีการบังคับใช้คุณภาพของคำตอบนี้จะเป็น regex เพื่อระบุความยาวของตัวเลขเฉพาะในแถว - ตามที่คาดไว้สำหรับรหัสไปรษณีย์ แค่ 2c ของฉัน
jason m
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.