很久没有写教程案例了,因为很久没有学新的技术了。今天写一个最新做的案例,在一个paper中我们要展示某个数据在全国城市的分布的变化,原来的可视化方案是展示4个年份的地图facet,效果不是很好。最终决定使用动画地图的方案。

本文使用的所有技术全部来自Robin Lovelace, Jakub Nowosad, Jannes Muenchow的著作Geocomputation with R。

https://geocompr.robinlovelace.net/adv-map.html#animated-maps​geocompr.robinlovelace.net

  1. 读入数据并认知数据结构

我们是用的中国地图数据是一个geojson格式,使用geojsonsf包(比sf读geojson更快更稳定更灵活)读入数据。

# install.packages('geojsonsf')
library(geojsonsf)
city <- geojson_sf('chinacity.geojson')

我们先来看下读入的city是一个什么数据结构(从数据科学家的角度来看,理解了一个问题的充分必要条件是理解其数据结构)。city看上去就是一个dataframe,除了geometry这列有所不同,其他都是普通的列向量(被称作特征)。实际上,我们确实可以用dplyr对city进行各种操作。

那geometry是什么东西呢?让我们输出一个结果看看。它是一个地理信息系统vector(与一般的vector同名不同义,另一个数据类型是raster,不展开),代表了城市代码110000(北京市)的地理边界。其类型是MULTIPOLYGON,即多个多边形组成的vector。一个多边形储存的方式就是一堆顶点的二维坐标构成的一个list,加下面最后一行,第一个点的经纬度是(116.6319 41.05877)。

