申请高德地图 API
首先进入高德开放平台 https://lbs.amap.com/,点击右上角登录或注册。注册后在主界面点击开发支持
进入Web服务API
,点击创建工程:获取 key
然后依照说明申请即可。
申请后再回到Web服务API
页面,选择API文档:地理/逆地理编码
,仔细阅读说明特别是 API 的 URL 和调用方法。然后点击右上方头像,选择应用管理。
依次点击 应用管理:我的应用
-> 创建新应用
-> 填写、新建
。之后点击右上方 添加
-> 为 XXX 添加 key
,其中特别注意选择 Web 服务
。之后就能看到 key 了。
地理编码
读取数据
Code
library(tidyverse)
data <- read.csv("data/清洗后的数据.csv", encoding = "UTF-8")
data %>% head() %>% knitr::kable()
共建研究院 |
浙江大学绍兴研究院 |
浙江省绍兴市越城区迪荡湖隧道科学园3号楼26-27层 |
共建研究院 |
天津大学浙江国际创新设计与智造研究院 |
浙江省绍兴市越城区洋泾湖科创园1号楼 |
共建研究院 |
上海大学绍兴研究院 |
浙江省绍兴市越城区三江路78号 |
共建研究院 |
浙江工业大学绍兴研究院 |
浙江省绍兴市越城区洋泾湖科创园2号楼 |
共建研究院 |
江南大学(绍兴)产业技术研究院 |
浙江省绍兴市越城区洋江东路19号 |
共建研究院 |
中国纺织科学研究院江南分院 |
浙江省绍兴市越城区双堰路30号 |
调用高德地图 API 进行地理编码
地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力。
地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。 结构化地址举例:北京市朝阳区阜通东大街6号转换后经纬度:116.480881,39.989410 地标性建筑举例:天安门转换后经纬度:116.397499,39.908722
逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。 例如:116.480881,39.989410 转换地址描述后:北京市朝阳区阜通东大街6号
其实调用 API 的过程和爬虫差不多,注意同样要设置停止时间 Sys.sleep()
防止请求频率过高被 ban。使用 for 循环遍历每家企业的地址进行地理编码,再写入 csv 文件中。
Code
library(httr)
library(jsonlite)
# 输入高德地图API的key
amap_key <- "我的key"
# 循环处理每个企业的地址
for (i in 1:nrow(data)) {
address <- data[i, "clean_address"]
# 构造请求
url <- paste0("https://restapi.amap.com/v3/geocode/geo?address=", address, "&key=", amap_key)
# 发送HTTP请求并获取响应JSON
response <- GET(url)
response_json <- content(response, "text", encoding = "UTF-8")
response_json <- jsonlite::fromJSON(response_json)
# 解析响应JSON并获取经纬度
if (response_json$status == "1" && length(response_json$geocodes) > 0) {
# status为1意味着解析成功
location <- response_json$geocodes$location
longitude_latitude <- strsplit(location, ",")[[1]]
data[i, "longitude"] <- as.numeric(longitude_latitude[1])
data[i, "latitude"] <- as.numeric(longitude_latitude[2])
} else {
data[i, "longitude"] <- NA
data[i, "latitude"] <- NA
}
# sleep one second to avoid getting banned by AMAP API
Sys.sleep(1)
print(i)
}
# 将结果写回到csv文件中
data <- data %>% filter(!is.na(clean_address))
write_excel_csv(data, "data/地址经纬度数据.csv")
代码中的 if-else
语句用于处理地理编码不成功的个例,将接入 API 后没有查询到的企业或者解析不成功的企业的经纬度赋值为 NA。其实这里应该使用异常处理语句会更好。R 语言的异常处理是什么样的呢?