高德地图和百度地图都提供了坐标拾取系统,通过坐标查询或坐标反查操作可以查询一个地址对应的经纬度或经纬度对应的地址名称。但是,手动查询的方式效率很低,也不能进行批量查询。
本篇就来介绍在R语言中调用高德地图API来进行快速、批量查询的方法。使用高德地图API前先需要申请一个Key,因此在介绍具体代码之前,先来介绍如何申请一个Key。
1 高德地图API Key
高德地图的API Key是一串由数字和字母组成的文本。
首先在浏览器中搜索“高德地图API”或者直接点击链接“https://lbs.amap.com/api/webservice/summary/”可进入高德地图API的“概述”界面,注册并登录,如下图所示。

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

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

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

点击“阅读并同意”和“提交”按钮后,申请过程就完成了。
2 地理编码
在第一幅图所示的界面,点击左侧的“地理/逆地理编码”栏,或者直接点击下方的链接:
https://lbs.amap.com/api/webservice/guide/api/georegeo
打开的界面就是高德地图API的地理编码和逆地理编码的使用方法。本节先介绍地理编码,下节再介绍地理逆编码。
2.1 单个查询
如下图所示;第二红框内提供了地理编码的服务地址:https://restapi.amap.com/v3/geocode/geo?parameters。

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

在使用时将地址中的parameters
替换成相应的参数即可;参数key
和address
是必需参数;多个参数之间使用&
符号连接,如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
中。

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
参数可以使用|
进行间隔,具体介绍见下图。

示例代码:
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
参数及其说明:

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