city$geometry[1]输出为:
Geometry set for 1 feature
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 115.413 ymin: 39.44117 xmax: 117.507 ymax: 41.05901
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
MULTIPOLYGON (((116.6319 41.05877, 116.6328 41....

2. 将特征加入geo data frame

当我们揭开神秘地理数据结构的面纱之后,接下来的操作就是平凡的了。

首先,在初级应用中,我们不需要修改geometry列,所有的工作只是根据特征来可视化;

那么,接下来要做的事情就是加入我们要画图的特征。

# 要用于可视化的特征数据组,读入之后要进行一些清理,此处略去
entry <- read.csv("entry.csv")
city_final <- left_join(city, entry, by = c("citycode","year")
# 我们加入的特征向量为num,是panel,year代表年份
# 需要注意的是,要把data frame 转换成sf对象
city_final <- st_sf(city_final) 

3. 画地图

接下来,我们使用tmap包进行地图可视化,其语法与ggplot2类似(都是grammar of graphics),都属于图层式的。建议先花15分钟学习教程:

https://cran.r-project.org/web/packages/tmap/vignettes/tmap-getstarted.html​cran.r-project.org

# 由于我们画的num是一个连续变量,因此需要定义一个切分(也可以使用style参数来调节自动切分)
pb <- c(0,300,1000,2000,4000,8000,15000,20000,30000,80000,300000)
# 取其中一年作为静态作图的数据
tmp <- city_final %>% filter(year == 2016)
# 使用tmp画静态地图
tm_shape(tmp) + tm_polygons("num", colorNA = NULL, palette = 'Blues', breaks = pb)
# 其中 tm_shape 相当于 ggplot(tmp)指定作图对象,tm_polygons 类似于ggline 之类的,告诉R要画多边形
# 与ggplot2语法不同的是,直接使用列名称“num”来制定填充对象
# palette 规定配色方案,breaks 规定连续变量num的分组标准
# 还可以用title参数规定图例的title

作图效果如下

配色参考:

https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf​www.nceas.ucsb.edu

4. 动画化

在画动画地图之前,我们需要了解分片操作,tm_facets 的作用是指定一列作为分组标准,例如使用year 分组,相当于每一年做一张地图。

动画的效果便是同一个位置,连续的将facet的地图呈现出来,我们使用tmap_animation来实现,代码如下:

facet_anim <- tm_shape(tmp) + tm_polygons("num", colorNA = NULL, palette = 'Oranges', breaks = pb,title="Number") +tm_facets(free.scales.fill = FALSE, nrow = 1, ncol = 1, along = "year") +tm_layout(legend.position = c("left", "bottom"))
tmap_animation(tm = facet_anim, filename = "chinaexample.gif", width = 1600)
# 注意在geocomputation with R作者提供的code中没有指定width参数,会产生error

效果如下

进阶内容:互动地图以及map application


我就不写了,暂时用不到,哈哈哈!

地图上制作线路的动画_R制作动画地图相关推荐

  1. unity三维地图的经纬度如何在二维地图上表示_安全数据分析:数据点—地图—线性回归...

    一次性进群,长期免费索取教程,没有付费教程. 教程列表见微信公众号底部菜单 进微信群回复公众号:微信群:QQ群:460500587 微信公众号:计算机与网络安全 ID:Computer-network ...

  2. 门店定位怎么在地图上显示_怎么能让顾客在地图上搜索到自己店的位置?

    百度地图: 如果你的店铺已经标注过了,就可以直接搜你店铺的名字就可以找到了,如果没有标注的话,需要先标注的. >百度 地图商户免费标注的方法: 1.打开百度地图首页,如果没有百度帐号的,可以去注 ...

  3. 门店定位怎么在地图上显示_门店位置如何显示在地图上?

    随着科技的发展,智能手机的普及,如今不管在哪里只要有一个手机在手基本就不会迷路,通过手机地图寻找位置非常方便,及时比较偏的地方也可以通过地图去找到,那么对于门店商家而言,如何将自己的门店显示在地图上呢 ...

  4. android地图画线,绘制折线-在地图上绘制-开发指南-Android 轻量版地图SDK | 高德地图API...

    地图上绘制的线是由 Polyline 类定义实现的,线由一组经纬度(LatLng对象)点连接而成. 绘制一条线 与点标记一样,Polyine的属性操作集中在PolylineOptions类中,添加一条 ...

  5. python在地图上标注点_怎样用python画地图上的标注线

    怎样用python画地图上的标注线 发布时间:2020-11-16 09:52:53 来源:亿速云 阅读:90 作者:小新 小编给大家分享一下怎样用python画地图上的标注线,希望大家阅读完这篇文章 ...

  6. python地图可视化把直辖市和地级市画在一起_Python地理地图可视化:Folium解析百度地图上中国城市中心的经纬度并显示在地图上(3),folium,把,出来,展示,三...

    python地理地图可视化:folium把百度地图各个城市经纬度解析出来并在地图上展示(三) import json import webbrowser as wb import folium NAM ...

  7. python按经纬度在地图上标识_Python 给定的经纬度标注在地图上的实现方法

    博主最近发现了python中一个好玩的包叫basemap,使用这个包可以绘制地图.值得说一下的是,basemap还没有pip检索,因此不能直接使用pip install basemap,来安装这个包. ...

  8. 获取百度地图上某点的经纬度信息(百度地图拾取坐标系统)

    百度地图拾取坐标系统 的地址:http://api.map.baidu.com/lbsapi/getpoint/index.html

  9. 地图可视化 | 8月22日重庆山火分布地图及制作方法

    前言 近日受高温天气影响,重庆多地山火引发关注,来看最新进展. 通过网上发布新闻,火灾发生地列表 使用小O地图EXCEL插件进行地图可视化,山火发生分布地图. 通过地图可视化,近日山火发生地主要集中在 ...

最新文章

  1. 数据结构(五)位图算法
  2. MySQL—【加餐1】高效查询方法
  3. git 修改上次提交信息 与 撤销此操作.
  4. 前后台分离--概念相关
  5. mysql 关键词相关度排序方法详细示例分析
  6. 贝叶斯线性回归方法的解释和优点
  7. 六元均匀直线阵的各元间距为_梦得杯—镀覆技术论文大赛丨微机电系统器件电镀镍厚度均匀性的模拟与改进【刘瑞 许文杰 袁妍妍】...
  8. Jenkins持续集成案例之-运维部署方式
  9. iis ftp 隔离账户
  10. WPF基础(八)bitmapImage.EndInit()引发异常 未找到适用于完成此操作的图像处理组件:可能是收发图片格式不一致导致的。
  11. 单出口双防火墙双核心冗余_各类冗余备份技术合集
  12. 高德地图开放平台的使用
  13. 止增笑耳的星际迷航前传
  14. 35岁仍然落魄,有这3个苗头将大器晚成,你要刮目相看,主动结交
  15. 图片超过200kb怎么变小?怎么把图片压缩到想要的大小?
  16. Eclipse 使用中一些好用的快捷键
  17. 最新PHP软文发稿新闻文章发布自助推广平台源码
  18. 基于多回波 LiDAR 数据的三维物体检测
  19. Fastboot 命令报错分析篇
  20. 关于工信部要求品牌电脑强制预装“-花季护航”软件

热门文章

  1. 基于iOS用CoreImage实现人脸识别
  2. MySQL中的主键约束和外键约束
  3. 2017-2018-1 20179215 《从问题到程序》第三章
  4. 20145305《JAVA程序设计》实验二
  5. eclipse下的webservice开发
  6. JSP技术之JavaBean
  7. Register Delphi ,Delphi 不能运行
  8. Android音视频【十一】视频混音
  9. SQlite Android数据库的应用 Android SQLite 简易的学生成绩管理系统
  10. 通过AMS分析Binder流程(Java到Kernel)