作者:李誉辉
四川大学在读研究生
前言
上文R_ggplot2地理信息可视化_史上最全(一)讲了sp和sf数据类型,这篇讲解地图数据集以及与其他几何对象的结合,还有栅格地图。
注:蓝字表示文末有其网址链接
地图数据集常见2中格式:
json
,包括GeoJSON(文件后缀为.geojson)和TopoJson(文件后缀为.json)。shp
, shp对象比较特殊,是由很多个文件组成的,
通常在同一个文件下还有.shx和.dbf格式的文件。这些文件必须在一起,否则不能成功读取。.rds
,这是一种文件格式,分为sp.rds
和sf.rds
两种,分别对应p
和sf
两种数据结构。
使用sp::readRDS()
读取。
如上图所示,rgdal
和sf
功能比较全,用得也比较多。
地图集下载网站:
GADM,注意该网站中,中国地图不包含台湾。
中国县级地图 (见文末)提取码:uomy
OpenStreetMap
阿里云地图,左上角框框里面选择区域,左下角选择下载格式。
地图数据在线转换格式:
geojson.io,在线解析和转换格式。
mygeodata converter
IGIS Map Converter
推荐使用rmapshaper::ms_simplify()
简化地图数据,可以指定简化比例,不然真的很卡,
该包使用拓扑学的知识简化多边形,简化后在常规分辨率下根本看不出来差别。
该函数支持json
,sp
,sf
等多种输入对象。object.size()
可以查看数据集的存储大小。
4.1 json
格式
4.1.1 rgdal
包读取
1rm(list = ls()); gc() # 清空内存
2library(ggplot2)
3
4path1 <- "E:/R_input_output/data_input/JSON/GeoJSON/China.geojson"
5China_1 <- rgdal::readOGR(dsn = path1, stringsAsFactors = FALSE)
6Encoding(China_1@data$name) <- "UTF-8" # 中文字符重编码
7China_2 <- fortify(China_1)
8
9ggplot(China_2) +
10 geom_polygon(aes(x = long, y = lat, group = group, fill = group),
11 color = "cyan", show.legend = FALSE) +
12 coord_map()
1## used (Mb) gc trigger (Mb) max used (Mb)
2## Ncells 901585 48.2 1744096 93.2 1744096 93.2
3## Vcells 1789510 13.7 9804475 74.9 12236244 93.4
4## OGR data source with driver: GeoJSON
5## Source: "E:\R_input_output\data_input\JSON\GeoJSON\China.geojson", layer: "中国"
6## with 35 features
7## It has 10 fields
4.2 sf
包读取
sf
包读取中文字符不会乱码。
1rm(list = ls()); gc() # 清空内存
2library(ggplot2)
3library(sf)
4
5path1 <- "E:/R_input_output/data_input/JSON/GeoJSON/China.geojson"
6China_1 <- st_read(path1, stringsAsFactors=FALSE)
7
8ggplot(China_1) +
9 geom_sf(color = "cyan", aes(fill = name), show.legend = FALSE) +
10 coord_sf(crs = "+proj=aea +lat_1=25 +lat_2=50 +lon_0=105") +
11 ggtitle("中国地图(Albers equal-area projection)")
1## used (Mb) gc trigger (Mb) max used (Mb)
2## Ncells 1112615 59.5 1744096 93.2 1744096 93.2
3## Vcells 2079841 15.9 9804475 74.9 12236244 93.4
4## Reading layer `涓浗' from data source `E:\R_input_output\data_input\JSON\GeoJSON\China.geojson' using driver `GeoJSON'
5## Simple feature collection with 35 features and 10 fields
6## geometry type: MULTIPOLYGON
7## dimension: XY
8## bbox: xmin: 73.50235 ymin: 3.397162 xmax: 135.0957 ymax: 53.56327
9## epsg (SRID): 4326
10## proj4string: +proj=longlat +datum=WGS84 +no_defs
4.3 shp
格式
4.3.1 rgdal
包读取
1rm(list = ls()); gc() # 清空内存
2library(ggplot2)
3
4path1 <- "E:/R_input_output/data_input/全国范围的行政边界和人口密度矢量图/CHN_adm/CHN_adm1.shp"
5China_1 <- rgdal::readOGR(dsn = path1, stringsAsFactors = FALSE)
6China_2 <- rmapshaper::ms_simplify(China_1) # 拓扑学知识简化数据
7object.size(China_1); object.size(China_2) # 简化到不足1/10大小
8
9China_3 <- fortify(China_2) # 转变为sp对象的数据框,然后就没有@了
10ggplot(China_3) +
11 geom_polygon(aes(x = long, y = lat, group = group,fill = group),
12 color = "cyan", size = 0.5, show.legend = FALSE) +
13 coord_map()
1## used (Mb) gc trigger (Mb) max used (Mb)
2## Ncells 1113970 59.5 1744096 93.2 1744096 93.2
3## Vcells 2050141 15.7 9804475 74.9 12236244 93.4
4## OGR data source with driver: ESRI Shapefile
5## Source: "E:\R_input_output\data_input\全国范围的行政边界和人口密度矢量图\CHN_adm\CHN_adm1.shp", layer: "CHN_adm1"
6## with 32 features
7## It has 16 fields
8## 17647616 bytes
9## 1590376 bytes
4.3.2 sf
包读取
1rm(list = ls()); gc() # 清空内存
2library(ggplot2)
3library(sf)
4
5path1 <- "E:/R_input_output/data_input/全国范围的行政边界和人口密度矢量图/CHN_adm/CHN_adm1.shp"
6China_1 <- st_read(path1, stringsAsFactors=FALSE)
7China_2 <- rmapshaper::ms_simplify(China_1) # 拓扑学知识简化数据
8
9ggplot(China_2) +
10 geom_sf(color = "cyan", aes(fill = NAME_1), show.legend = FALSE) +
11 coord_sf(crs = "+proj=aea +lat_1=25 +lat_2=50 +lon_0=105") +
12 ggtitle("中国大陆地图(Albers equal-area projection)")