Stata、R和百度地图API

Stata、R和百度地图API

这篇文章介绍了在Stata和R中使用百度地图接口的方法。Stata部分是复习之前的老博客,R部分是学习:badbye/baidumapChrisMuir/baidugeo。在文末,还有两个关于地图搜索的Alfred workflows的介绍。

Stata调用百度地图接口

爬虫俱乐部写了两个命令用来在Stata中调用百度地图接口,蛮好用。

使用chinagcode命令获取中文地址经纬度

Stata
1
ssc install chinagcode

首先你需要在百度开发平台上申请你自己的密钥,具体过程需要自己探索。

方式1:定义省市区和地址的组合提取经纬度

Stata
1
2
3
4
5
6
7
8
clear
input str10 prov str10 city str10 dist str60 addr
"广东省" "广州市" "番禺区" "暨南大学番禺校区"
"广东省" "" "" "暨南大学番禺校区"
"" "" "" "暨南大学番禺校区"
end
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) province(prov) city(city) district(dist) address(addr)
list

方式2:定义一个完整地址fulladdress选项来获得经纬度

Stata
1
2
3
4
5
6
7
8
clear all
input str60 fulladdr
"广东省广州市番禺区暨南大学番禺校区"
"广州市暨南大学番禺校区"
"广州市暨南大学" //这个定位的是校本部
end
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) fulladdress(fulladdr)
list

最好定义地址的方式是xx省xx市xx区xx路xx号,当同时使用上述两种格式定义地址时,会优先从省市区的组合提取经纬度,如果提取不到才会从完整的地址中提取。

如果加入了ffirst选项则会优先从完整地址中提取经纬度:

Stata
1
2
3
4
5
6
7
8
clear all
input str15 prov str15 city str15 dist str60 addr str100 fulladdr
"广东省" "广州市" "" "暨南大学番禺校区" ""
"" "广州市" "番禺区" "暨南大学番禺校区" "广东省广州市暨南大学"
"" "" "" "" "广东省广州市暨南大学"
end
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdr)
list

Stata
1
2
3
4
5
6
7
8
9
* 加上ffirst选项
clear all
input str15 prov str15 city str15 dist str60 addr str100 fulladdr
"广东省" "广州市" "" "暨南大学番禺校区" ""
"" "广州市" "番禺区" "暨南大学番禺校区" "广东省广州市暨南大学"
"" "" "" "" "广东省广州市暨南大学"
end
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdr) ffirst
list

还可以通过long()和lat()两个选项定义新生成的变量名:

Stata
1
2
3
4
5
6
7
8
9
10
clear all
input str15 prov str15 city str15 dist str60 addr str100 fulladdr
"广东省" "广州市" "" "暨南大学番禺校区" ""
"" "广州市" "番禺区" "暨南大学番禺校区" "广东省广州市暨南大学"
"" "" "" "" "广东省广州市暨南大学"
end
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) ///
province(prov) city(city) district(dist) address(addr) ///
fulladdress(fulladdr) ffirst long(long1) lat(lat1)
list

chinaaddress命令从经纬度获取地址

Stata
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* chinaaddress命令从经纬度获取地址 */
clear all
input str15 prov str15 city str15 dist str60 addr str100 fulladdr
"广东省" "广州市" "" "暨南大学番禺校区" ""
"" "广州市" "番禺区" "暨南大学番禺校区" "广东省广州市暨南大学"
"" "" "" "" "广东省广州市暨南大学"
end
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) ///
province(prov) city(city) district(dist) address(addr) ///
fulladdress(fulladdr) ffirst long(long1) lat(lat1)
list
keep long1 lat1
chinaaddress, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) long(long1) lat(lat1)
list

R——baidumap包:百度地图的R接口

该项目的GitHub地址为:badbye/baidumap

安装

1
2
library(devtools)
install_github('badbye/baidumap')

设定百度密钥

1
2
library(baidumap)
options(baidumap.key = 'tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl')

从经纬度获取地点

返回json格式

1
2
3
4
5
6
7
8
9
# 创建一个经纬度矩阵
(lon = matrix(c(117.93780, 24.55730, 117.93291, 24.57745, 117.23530, 24.64210, 117.05890, 24.74860), byrow=T, ncol=2))

