使用 GEOJSON 数据绘制地图

使用 GEOJSON 数据绘制地图

之前的教程中我们介绍了如何使用 ggplot2 + sf 绘制中国地图,使用这种方法我们需要准备 shp 数据,这个数据似乎网上都比较抠,不好找,好数据都收费!这篇教程中我们介绍一种新的数据——GEOJSON(这种数据网上一大堆),使用该数据的最好方法就是先把 GEOJSON 对象转换为 sf 对象然后再用我们的老方法绘制地图。除此之外,本文还介绍了如何获取 GEOJSON 数据、如何在交互式图表中使用 GEOJSON 数据。

视频讲解

使用 ggplot2 + sf + geojson 数据绘制地图

首先,第一步,获取 GEOJSON 数据,获取源1: https://gallery.echartsjs.com/editor.html?c=xr1IEt3r4Q ,这样的:

根据自己的需要下载即可,下载后可以得到 json 文件,例如我们下载一份 全国.json 数据,然后用这个数据绘制地图。

第一步:把该 json 数据读入 R 中,有两种方法,方法一:

注意:使用直接下载得到的 json 文件运行上面的程序是会出错的,可以手动打开 json 文件在文件的末尾空一行。

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

第二种方法:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

可以用下面的方法比较两种读取方法的速度:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

可以看出,sf::st_read 虽然读取方便,但是比 geojsonsf::geojson_sf 慢。

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

chinasf 是个 sf 对象:

1
2
3
class(chinasf)

#> [1] "sf" "data.frame"
1
2
3
4
5
6
7
8
9
10
11
12
13
glimpse(chinasf)

#> Rows: 34
#> Columns: 9
#> $ adcode <dbl> 110000, 120000, 130000, 140000, 150000, 210000, 22000…
#> $ center <chr> "[116.405285,39.904989]", "[117.190182,39.125596]", "…
#> $ name <chr> "北京市", "天津市", "河北省", "山西省", "内蒙古自治区", "辽宁省", "吉林省", "…
#> $ centroid <chr> "[116.419889,40.189911]", "[117.347019,39.28803]", NA…
#> $ childrenNum <dbl> 16, 16, 11, 11, 12, 14, 9, 13, 16, 13, 11, 16, 9, 11,…
#> $ level <chr> "province", "province", "province", "province", "prov…
#> $ subFeatureIndex <dbl> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,…
#> $ acroutes <chr> "[100000]", "[100000]", "[100000]", "[100000]", "[100…
#> $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((116.8121 39..., MULTIPOL…

第二步,我们生成一个虚拟的变量 pop:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

然后我们使用之前介绍的 ggplot2 + sf 绘制一幅地图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

绘制山东地图

同样的方法,我们下载一个山东省的数据然后绘制山东地图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

其它省市的地图绘制方法相同,可以自己尝试下!

使用 GEOJSON 绘制交互式地图

绘制交互式地图的包蛮多的,我这里演示 highcharter、echarts4r 和 leaflet。

使用 highcharter + geojson 绘制中国地图

这里我绘制了一幅中国机场分布的地图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

使用 echarts4r + geojson 绘制中国地图

这里我使用的是手动随机生成的数据:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

使用 leaflet + geojson 绘制中国地图

这里我再次演示了如何为 leaflet 地图添加标题(这个标题在 RMarkdown 文档里似乎无法显示),这里我使用的是 leafletCN 包提供的高德地图作为底图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

再绘制一幅山东地图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

还可以再深入一下,绘制威海的地图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

其它获取 geojson 数据的地址:

  1. https://gallery.echartsjs.com/editor.html?c=xBkM-72arM
  2. https://github.com/ufoe/d3js-geojson

绘制长江三角洲城市群地图

数据来源:https://gallery.echartsjs.com/editor.html?c=xBkM-72arM

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

使用多个 GEOJSON 数据绘制组合地图:绘制中部六省的地图

这里我演示了如何使用 6 个 json 数据文件绘制中部六省的地图:

数据来源: https://github.com/ufoe/d3js-geojson

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

注意到这个合并数据集实际上也是将 geojson 数据先转化为 sf 数据框再合并的,所以我们之前每次绘制中国地图都用两个数据集实际上是可以只使用一个合并数据集的:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

我们还可以将合并后的 sf 对象应用在 leaflet 地图上:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

另外也可以使用高德地图作为底图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

使用 Esri.WorldImagery 作为底图(卫星地图):

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

绘制外国地图

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

绘制世界地图

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

更改投影

最后我们再稍微讨论一下投影参数,这个东西比较复杂,我找了个文献放在附件里供大家参考,我这里演示常用的一些投影坐标系。

首先使用 st_crs(wdf)$proj4string 可以查看 sf 对象预置的 crs(coordinate reference systems):

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

coord_sf(crs = “+proj=longlat”): 这种坐标系是经度相互平行的:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

coord_sf(crs = “+proj=laea”): 球形地图

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

选择中心,例如暨南大学的经纬度为:(113, 23),以此为中心绘制地图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

coord_sf(crs = “+proj=moll”): Mollweide 投影

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

coord_sf(crs = "+proj=eck*"): 我蛮喜欢用这个的

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这里只展示 +proj=eck4:

好啦!就先写到这吧,大家有任何问题,欢迎在 TidyFriday 的知识星球上进行提问!

知识星球附件链接:https://t.zsxq.com/rr3ZbIe

#

评论

Your browser is out-of-date!

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

×