我的高德地图地点收藏

我的高德地图地点收藏

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

现在我的高德 APP 首页的地图效果是这样的:

昨天突发奇想,是不是可以把这些地点爬下来,自己画出这幅地图。

然后就开工了,打开网页版的高德地图,把自己的帐户登录上去:

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

是个 json 格式的数据,接下来就是把这个数据整理好了,首先是把 curl 请求转成 R 语句,这里用到了curl2r命令,这个命令我在前面的这篇推文里使用过:比特币评论分析

Shell
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 脚本里用了。

整理地点数据

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

R
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")

收藏点的地理分布

R
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))

# R, Stata

Comments

Your browser is out-of-date!

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

×