google地图逆地理编码处理返回结果/google地图逆地理编码返回结果处理

11 篇文章 0 订阅
10 篇文章 0 订阅

只要使用了 google 地图的逆地理编码就会知道 google 提供的逆地理 API 返回的结果是一个 JSON
数组,这个数组的内容是随机性的, 并不是固定的, 如果不知道规律的话, 获取定位的信息还是比较麻烦的

在参考了 google 官方文档后, 我整理了以下知识点:

  • 返回的数组是无序不固定的, 但是数组下标越靠前, 编码信息越详细(数组第一个值就是最详细的)
  • 返回的结果数组中每一个对象中的 types 都对应着这个值所对应的内容 (types 返回的都是数组, 所以以舒服第一个值为准 types[0] )
    比如
        types[0] 的值是 country 时, 说明这个对象的 long_name 对应的是国家

具体 types 中的 key 对应 的 value 如下所示 street_address 表示精确的街道地址。

route:表示已命名的路线(例如“US 101”)
intersection:表示主要交叉路口,通常是两条主要道路的交叉路口
political:表示政治实体。通常,这种类型表示某个民政管理部门的多边形
country:表示国家政治实体,通常是由地理编码器返回的最高级别类型
administrative_area_level_1:表示国家/地区级别以下的一级行政实体。在美国,这种行政级别就是州。并非所有国家都设有这类行政级别
administrative_area_level_2:表示国家/地区级别以下的二级行政实体。在美国,这种行政级别就是县。并非所有国家都设有这类行政级别
administrative_area_level_3:表示国家/地区级别以下的三级行政实体。此类型表示较小的行政区划单位。并非所有国家都设有这类行政级别
administrative_area_level_4:表示国家/地区级别以下的四级行政实体。此类型表示较小的行政区划单位。并非所有国家都设有这类行政级别
administrative_area_level_5:表示国家/地区级别以下的五级行政实体。此类型表示较小的行政区划单位。并非所有国家都设有这类行政级别
colloquial_area:表示实体的常用替代名称
locality:表示合并的城市或城镇政治实体。
ward:表示一种特定的日本行政区划类型,以便于区分某个日本地址中的多个行政区划组成部分。
sublocality:表示 locality以下的一级行政实体。某些位置可能会收到其他类型之一:从 sublocality_level_1 到sublocality_level_5。每个 sublocality 级别都是一个行政实体。数字越大,表示的地理区域越小
neighborhood:表示已命名的街区 premise 表示已命名的位置,通常是具有常见名称的一栋或一群建筑物
subpremise:表示指定位置以下的一级实体,通常是同名建筑群中的单个建筑物 postal_code 表示邮政编码,用于国内的地址邮寄。
natural_feature:表示著名的自然景观
airport:表示机场
park:表示已命名的公园。
point_of_interest:表示已命名的景点。通常,这些“景点”是不容易归入其他类别的著名地方实体,如“帝国大厦”或“自由女神像”。

下面贴上代码

async initMap() {
  // 创建地图
  let map = await new this.google.maps.Map({
    zoom: 8,
    center: { lat: this.lat, lng: this.lng }
  });

  let geocoder = await new this.google.maps.Geocoder();
  let infowindow = await new this.google.maps.InfoWindow();
  await this.geocodeLatLng(geocoder, map, infowindow);
},
// 逆地理编码
googleGeocode(geocoder, map, infowindow) {
  geocoder.geocode({ location: {lat: this.lat, lng: this.lng} }, (results, status) => {
    if (status === 'OK') {
      if (results[0]) {
        // 默认返回的第一条数据是最详细的, 所以直接使用返回的第一条数据即可
        // 这里分别使用 国家, 省, 市, 详细街道信息
        this.positioningDetails = { country: '', province: '', city: '', address: results[0].formatted_address };
        let exactAddress = results[0].address_components;

        // 因为返回的是数组, 所以需要循环判断要取的是哪一个对象
        for (let i = 0; i < exactAddress.length; i++) {
          // types 的第一个下标是 country 代表是国家
          if (exactAddress[i].types[0] == 'country') {
            positioningDetails.country = exactAddress[i].long_name;
          // types 的第一个下标是 administrative_area_level_1 代表是省,国外是邦/州 等等..
          } else if (exactAddress[i].types[0] == 'administrative_area_level_1') {
            positioningDetails.province = exactAddress[i].long_name;
          // types 的第一个下标是 locality 代表是城市
          } else if (exactAddress[i].types[0] == 'locality') {
            positioningDetails.city = exactAddress[i].long_name;
          }
        }
        // 循环之后 positioningDetails 里面就存储了我们所需要的逆地理编码出来的 国家/省/市 以及详细地址
        let marker = new this.google.maps.Marker({
          position: {lat: this.lat, lng: this.lng},
          map: map
        });
        infowindow.setContent(results[0].formatted_address);
        infowindow.open(map, marker);
      } else {
        Toast('No results found');
      }
    } else {
    }
  });
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值