前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leaflet 与高德合并会擦出怎么样的火花?

Leaflet 与高德合并会擦出怎么样的火花?

作者头像
庄闪闪
发布2021-10-08 10:21:46
1.7K0
发布2021-10-08 10:21:46
举报
文章被收录于专栏:庄闪闪的R语言手册

本文来自读者厦门大学的李康国研究生投稿,讲述高德和 Leaflet 结合绘制地图。也欢迎其他小伙伴来分享你们的经验!

前言

统计学上常说:“一图胜千言”,而对于地图类可视化教程,大家介绍的并不是很多,本教程讲会教你如何绘制各类地图。首先介绍下地图的种类(个人经验仅作参考):

  • 填色地图 (Choropleth Maps):饼图的“饼”被咬了几口,然后再拼在一起就是填色地图了。
  • 散点地图 (Scatter on Maps):散点图的 X 和 Y 轴改成经度和纬度,再使用图片(地图)作为背景。
  • 气泡地图 (Bubble Maps):和散点地图类似,只不过新增加了一个变量来定义点的大小。
  • 路径地图 (Lines on Maps):线图的 X 轴和 Y 轴改成经度和纬度,再使用图片(地图)作为背景。
  • 其他地图 (Other Maps):如:房地产售楼的规划图,天气预报的云图,NASA 的城市灯光图等。

本文框架

本文框架

1.材料准备

  1. 画统计图最重要的是啥?数据!没有数据怎么画?难不成去小卖部买个红蓝铅笔画个徐霞客同款?画地图通常需要两个数据。1. 经纬度数据(类似散点图中的 X 轴与 Y 轴);2. 地图数据(类似散点图的背景图片)

下面我会一一讲解如何获取这两类数据。

  1. 得到数据之后,我们还需要相应软件来实现地图的可视化。老牌软件有 ArcGIS 和 PPT 插件等,但是正版费用较高。而 R 是开源软件,绘图也是它的强项,所以此教程我们将采用 R 语言的 leaflet[1] 包进行地图的可视化。

2. 数据获取

2.1 经纬度数据

就拿今天讲的最简单的散点地图来说,需要通过经纬度来确定点的位置,然后再映射到地图上。

  • 如果你手头有经纬度数据,恭喜你,你不用去找了,但是一定要确定你的经纬度数据使用的是哪种坐标系?(因为同一地点不同坐标系里的经纬度不一样,偏移大概有几百米,所以千万不要混用)
    • WGS84坐标系:一般是谷歌等国外地图使用;
    • GCJ02坐标系(加密的火星坐标系):国内的高德地图和腾讯地图等使用;
    • BD-09 坐标系(再次加密的火星坐标系):国内的百度地图使用;

因为本教程为了适用性使用的是高德的底图(GCJ02坐标系),如果您是WGS84坐标系在后续代码中删除高德的底图就好(一定会面临主权问题);如果您是 BD-09 坐标系,这个需要转换且比较复杂。

  • 如果你手头没有数据,只有详细的地址,需要转换成经纬度。

简单的是自己去搜一下“坐标拾取”,然后借助百度地图等把地址转换成坐标,但是一次就只能拾取一个,并且频繁拾取还要验证码,如果地址比较多就太麻烦了。这时候可以使用高德提供的api进行批量查询地址对应的坐标

2.1.1 批量查询经纬度(通过高德地图)

  1. 打开高德开放平台[2],并注册认证为个人开发者
  2. 点击控制台,登录你的账户,打开左侧“应用管理——我的应用——创建新应用”,随便输入名称等信息创建应用,创建成功后点击右侧的“添加”,输入自定义名称,并设置服务平台为 Web 服务,IP 白名单有需求可以设置,没有就算了。
  1. 点击提交,此时就可以看到你项目的 key 了(下图红圈),复制下。
  1. 根据高德提供的地理编码开发文档,最终 url 应该是:
代码语言:javascript
复制
address <- '福建省厦门市厦门北站' ## 详细地址
city <- '厦门'
key <-  'Your key' ## 你刚刚复制的key
  
url <- paste0(
  'https://restapi.amap.com/v3/geocode/geo?',
  '&key=', key,  ## 你刚刚复制的key
  '&address=', address, ## 详细地址
  '&output=', 'JSON',
  '&city=', city ## 这个可以不要,填所在城市就好
)
  1. 使用 jsonlite[3] 解析 api 地址
