技巧 | 在R语言中使用高德地图的API进行地理/逆地理编码(地址与经纬度的相互转换)...

高德地图和百度地图都提供了坐标拾取系统,通过坐标查询或坐标反查操作可以查询一个地址对应的经纬度或经纬度对应的地址名称。但是,手动查询的方式效率很低,也不能进行批量查询。

本篇就来介绍在R语言中调用高德地图API来进行快速、批量查询的方法。使用高德地图API前先需要申请一个Key,因此在介绍具体代码之前,先来介绍如何申请一个Key。

1 高德地图API Key

高德地图的API Key是一串由数字和字母组成的文本。

首先在浏览器中搜索“高德地图API”或者直接点击链接“https://lbs.amap.com/api/webservice/summary/”可进入高德地图API的“概述”界面,注册并登录,如下图所示。

e16823d01c382a385de577672cb62b4e.png

读者可以通过浏览该界面的内容,对Web API有个大致的了解;在界面底端可以看到一个如下图所示的“获取API Key”按钮,点击进去。

35ccd930986d405805bb25774880cfa7.png

然后再点击右上角的“创建新应用”按钮,此举相当于创建一个管理Key的文件夹,因为平台是允许单个用户申请多个API Key的。

77bd1f0d6f0da650c2d8a1cefdae5633.png

在创建应用后,就可以点击“添加”按钮来申请Key了。如下图所示,Key名称可以自行命名,“服务平台”选择“Web服务”,“可使用服务”会自动显示该类型范围对应的功能。

92ae36f24c6edaf6c526fe0735abf516.png

点击“阅读并同意”和“提交”按钮后,申请过程就完成了。

2 地理编码

在第一幅图所示的界面,点击左侧的“地理/逆地理编码”栏,或者直接点击下方的链接:

https://lbs.amap.com/api/webservice/guide/api/georegeo

打开的界面就是高德地图API的地理编码和逆地理编码的使用方法。本节先介绍地理编码,下节再介绍地理逆编码。

2.1 单个查询

如下图所示;第二红框内提供了地理编码的服务地址:https://restapi.amap.com/v3/geocode/geo?parameters。

b0dc7336761d6637817f3b829f027c1e.png

这个服务地址由两部分组成:一部分是固定的前缀https://restapi.amap.com/v3/geocode/geo?;另一部分是可变的参数parameters。可用的参数及其说明见下图。

885d660e4c307c1ccdbc5307c4f07f1f.png

在使用时将地址中的parameters替换成相应的参数即可;参数keyaddress是必需参数;多个参数之间使用&符号连接,如key=1234&address=北京市通州区

API接口返回的数据格式为JSON或XML。从上图output参数可以看出,JSON为默认格式。在R语言中,可以使用jsonlite工具包中的fromJSON()函数来提取相应的信息。

library(jsonlite)
a <- fromJSON("https://restapi.amap.com/v3/geocode/geo?address=北京市朝阳区阜通东大街6号&key=70689caec277e125c9a1")
  • 代码中的key为无效值,各位读者可以将其替换成自己申请的Key。

上面代码得到的a是一个列表结构的数据,其包含的字段如下图所示,其中经纬度信息储存在$geocodes$location中。

07c9f105ac82dc7e90b9e3e2a2456a6f.png
a$geocodes$location
## [1] "116.482086,39.990496"
  • 需要注意的是,这里获取的经纬度是加密后的数值,与WGS坐标相比有偏移。

2.2 批量查询

批量查询可以利用for循环或者apply族、map族函数,下面提供一个例子。

library(tidyverse)
library(magrittr)
library(jsonlite)
## 对`fromJSPN()`函数进行改造,使之仅返回经纬度信息
lonlat <- function(x) return(fromJSON(x)$geocodes$location)

## 示例数据
key <- "706188c0afec277e12522bb5c9a1"  ## 替换成自己的Key
data <- data.frame(
  dizhi = c("北京市天安门", "北京师范大学",
            "北京市通州区梨园镇"
))

## 使用map函数
data %<>%
  mutate(url = paste0("https://restapi.amap.com/v3/geocode/geo?",
                      "key=", key,
                      "&address=", dizhi),
         json = map(url, lonlat))
  
data$json
## [[1]]
## [1] "116.397477,39.908692"
## 
## [[2]]
## [1] "116.364139,39.962637"
## 
## [[3]]
## [1] "116.662951,39.866859"

上述批量查询的方法,实际上每次只查询了一个地址。当batch参数设置为true时,可以一次至多对10个地址进行查询;此时address参数可以使用|进行间隔,具体介绍见下图。

e4c51e6e8b0c784fe69701cf392613ee.png

示例代码:

dizhi = paste0("北京市海淀区新街口外大街", 19:29, "号")
paste0(dizhi, collapse = "|") 
## [1] "北京市海淀区新街口外大街19号|北京市海淀区新街口外大街20号|北京市海淀区新街口外大街21号|北京市海淀区新街口外大街22号|北京市海淀区新街口外大街23号|北京市海淀区新街口外大街24号|北京市海淀区新街口外大街25号|北京市海淀区新街口外大街26号|北京市海淀区新街口外大街27号|北京市海淀区新街口外大街28号|北京市海淀区新街口外大街29号"

paste0("https://restapi.amap.com/v3/geocode/geo?",
       "key=", key,
       "&batch=true",
       "&address=") %>%
  paste0(paste0(dizhi, collapse = "|")) %T>%
  print() %>%
  fromJSON() -> a
## [1] "https://restapi.amap.com/v3/geocode/geo?key=706188c0af89caec277e12522bb5c9a1&batch=true&address=北京市海淀区新街口外大街19号|北京市海淀区新街口外大街20号|北京市海淀区新街口外大街21号|北京市海淀区新街口外大街22号|北京市海淀区新街口外大街23号|北京市海淀区新街口外大街24号|北京市海淀区新街口外大街25号|北京市海淀区新街口外大街26号|北京市海淀区新街口外大街27号|北京市海淀区新街口外大街28号|北京市海淀区新街口外大街29号"

a$geocodes$location
##  [1] "116.366301,39.961575" "116.370333,39.961966" "116.370953,39.957542"
##  [4] "116.368826,39.958226" "116.371613,39.956099" "116.370891,39.958173"
##  [7] "116.370809,39.953157" "116.370891,39.958173" "116.371244,39.952472"
## [10] "116.372080,39.953763"

3 逆地理编码

逆地理编码与地理编码的使用方法是类似的,这里仅作简要介绍。

API服务地址的形式:

https://restapi.amap.com/v3/geocode/regeo?parameters

参数及其说明:

83e9e98a9586168055285c83c46fb26e.png

上述信息具体可在网址“https://lbs.amap.com/api/webservice/guide/api/georegeo”中查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值