# json格式的返回
(location_json <- getLocation(lon[1, ], output = 'json'))

# 结果
# lon=117.9378;lat=24.5573
# "{\"status\":0,\"result\":{\"location\":{\"lng\":117.93779999999997,\"lat\":24.55730001900564},\"formatted_address\":\"福建省厦门市海沧区霞涂楼东路\",\"business\":\"东孚\",\"addressComponent\":{\"country\":\"中国\",\"country_code\":0,\"country_code_iso\":\"CHN\",\"country_code_iso2\":\"CN\",\"province\":\"福建省\",\"city\":\"厦门市\",\"city_level\":2,\"district\":\"海沧区\",\"town\":\"\",\"adcode\":\"350205\",\"street\":\"霞涂楼东路\",\"street_number\":\"\",\"direction\":\"\",\"distance\":\"\"},\"pois\":[],\"roads\":[],\"poiRegions\":[],\"sematic_description\":\"海沧区启翔幼儿园西南209米\",\"cityCode\":194}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 从json格式中提取数据
locationlist <- jsonlite::fromJSON(location_json)
# 该经纬度对应的完整地址为:
country <- locationlist$result$addressComponent$country
prov <- locationlist$result$addressComponent$province
city <- locationlist$result$addressComponent$city
detail <- locationlist$result$sematic_description

print(
paste0("(117.9378, 24.5573)", "对应的地址为: ", country, prov, city, detail)
)

# 结果
# [1] "(117.9378, 24.5573)对应的地址为: 中国福建省厦门市海沧区启翔幼儿园西南209米"

返回xml格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(location_xml <- getLocation(lon[1, ], output = 'xml'))
location_xml2list <- xml2::as_list(xml2::as_xml_document(location_xml))

# 结果
# lon=117.9378;lat=24.5573
# "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<GeocoderSearchResponse>\n\t<status>0</status>\n\t<result>\n\t\t<location>\n\t\t\t<lng>117.9378</lng>\n\t\t\t<lat>24.557300019</lat>\n\t\t</location>\n\t\t<formatted_address>福建省厦门市海沧区霞涂楼东路</formatted_address>\n\t\t<business>东孚</business>\n\t\t<addressComponent>\n\t\t\t<country>中国</country>\n\t\t\t<country_code>0</country_code>\n\t\t\t<country_code_iso>CHN</country_code_iso>\n\t\t\t<country_code_iso2>CN</country_code_iso2>\n\t\t\t<province>福建省</province>\n\t\t\t<city>厦门市</city>\n\t\t\t<city_level>2</city_level>\n\t\t\t<district>海沧区</district>\n\t\t\t<town/>\n\t\t\t<adcode>350205</adcode>\n\t\t\t<street>霞涂楼东路</street>\n\t\t\t<street_number/>\n\t\t\t<direction/>\n\t\t\t<distance/>\n\t\t</addressComponent>\n\t\t<pois/>\n\t\t<roads/>\n\t\t<poiRegions/>\n\t\t<sematic_description>海沧区启翔幼儿园西南209米</sematic_description>\n\t\t<cityCode>194</cityCode>\n\t</result>\n</GeocoderSearchResponse>\n\n"

country1 <- location_xml2list$GeocoderSearchResponse$result$addressComponent$country[[1]]
prov1 <- location_xml2list$GeocoderSearchResponse$result$addressComponent$province[[1]]
city1 <- location_xml2list$GeocoderSearchResponse$result$addressComponent$city[[1]]
detail1 <- location_xml2list$GeocoderSearchResponse$result$sematic_description[[1]]
print(
paste0("(117.9378, 24.5573)", "对应的地址为: ", country1, prov1, city1, detail1)
)

# 结果
# [1] "(117.9378, 24.5573)对应的地址为: 中国福建省厦门市海沧区启翔幼儿园西南209米"

返回matrix

1
2
3
> (location = getLocation(lon[1, ], formatted = T))
lon=117.9378;lat=24.5573
"福建省厦门市海沧区霞涂楼东路"