代码语言:javascript
复制
library(jsonlite)
temp_geo <- fromJSON(paste(readLines(url,warn = F, encoding = 'UTF-8'), collapse = ""))
temp_geo
## $status
## [1] "1"
## 
## $info
## [1] "OK"
## 
## $infocode
## [1] "10000"
## 
## $count
## [1] "1"
## 
## $geocodes
##            formatted_address country province citycode   city district township
## 1 福建省厦门市集美区厦门北站    中国   福建省     0592 厦门市   集美区     NULL
##   neighborhood.name neighborhood.type building.name building.type adcode street
## 1              NULL              NULL          NULL          NULL 350211   NULL
##   number             location  level
## 1   NULL 118.074013,24.636101 兴趣点
  1. 分离经纬度

高德地图返回的经纬度信息放在了 geocodes 下面的 location,其他的返回参数可以参考高德地图提供的开发文档[4]

代码语言:javascript
复制
library(tidyr)
library(dplyr)
datafile <- data.frame(  ## 提取经纬度
  address = address,
  city = temp_geo$geocodes$city,
  geo = temp_geo$geocodes$location
) %>% 
  separate(col = geo, into = c('lng', 'lat'), sep = ',')  ## 分割经度和纬度

datafile$lng <- as.numeric(datafile$lng)
datafile$lat <- as.numeric(datafile$lat)

head(datafile)
##                address   city     lng     lat
## 1 福建省厦门市厦门北站 厦门市 118.074 24.6361

2.2 地图数据

用过 ArcGIS 朋友会比较清楚,常用的格式有 shp,Geojson 等,这些大家可以去 Github[5] 或者万能的淘宝找。如何处理和使用这些数据?我们会另作一期推文。

注意: 在收集的时候一定要注意主权完整,台湾省和南疆部分是中国领土,南海九段线是中国领海!此外,本教程不包括填色地图,所以不需要自定义地图数据。为了方便起见,本教程直接使用高德地图提供的底图。

3. 绘制地图

由于本文内容较多,我们将在下一期分享下面三个图的绘制教程,先看下结果。

3.1 散点地图绘制

3.2 路径地图绘制

3.3 导航路径图

小编有话说

受限于微信平台问题,所有的leaflet画的图都是以截图方式呈现,但是实际上leaflet生成的是交互式的地图,也就是你可以像导航软件里一样放大和缩小地图,不用受限于分辨率问题;上述代码中设置的label都是鼠标悬停显示。

另外,很多教程都没有提一件事:

根据《中华人民共和国测绘法》等有关法律、法规规定:在中华人民共和国境内公开出版地图、引进地图、展示、登载地图以及在生产加工的产品上附加的地图图形都需要经审核,审核通过之后编发审图号。

本教程使用的是高德的底图,所以可以直接使用高德提供的审图号。如果是来历不明的地图数据,无法提供审图号可能会引来一些不必要的麻烦。

参考资料

[1]

leaflet: https://rstudio.github.io/leaflet

[2]

高德开放平台: https://lbs.amap.com/

[3]

jsonlite: https://cran.r-project.org/web/packages/jsonlite/index.html

[4]

开发文档: https://lbs.amap.com/api/webservice/guide/api/georegeo

[5]

Github: https://github.com/

[6]

官方说明文档: https://lbs.amap.com/api/webservice/guide/api/newroute

推荐: 可以保存以下照片,在 b 站扫该二维码,或者 b 站搜索【庄闪闪】观看 Rmarkdown 系列的视频教程。Rmarkdown 视频新增两节视频(写轮眼幻灯片制作)需要视频内的文档,可在公众号回复【rmarkdown

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 本文框架
  • 1.材料准备
  • 2. 数据获取
    • 2.1 经纬度数据
      • 2.1.1 批量查询经纬度(通过高德地图)
        • 2.2 地图数据
        • 3. 绘制地图
          • 由于本文内容较多,我们将在下一期分享下面三个图的绘制教程,先看下结果。
            • 3.1 散点地图绘制
              • 3.3 导航路径图
              • 小编有话说
                • 参考资料
                相关产品与服务
                图数据库 KonisGraph
                图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档