Google 地理编码 api 不返回某些 'direct hit' 地址的 postal_code

Google Geocode api not returning postal_code for some 'direct hit' addresses

这些似乎不是 partial_matches 所以我想知道为什么它没有带回所有数据,特别是 postal_code.

通过仔细检查 google 地图,这就是我想要的确切地址。换句话说就是直接命中。

Python代码:

address = '34 new street, Green road, Carlow'

geocode_url = "https://maps.googleapis.com/maps/api/geocode/json?address={}&key={}".format(address,api_key)

# Ping google for the reuslts:
results = requests.get(geocode_url)
# Results will be in JSON format - convert to dict using requests functionality
results = results.json()

和结果。这里应该有一个postal_code数据吧?没什么可说的,这只是部分匹配。

{'results': [{'address_components': [{'long_name': '34',
     'short_name': '34',
     'types': ['street_number']},
    {'long_name': 'New Street', 'short_name': 'New St', 'types': ['route']},
    {'long_name': 'Moanacurragh',
     'short_name': 'Moanacurragh',
     'types': ['neighborhood', 'political']},
    {'long_name': 'Carlow',
     'short_name': 'Carlow',
     'types': ['locality', 'political']},
    {'long_name': 'County Carlow',
     'short_name': 'County Carlow',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'Ireland',
     'short_name': 'IE',
     'types': ['country', 'political']}],
   'formatted_address': '34 New St, Moanacurragh, Carlow, Ireland',
   'geometry': {'location': {'lat': 52.8296466, 'lng': -6.9331115},
    'location_type': 'RANGE_INTERPOLATED',
    'viewport': {'northeast': {'lat': 52.83099558029149,
      'lng': -6.931762519708498},
     'southwest': {'lat': 52.82829761970849, 'lng': -6.934460480291502}}},
   'place_id': 'EhozNCBOZXcgU3QsIENhcmxvdywgSXJlbGFuZCIaEhgKFAoSCZ93HqizQl1IEZZMDB0YIkdXECI',
   'types': ['street_address']}],
 'status': 'OK'}

现在,如果我在官方邮政编码数据库(爱尔兰)中输入完全相同的字符串,它会 returns 邮政编码。

顺便说下官方数据库是here,你可以试试地址串'34 new street, Green road, Carlow'

关于“34 new street, Green road, Carlow”的示例请求,您应该注意两点。

  1. 如您所见,结果具有 RANGE_INTERPOLATED 位置类型,而不是 ROOFTOP。这意味着 Google 在他们的数据库中没有确切的地址,他们试图根据其他现有特征猜测(内插)地址的位置。

  2. 如果您对插值点 (52.8296466,-6.9331115) 和位置类型邮政编码 https://maps.googleapis.com/maps/api/geocode/json?latlng=52.8296466%2C-6.9331115&result_type=postal_code&key=YOUR_API_KEY 执行反向地理编码请求,您将得到以下响应

    { "plus_code":{ "compound_code":"R3H8+VQ Carlow, County Carlow, Ireland", "global_code":"9C4MR3H8+VQ" }, "results":[ ], "status":"ZERO_RESULTS" }

因此,在 Google 数据库中没有包含点 (52.8296466,-6.9331115) 的邮政编码多边形。您在 Google 端面临数据问题。

我建议联系 Google 数据团队并按照他们的帮助中心所述报告数据问题:

https://support.google.com/maps/answer/6320846

希望Google能尽快修复。

只需使用坐标查找邮政编码,但首先,使用地址查找坐标。

$apiKey = 'API_KEY';
$address = '&address=' . urlencode( $_POST['address'] )
$url = "https://maps.googleapis.com/maps/api/geocode/json?key={$apiKey}{$address}";
$resp_json = file_get_contents($url);
// decode the json
$resp = json_decode($resp_json, true);

// get the important data
$lat = $resp['results'][0]['geometry']['location']['lat'] ?? "";
$lng = $resp['results'][0]['geometry']['location']['lng'] ?? "";
$cityCoce = "https://maps.googleapis.com/maps/api/geocode/json?key{$apiKey}&latlng=$lat,$lng";