You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

当Google Maps API地址组件未提供城市名时如何获取正确城市名

关于Google地理编码API Locality字段返回子区域的问题

这其实是Google地理编码API的预期行为,不是bug哦~

为什么会出现这种差异?

Google的地理编码器是基于坐标所在的行政边界、地名数据库来返回地址组件的。像你遇到的塔林案例中,Kesklinna是塔林的一个市中心行政区,在地理编码数据库里被标记为locality层级;而100米外的坐标刚好落在了直接关联到城市“Tallinn”的边界内,所以返回了正确的城市名。这种情况在很多有细分行政区的城市都可能出现,核心原因是不同坐标对应的地名归属边界不同。

如何获取正确的城市名?

你可以通过遍历返回的address_components,根据不同地区的行政层级规则,筛选出最符合“城市”定义的组件,而不是只依赖locality字段。这里给你几个实用思路:

  • 优先匹配对应层级的行政区域
    不同国家的行政层级对应关系不同:

    • 对于欧洲多数国家(比如爱沙尼亚),administrative_area_level_2通常对应城市级别的区域;
    • 美国等国家,locality一般就是城市,administrative_area_level_2是县。
      你可以先判断目标坐标所在的国家,再针对性地筛选组件。
  • 示例代码(TypeScript,适配angular-maps场景)

function extractCity(addressComponents: google.maps.GeocoderAddressComponent[]): string | null {
  // 先获取国家代码,用于适配不同地区的层级规则
  const countryCode = addressComponents.find(comp => comp.types.includes('country'))?.short_name;
  
  // 针对爱沙尼亚(EE)的情况,优先取administrative_area_level_2作为城市
  if (countryCode === 'EE') {
    const city = addressComponents.find(comp => comp.types.includes('administrative_area_level_2'));
    if (city) return city.long_name;
  }
  
  // 通用场景:先找locality
  const locality = addressComponents.find(comp => comp.types.includes('locality'));
  if (locality) return locality.long_name;
  
  //  fallback:找administrative_area_level_2
  const adminLevel2 = addressComponents.find(comp => comp.types.includes('administrative_area_level_2'));
  if (adminLevel2) return adminLevel2.long_name;
  
  return null;
}
  • 缩小地理编码范围
    在发起地理编码请求时,通过components参数限定国家/地区(比如components=country:EE),可以让Google返回更贴合目标区域规则的地址组件,减少子区域被误返回为locality的概率。

内容的提问来源于stack exchange,提问作者Philip John

火山引擎 最新活动