高德地图开发者文档_在 R 语言里面调用高德地图接口:地理编码与路径规划

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 22:14   124   0
02d2506bb405002927297e1c7530e0bf.png

你知道从广州南站去珠江新城怎么走么?今天就让我们一起使用 R 语言调用高德地图的地理编码(地址转经纬度)接口和路径规划接口来回答这个问题。

准备工作

注册高德地图,创建应用添加 Key(注意申请 Key 的时候服务平台应该选择“Web 服务”)。

  • 高德地图创建应用页面链接:https://lbs.amap.com/dev/key/app
  • 高德地图开发者文档 - 地理/逆地理编码:https://lbs.amap.com/api/webservice/guide/api/georegeo
  • 高德地图开发者文档 - 路径规划:https://lbs.amap.com/api/webservice/guide/api/direction

从广州南站去往珠江新城

首先加载下面的操作中需要的 R 包:

library(jsonlite)
library(magrittr)
library(sf)
library(tidyverse)

设定高德地图密钥:

key "amap.key")

设定我们的起止点:

start = "广州南站"
end = "广州珠江新城"

进行路径规划前我们先要把地址转换成经纬度:

# 查询起始点的经纬度
fromJSON(paste0('https://restapi.amap.com/v3/geocode/geo?address=', start, '&key=', key)) -> start
start$geocodes$location -> start
start
#> [1] "113.267080,22.988342"

fromJSON(paste0('https://restapi.amap.com/v3/geocode/geo?address=', end, '&key=', key)) -> end
end$geocodes$location -> end
end
#> [1] "113.327343,23.119274"

下面我们进行步行规划:

route "https://restapi.amap.com/v3/direction/walking?origin=", start, "&destination=", end, "&key=", key))
# 距离
route$route$paths$distance
#> [1] "24003"

# 时间
route$route$paths$duration
#> [1] "19202"

route$route$paths$steps %>%
as.data.frame() %>%
as_tibble() -> steps
steps

#> # A tibble: 73 x 9
#> instruction orientation road distance duration polyline action
#>
#> 1 向北步行664米向右… #> 2 沿石浦大道北步行42… #> 3 步行24米向左前方行… #> 4 沿石浦大道北向西北步… #> 5 沿石洲西路向东北步行… #> 6 步行26米右转… #> 7 沿钟南大道步行25米… #> 8 沿石洲西路向东北步行… #> 9 沿石陈路向北步行27… #> 10 沿石韦路向北步行51… #> # … with 63 more rows, and 2 more variables: assistant_action ,#> # walk_type
steps %>%
select(polyline) %>%
tidytext::unnest_tokens(polyline, polyline,
token = stringr::str_split, pattern = ";") %>%
distinct() %>%
separate(col = "polyline", into = c("lon", "lat"), sep = ",") %>%
type_convert() -> pathdf
pathdf#> # A tibble: 561 x 2#> lon lat#> #> 1 113. 23.0#> 2 113. 23.0#> 3 113. 23.0#> 4 113. 23.0#> 5 113. 23.0#> 6 113. 23.0#> 7 113. 23.0#> 8 113. 23.0#> 9 113. 23.0#> 10 113. 23.0#> # … with 551 more rows
pathdf %>%
as.matrix() %>%
st_linestring() -> pathsf

最后得到的 pathsf 是个 LINESTRING,我们可以把它绘制在地图上:

library(leaflet)
library(leafem)
library(leafletCN)
leaflet(width = "100%", height = "400px") %>%
amap() %>%
addFeatures(data = pathsf, color = "red", weight = 10)
462ea58f17c831a8fcf6aa10d65d293e.png

再用手机上的高德地图对比下:

fede50cd708ece349b95ac44e0a1b942.png

是不是几乎一样哈哈!

这个地图正是使用高德地图作为地图。根据我们之前介绍的方法,我们还可以给这个地图添加标题:

# 为 leaflet 地图添加标题(这个标题在 RMarkdown 文档里似乎无法显示)
library(htmltools)
tag.map.title "
.leaflet-control.map-title {
transform: translate(-50%,20%);
position: fixed !important;
left: 50%;
text-align: center;
padding-left: 10px;
padding-right: 10px;
background: rgba(255,255,255,0.75);
font-weight: bold;
font-size: 22px;
}
"))
title tag.map.title, HTML("从广州南站到珠江新城怎么走?")
)
leaflet(width = "100%", height = "400px") %>%
amap() %>%
addFeatures(data = pathsf, color = "red", weight = 10) %>%
addControl(title, position = "topleft", className = "map-title")
1149513543a1a8cff7ac99bad4b0eb87.png

函数封装

我们可以把上面的操作封装成一个函数使用:

pathsf function(start_point = "广州南站",
end_point = "广州珠江新城",
by = "walking"){
fromJSON(paste0('https://restapi.amap.com/v3/geocode/geo?address=', start_point, '&key=', key)) -> start
start$geocodes$location -> start
fromJSON(paste0('https://restapi.amap.com/v3/geocode/geo?address=', end_point, '&key=', key)) -> end
end$geocodes$location -> end
route "https://restapi.amap.com/v3/direction/", by, "?origin=", start, "&destination=", end, "&key=", key))
dist duration route$route$paths$steps %>%
as.data.frame() %>%
as_tibble() -> steps
steps %>%
select(polyline) %>%
tidytext::unnest_tokens(polyline, polyline,
token = stringr::str_split, pattern = ";") %>%
distinct() %>%
separate(col = "polyline", into = c("lon", "lat"), sep = ",") %>%
type_convert() %>%
as.matrix() %>%
st_linestring() -> path
return(list(path = path, dist = dist, duration = duration))
}

使用:

walking driving 'driving')

# 地图展示
leaflet(width = "100%", height = "400px") %>%
amap() %>%
addFeatures(data = walking$path, color = "red", weight = 10) %>%
addFeatures(data = driving$path, color = "green", weight = 10) %>%
addMouseCoordinates()
011fc10e8b37b78c54faaece4abb2412.png

在数据框中使用

掌握如何在数据框中使用非常重要,毕竟我们接触的数据大多是表式的。我们构造一个示例数据框:

address   start = c("广州南站", "广州珠江新城", "广州海心沙亚运公园", "广州塔地铁站"),
end = c("广州珠江新城", "广州海心沙亚运公园", "广州塔地铁站", "广州南站")
)

library(purrr)
address %>%
mutate(pathsf = map2(start, end, pathsf)) -> address

# 地图展示
leaflet(width = "100%", height = "400px") %>%
amap() %>%
addFeatures(data = address$pathsf[[1]]$path, color = "red", weight = 10) %>%
addFeatures(data = address$pathsf[[2]]$path, color = "green", weight = 10) %>%
addFeatures(data = address$pathsf[[3]]$path, color = "blue", weight = 10) %>%
addFeatures(data = address$pathsf[[4]]$path, color = "pink", weight = 10)
64fe36010ecaa576815239d46a70214e.png

好啦,今天的教程就到这里了。

如果有兴趣深入学习,可以从短书平台(点击阅读原文即可跳转:https://rstata.duanshu.com/#/)上获取这个课程的视频讲解:

301e1b7f243152d55694e83f7726566c.png
9ed005e9639ef8b0b6832b598e12b062.png
f7542f2d3cd5f8d730f8e78caeccf5d5.png
b8d2750b12b981c80b04f4b8e6651910.png
46e143decaccf492165387ac20258855.png
272afeaeb55ae88d864663cb4601d11c.png
f67a6687d296e4dd0cb69a89bdef6a7c.png
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP