使用换行符正确格式化邮政地址[google maps]

时间:2010-12-28 01:33:46

标签: google-maps-api-3

使用谷歌地图API的V3,有没有可靠的方法来使用换行符格式化地址?通过这个,我的意思是像1600 Amphitheatre Parkway Mountain View, CA 94043这样的东西应格式化为

  

1600 Amphitheatre Parkway
  Mountain View,CA 94043

通过地理编码查看响应对象,有一个address_components数组,对于上述地址,有8个组件(并非所有组件都用于地址):

0: Object
    long_name: "1600"
    short_name: "1600"
    types: Array[1]
        0: "street_number"
        length: 1
1: Object
    long_name: "Amphitheatre Pkwy"
    short_name: "Amphitheatre Pkwy"
    types: Array[1]
        0: "route"
        length: 1
2: Object
    long_name: "Mountain View"
    short_name: "Mountain View"
    types: Array[2]
        0: "locality"
        1: "political"
        length: 2
3: Object
    long_name: "San Jose"
    short_name: "San Jose"
    types: Array[2]
        0: "administrative_area_level_3"
        1: "political"
        length: 2
4: Object
    long_name: "Santa Clara"
    short_name: "Santa Clara"
    types: Array[2]
        0: "administrative_area_level_2"
        1: "political"
        length: 2
5: Object
    long_name: "California"
    short_name: "CA"
    types: Array[2]
        0: "administrative_area_level_1"
        1: "political"
        length: 2
6: Object
    long_name: "United States"
    short_name: "US"
    types: Array[2]
        0: "country"
        1: "political"
        length: 2
7: Object
    long_name: "94043"
    short_name: "94043"
    types: Array[1]
        0: "postal_code"
        length: 1

我在想你可以组合你想要的部分,比如

sprintf("%s %s<br />%s, %s %s",
        array[0].short_name,
        array[1].short_name,
        array[2].short_name,
        array[5].short_name,
        array[7].short_name)

[edit]我刚刚意识到sprintf在JavaScript中没有默认定义,所以我猜想只是连接。[/ edit]

但这似乎非常不可靠。有没有人知道address_components结构的详细信息,是否与美国的街道地址相似?如果我想,我想我也可以寻找合适的类型(street_numberroute等)。

如果有人比我在这里做的更好,我会喜欢它......

2 个答案:

答案 0 :(得分:1)

地址组件及其类型记录在http://code.google.com/apis/maps/documentation/geocoding/#Types

您要做的是遍历元素并检查types数组中的值。你不想总是假设城市是第N个元素等。无论你选择什么价值的N,你可能更想要的更多。你肯定想检查类型。

对于美国的街道地址,您需要跳过administrative_area_level_2,因为那是一个通常不属于街道地址的县。

通常,您需要在具有类型locality的元素之前放置换行符。这可能是获得足够好的结果所需的唯一换行规则。

使用至少两种可能存在问题的地址进行测试:

1)非法人地区的农村地址。也许在阿拉斯加州中间选择一个随机位置。

2)超密集的地方。布鲁克林可能是个好地方。我相信布鲁克林将被列为地方性,而纽约(城市)可能会被列为地方。检查合法邮寄地址是什么。您可能会发现需要使用sublocality(如果存在)并忽略该位置。我不确定。

在上面,我假设美国地址。如果您试图解析美国以外的地址,所有投注都将被取消。

答案 1 :(得分:0)

或....(再次,假设美国地址)......有CASS认证的服务可以为您完成。例如,我在一家名为SmartyStreets的公司工作,我们确实在进行验证。另一方面,谷歌确实解决了近似,并不是所有你得到的结果都是准确的;它做出了最好的猜测。 CASS认证的软件将变得可靠和准确。

LiveAddress API返回简单REST请求的结果。以下是您在上面使用的地址的JSON结果的片段:

 "delivery_line_1":"1600 Amphitheatre Pkwy",
 "last_line":"Mountain View CA 94043-1351"

所以在这里,它会自动标准化,并且正确由换行符分隔。我想你会发现它有一些用处(另外,它是免费的)。如果您有任何疑问,请告诉我。我会帮你的。