自己有一个习惯,就是每到一个新地点,就会在手机里的高德地图APP上把这个地点标记一下,这样就能记录下自己的👣啦。
现在我的高德APP首页的地图效果是这样的:

昨天突发奇想,是不是可以把这些地点爬下来,自己画出这幅地图。
然后就开工了,打开网页版的高德地图,把自己的帐户登录上去:

打开检查,多刷新几次,就能找到这个了:

是个json格式的数据,接下来就是把这个数据整理好了,首先是把curl请求转成R语句,这里用到了curl2r命令,这个命令我在前面的这篇推文里使用过:比特币评论分析。
1 2 3 4 5 6 7 8
| $ curl2r curl 'https://www.amap.com/service/fav/ ...(含隐私信息,所以省略) --compressed
library(httr) GET("https://www.amap.com/service/fav/getFav?ver=", add_headers(c(`Accept-Encoding` = "gzip, deflate, br", `x-csrf-token` = "d3c13a48aa03...c2700de406b7cf", ···(含隐私信息,所以省略) isg = "BAAA-t8kSIzv5zT7ukQolFgH...HqRzJuu9aAfIpm049bDCR2QxZwr")))
|
然后就可以把返回结果直接复制到R脚本里用了。
整理地点数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| library(jsonlite) library(httr) http <- GET("https://www.amap.com/service/fav/getFav?ver=", add_headers(c(`Accept-Encoding` = "gzip, deflate, br", `x-csrf-token` = "d3c13a48aa03...c2700de406b7cf", ···(含隐私信息,所以省略) isg = "BAAA-t8kSIzv5zT7ukQolFgH...HqRzJuu9aAfIpm049bDCR2QxZwr")))
json <- content(http) %>% .$data df <- data.frame( name = NA, address = NA, create_time = NA, city_code = NA ) for(i in 1:length(json$items)){ try( df <- rbind( df, data.frame( name = json$items[[i]]$data$name, address = json$items[[i]]$data$address, create_time = json$items[[i]]$data$create_time_format, city_code = json$items[[i]]$data$city_code ) ) ) }
library(dplyr) df <- df %>% filter(!is.na(name)) %>% mutate(create_time) library(readr) write_csv(df, "高德地图收藏地点.csv")
|
因为上面的数据集里并没有经纬度数据,所以我又自己算了一下经纬度数据。下面是使用Stata的chinagcode命令进行经纬度计算。为了提供准确性,我先把城市编码转为城市名称,这里我是通过merge另外一个数据集实现的,这个数据集的下载地址为:中国城市代码对照表.xlsx
Stata 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| clear all cd ~/Desktop import excel "中国城市代码对照表.xlsx", sheet("Sheet1") firstrow clear keep 城市编码 城市名称 ren 城市编码 city_code tostring city_code, replace replace city_code = city_code + "00" ren 城市名称 city_name save citycode, replace import delimited 高德地图收藏地点.csv, varnames(1) encoding(utf8) clear tostring city_code, replace merge m:1 city_code using citycode keep if _m == 3 drop _m gen addr = address + " " + name chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) city(city_name) address(address) save 高德地图收藏地点, replace
|
这样得到的数据集里就有经纬度数据了,下面再次回到R进行处理。
绘制地图
下面的代码里,我找了个svg图片作为点标记,这个svg图片的下载地址为:star.svg。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| library(haven) da <- read_dta("高德地图收藏地点.dta") library(leafletCN) library(leaflet)
staricon <- makeIcon( iconUrl = 'star.svg', iconWidth = 20, iconHeight = 20 )
map <- leaflet() %>% setView(lng = 103.23, lat = 35.33, zoom = 4) %>% amap() %>% addMarkers(lng = da$longitude, lat = da$latitude, popup = paste0("<b>地点:</b>", da$address, "<br>", "<b>创建时间:</b>", da$create_time), icon = staricon) %>% print()
map %>% htmlwidgets::saveWidget("amap.html")
|

收藏点的地理分布
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| da %>% mutate( city_name = city_name %>% fct_infreq() %>% fct_rev() ) %>% ggplot() + geom_bar(aes(x = city_name, fill = ..count..)) + scale_fill_continuous(high = "#2b908f", low = "#90ed7d") + guides(fill = "none") + coord_flip() + labs(x = "点数", y = "城市", title = "高德地图收藏地点分布") + theme(axis.text.y = element_text(size = 8))
|
