谷歌反向地理编码JSON:全球匹配城市名称的属性是什么?

时间:2017-07-01 16:24:10

标签: php json google-maps google-maps-api-3

我使用Google Reverse Geocoding来解析世界各地的坐标。 我在匹配正确的行政区域级别时遇到了困难。对于JSON响应中的每个国家/地区。

以下是回复示例:https://maps.googleapis.com/maps/api/geocode/json?latlng=40.709073,%20-74.007506&language=en-EN

根据Address Types and Address Component Types我可以搜索其中的财产:

  • 政治
  • administrative_area_level_1
  • administrative_area_level_2
  • administrative_area_level_3
  • administrative_area_level_4
  • administrative_area_level_5
  • colloquial_area
  • 局部性
  • 病房
  • sublocality
  • 附近

这是我尝试使用PHP函数:

public static function getCity($json) {
    $types = array('administrative_area_level_1', 'administrative_area_level_2', 'administrative_area_level_3', 'locality', 'country');

    foreach ($json["results"] as $result) {
        foreach ($types as $t) {

            if ($city = self::Find_Long_Name_Given_Type($t, $result['address_components'])) {
                return $city;
            }
        } 
    }
}

private static function Find_Long_Name_Given_Type($type, $array, $short_name = false) {
    foreach ($array as $value) {
        if (in_array($type, $value["types"])) {
            if ($short_name) {
                return $value["short_name"];
            }
            return $value["long_name"];
        }
    }
}

(正如您所看到的,如果没有给出其他属性,我会搜索国家/地区)

我注意到有些地方至少有上述列表中的所有属性中的一个。那么,对于世界上所有城市来说,值得拥有的财产应该是什么? 我应该如何解析每对坐标以获得城市的正确(英文)名称?

例如,我注意到某个字段包含欧洲城市的城市名称,但与美国城市的字段不同。那么,我怎样才能为世界上每个国家获得正确的财产?

1 个答案:

答案 0 :(得分:1)

我认为全球城市名称没有唯一的属性(地址组件)。在同一国家/地区的不同国家和地区,您可以在不同的地址组件中使用城市名称。我认为地址组件的选择取决于Google在不同国家/地区使用的内部数据建模。

查看以下示例页面: https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform

您可以在此页面上看到以下说明

  

您可能需要调整它以与每个国家/地区的邮政地址保持一致。此示例显示数据库中的 locality 地址组件。这通常代表着这个城市。但是,在英国和瑞典,正确的组件是 postal_town ,而日本的正确组件在不同的县都不同。布鲁克林和纽约市的其他地方不使用该城市作为地址的一部分。他们使用 sublocality_level_1

所以,至少你可以玩那里提到的locality,postal_town和sublocality_level_1。

希望这有帮助!