为什么通过地理编码让我选择一个确切的地址,然后单击后显示不同的城市名称?

时间:2018-07-19 02:21:14

标签: geocoding google-geocoder

此问题涉及Try It Yourself section on the Google Maps Place Autocomplete Address Sample的一种变体,您可以从中获得带有演示API密钥的小提琴。

问题在于,我花了两个小时尝试使其按我希望的方式工作后,才使它现在可以正常工作。当我键入以前居住的地址时,自动建议输入我的地址,北卡罗来纳州北霍普金斯市82 Hopkins rd,然后单击结果将其填入我的城镇,即康涅狄格州的利奇菲尔德,这实际上是一个较大的城镇Google显然也知道Northfield是个小城镇,因为它显示了我想要的确切地址,但是当我单击它时,为什么会显示Litchfield?如果我尝试其他城镇,等等。我看不到这种情况。我想象没有解决方案,因为当我尝试更改时: {types:['geocode']});到{types:['(city)']}));并尝试在Northfield中键入内容,然后显示Northfield镇的其他州,但没有显示康涅狄格州。因此,我想我的老城区太小了,Google不在乎,但是为什么要在自动建议中显示呢?奇怪...

import matplotlib.pyplot as plt
import numpy as np

n = 10
a = np.random.rand(1,n,n,1)

plt.imshow(a[0,:,:,0],cmap='hot')
plt.show()


k = 10
idx = np.argsort(a.ravel())[:-k-1:-1]
aidx = np.column_stack(np.unravel_index(idx, a.shape))
a[:]=0
a[aidx[:,0],aidx[:,1],aidx[:,2],aidx[:,3]] = 1

plt.imshow(a[0,:,:,0])
plt.show()

1 个答案:

答案 0 :(得分:1)

您之所以会看到这些结果,是因为诺斯菲尔德不是城市。根据Wikipedia的说法,Northfield, CT是“ Litchfield, Litchfield County, Connecticut镇中的一个未成立的村庄”。但是,您很幸运:您正在查看的示例使用的是API输出address_component,其中formatted_address正确地列为82 Hopkins Rd, Northfield, CT 06778, USA


"Geocoding Address Types section" in the Google Maps Javascript API documentation开始,有多种类型的地理编码结果。有些,例如locality,需要公司注册; sublocality_level_1sublocality_level_5指的是比这窄的区域。

即使没有Java语言,也可以进行搜索:

https://maps.googleapis.com/maps/api/place/findplacefromtext/json?key=YOUR_KEY&inputtype=textquery&input=82+hopkins+rd,+northfield,+ct

...获得ChIJZYpAVT2W54kRPnm9uVA3cpc的位置ID,然后可以进行后续的位置搜索:

https://maps.googleapis.com/maps/api/place/details/json?key=YOUR_KEY&place_id=ChIJZYpAVT2W54kRPnm9uVA3cpc

...以揭示地址类型的不同类型:

  "address_components" : [
     {
        "long_name" : "82",
        "short_name" : "82",
        "types" : [ "street_number" ]
     },
     {
        "long_name" : "Hopkins Road",
        "short_name" : "Hopkins Rd",
        "types" : [ "route" ]
     },
     {
        "long_name" : "Northfield",
        "short_name" : "Northfield",
        "types" : [ "neighborhood", "political" ]
     },
     {
        "long_name" : "Litchfield",
        "short_name" : "Litchfield",
        "types" : [ "locality", "political" ]
     },
     {
        "long_name" : "Litchfield",
        "short_name" : "Litchfield",
        "types" : [ "administrative_area_level_3", "political" ]
     },
     {
        "long_name" : "Litchfield County",
        "short_name" : "Litchfield County",
        "types" : [ "administrative_area_level_2", "political" ]
     },
     {
        "long_name" : "Connecticut",
        "short_name" : "CT",
        "types" : [ "administrative_area_level_1", "political" ]
     },
     {
        "long_name" : "United States",
        "short_name" : "US",
        "types" : [ "country", "political" ]
     },
     {
        "long_name" : "06778",
        "short_name" : "06778",
        "types" : [ "postal_code" ]
     }

在您看来,这也是formatted_address的{​​{1}},这正是您想要的。


在您引用的示例"try it yourself" section on the Place Autocomplete Address Form sample中,发生了两个单独的过程:自动完成功能搜索您的地址并建议格式化的地址,然后地点详细信息调用将地址的结构化部分拆包如所须。但是,如代码注释中所示:

82 Hopkins Rd, Northfield, CT 06778, USA

因此,通过调整格式as I have in this Fiddle,即使城市适当地位于利奇菲尔德,您也可以看到格式设置的地址包括列为邻居的诺斯菲尔德。请注意,这也是特定于位置的行为,因为“华盛顿特区宾夕法尼亚大道1600号”返回格式化格式的地址中“省略”的“西北华盛顿”邻域。 >

因此,要获得所需的行为,只需使用<!-- Note: Selection of address components in this example is typical. You may need to adjust it for the locations relevant to your app. See https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform --> ,或考虑扩展formatted_address以提供所需的粒度。