从地点获取经纬度

1
2
3
4
5
6
7
8
# json格式
getCoordinate('暨南大学番禺校区')
# xml格式
getCoordinate('暨南大学番禺校区', output = 'xml')
# matrix格式
getCoordinate('暨南大学番禺校区', formatted = T)
# 同时获取多个地点的经纬度
getCoordinate(c('暨南大学石牌校区', '暨南大学番禺校区'), formatted = T)

获取百度地图

1
2
3
4
5
p <- getBaiduMap(c(113.42251, 23.02138))
library(ggmap)
ggmap(p) +
geom_text(x = 113.42251, y = 23, label = "暨南大学番禺校区", family = "STSong", size = 6, colour = 'red', fontface = "bold") +
geom_point(x = 113.42251, y = 23.02138, size = 5, colour = 'red', shape = 20)

baidugeo:另一个用于调用百度地图接口的R包

不同于上面的那个R包,这个包获取数据后会先把数据缓存为包内数据。该包地址为:ChrisMuir/baidugeo

安装

1
devtools::install_github("ChrisMuir/baidugeo")

设置百度密钥

1
2
library(baidugeo)
bmap_set_key("tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl")

使用

查看该密钥的基本信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
bmap_rate_limit_info()

$current_key
[1] "tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl"

$daily_query_limit
[1] 5950

$daily_queries_remaining
[1] 5947

$daily_limit_reset_time
[1] "2018-11-09 15:22:33 CST"

设定每日请求上限为5950:

1
bmap_set_daily_rate_limit(5950)

根据地址获取经纬度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 根据地址获取经纬度
locs <- c(
"中百超市有限公司长堤街二分店",
"浙江省杭州市余杭区径山镇小古城村",
"成都高梁红餐饮管理有限公司"
)
# 这个获取的是数据框
(coords_df <- bmap_get_coords(locs))

# 结果
# location lon lat status precise confidence comprehension level
# 1 中百超市有限公司长堤街二分店 114.2729 30.61617 0 1 80 95 UNKNOWN
# 2 浙江省杭州市余杭区径山镇小古城村 119.8783 30.39625 0 0 30 100 乡镇
# 3 成都高梁红餐饮管理有限公司 104.0679 30.67994 0 0 12 29 城市

再根据经纬度获取地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
addrs_df <- bmap_get_location(coords_df$lat, coords_df$lon)

# 结果
# input_lon input_lat return_lon return_lat status formatted_address business country country_code
# 1 114.2729 30.61617 114.2729 30.61617 0 湖北省武汉市江汉区新华路630号 汉口火车站,常青路,北湖 中国 0
# 2 119.8783 30.39625 119.8783 30.39625 0 浙江省杭州市余杭区潘金线 <NA> 中国 0
# 3 104.0679 30.67994 104.0679 30.67994 0 四川省成都市青羊区王家塘街84号 骡马市,新华西路,八宝街 中国 0
# country_code_iso country_code_iso2 province city city_level district town ad_code street street_number direction
# 1 CHN CN 湖北省 武汉市 2 江汉区 <NA> 420103 新华路 630号 附近
# 2 CHN CN 浙江省 杭州市 2 余杭区 <NA> 330110 潘金线 <NA> <NA>
# 3 CHN CN 四川省 成都市 2 青羊区 <NA> 510105 王家塘街 84号 附近
# distance sematic_desc city_code
# 1 9 <NA> 218
# 2 NA <NA> 179
# 3 6 <NA> 75

清除缓存

1
bmap_clear_cache(coordinate_cache = TRUE, address_cache = TRUE)

获取缓存数据

1
2
3
4
# 缓存的经纬度数据
df <- bmap_get_cached_coord_data()
# 缓存的地址数据
df <- bmap_get_cached_address_data()

Alfred workflow

百度地图的alfred workflow

项目地址:wofeiwo/alfred-baidu-map

高德地图的alfred workflow

项目地址:wofeiwo/alfred-amap

# R, Stata

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了329.8k个字了!

庆祝
计算机二级MySQL考试通过!
成功
网站成功开启https!
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×

keyboard_arrow_up