我R语言不熟、也不是学GIS的。仅用于记录。
文章目录
- 一、gadm 数据库简介
- 二、R 语言示例
- 三、sf 包的函数
一、gadm 数据库简介
GADM
(全称Database of Global Administrative Areas)是一个高精度的全球行政区划数据库,它包含了全球所有国家和地区的国界、省界、市界、区界等多个级别的行政区划边界数据
。
GADM的数据可以用于地理、政治、气候和社会科学等领域的研究和商业应用中,尤其是在需要对国家边界进行统计总结或在国家边界内进行栅格和矢量特征数据的统计总结时。
GADM提供的数据非常详细,可以达到ADMIN 2(相当于美国的县级,中国区域也能达到县级)的市政细分区域。它作为一个独立的矢量化形状文件层提供,并且也通过R语言的raster
包进行分发。GADM的数据可以免费用于学术和非商业用途,但禁止重新分发或用于商业用途。
GADM的数据可以在全球范围内下载,也可以按国家下载。建议只下载需要的国家,否则比较大,压缩包1G多(而中国大陆地区压缩包只有30M)。
GADM的数据更新预计每三个月发布一次新版本,当前版本是4.1,它划定了400,276个行政区域。在使用GADM数据时,需要遵守其许可协议,对于特定国家的使用可能需要额外的许可或遵守特定的版权声明。
在使用GADM数据时需要注意的是,GADM对中国国界数据的划分并不符合中国的领土主张,因此在正式刊物中发表使用此类数据的图件时需要格外谨慎。他把China、Hong Kong、Taiwan、Macao这些是分开的。(4.1版本按country下载,只有China和Taiwan的),3.6版本官网貌似没法下载,后面我给了一个网站可以下载3.6的,可以根据国家、地区代码下载香港、澳门、台湾省的数据(
CHN、HKG、MAC、TWN
)。但这还不够,还有钓鱼岛及其附属岛屿、南海诸岛也必须画上,这个数据库是没有这些岛屿的。你写论文什么的,不能用它来画中国的地图。研究某个省、区域是可以的。
🟢官方网站:https://gadm.org/
🟣4.1 版本数据库下载:https://gadm.org/download_world.html
download by country
是按国家下载。single database
是全球的,1.4GB。
🔹GADM的数据分级如下:
- 0级:国界
- 1级:州界(省、直辖市、自治区这些)
- 2级:县界(市)
- 3级:更小的行政单位(县)
- 4级和5级:更小的行政单位,但并不是所有国家都有这些级别的数据。
数字越大,分辨率越高,文件也越大。
🔹对于每个数据,GADM最多提供了6种不同的格式:
- Geopackage:可以被GDAL/OGR、ArcGIS、QGIS等软件读取
- GeoJSON :是一种基于 JSON(JavaScript Object Notation)的格式,用于编码各种地理数据结构。
- Shapefile:可直接用于ArcGIS等软件(
.shp
) - KMZ:可直接在Google Earth中打开
- R语言 (sp):可直接用于R语言绘图
- R 语言(sf):可直接用于R语言绘图
虽然有的格式是直接给R用的,但是python、matlab也是可以用的。
但是你搜索某个国家时,可能会发现它提供的格式比较少。
你可以取这个网站下载更丰富的格式:https://geodata.ucdavis.edu/gadm/
它的数据不是最新的,但是行政区划很多国家变动的频率也不高。
这个网站3.6版本提供的数据类型更多:目录名称即数据格式,里面的数据库是按国家列出来的,并且分了不同层级。国家名称使用的国家或地区识别代码,比如中国是CHN、英国式GBR。
二、R 语言示例
我下载的是:Shapefile
解压后可以看到:gadm41_CHN_0.shp、gadm41_CHN_1.shp这样的文件,以及其它辅助文件。
🟢安装sf
包:
install.packages("sf")
sf 包是 R 语言中的一个非常流行的包,用于处理和分析空间数据。它提供了一个简洁而强大的接口来读取、写入、操作和分析空间数据。sf 包的全称是 “simple features”,它遵循了简单的地理空间数据模型,这个模型在许多现代地理信息系统(GIS)软件中得到了广泛的应用。
使用示例:
library(sf)
gc()
gadm_data <- st_read('E:/gadm41_CHN_shp/gadm41_CHN_2.shp')
比如,你可以根据 NAME_1
来选择特定省份。
Console里面可以看到:
Reading layer `gadm41_CHN_2' from data source `E:\gadm41_CHN_shp\gadm41_CHN_2.shp' using driver `ESRI Shapefile'
Simple feature collection with 368 features and 13 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 73.5577 ymin: 18.15931 xmax: 134.7739 ymax: 53.56086
Geodetic CRS: WGS 84
“Geodetic CRS: WGS 84” 指的是地理坐标参考系统(Geodetic Coordinate Reference System)使用了 WGS 84 坐标系。WGS 84 是一种广泛使用的全球参考系统,全称是 World Geodetic System 1984。它由美国国防部开发,目前被全球定位系统(GPS)和其他卫星导航系统所采用。
在GIS和地图制作中,CRS 转换是一个常见的需求,因为不同的地图和数据可能使用不同的坐标系统。例如,一些地图可能使用投影坐标系统(如UTM),而其他地图可能使用地理坐标系统(如WGS 84)。在R语言中,你可以使用sf包的st_transform()函数来转换CRS:
WGS 84的EPSG代码是4326。
# 转为WSG 84坐标系
st_transform(4326)
EPSG代码是一个由国际大地测量学与地球物理学联合会(International Association of Oil & Gas Producers,简称IOGP,之前称为EPSG)维护的一套地理空间参考系统的唯一标识符系统。EPSG代码是一个四位数或五位数的数字,用于唯一标识地理空间参考系统,包括坐标参考系统(CRS)、投影参考系统(PROJ)和垂直参考系统(VERTCS)等。
网站:https://epsg.io/
EPSG代码系统的主要目的和用途包括:
唯一标识:为全球各种地理空间参考系统提供一个唯一的数字代码,以便于在不同的地图、数据库和软件系统之间进行数据交换和识别。
数据交换:在地理信息系统(GIS)、遥感、地图制作、导航和空间数据分析等领域,EPSG代码用于确保数据的准确交换和使用。
坐标转换:EPSG代码允许用户在不同的地理空间参考系统之间转换坐标,这对于处理不同来源和格式的空间数据尤为重要。
地图投影:EPSG代码包括了各种地图投影方法的标识,这对于将地球表面的三维坐标转换为二维平面地图至关重要。
垂直参考:EPSG代码还涵盖了垂直参考系统,用于处理海拔和深度等高程数据。
EPSG代码的例子包括:
- 4326:WGS 84地理坐标参考系统,广泛用于GPS和互联网地图服务。
- 3857:Web Mercator投影,常用于在线地图服务,如Google Maps和OpenStreetMap。
- 27700:英国国家网格(British National Grid),是英国广泛使用的地图投影系统。
在使用GIS软件或编程库时,EPSG代码通常作为参数输入,以指定或转换数据的坐标系统。例如,在R语言的
sf
包中,你可以使用st_transform()
函数来根据EPSG代码转换空间数据的坐标系统。
🟠绘制地图示例:
去另一个网站下载3.6版本的shp文件,下载4个,中国大陆、香港、台湾省、澳门(CHN、HKG、MAC、TWN
。
(这个数据库没有岛屿的数据,不能用来画中国地图,所以这里画个省份的地图)
安装画图包:
install.packages("ggplot2")
绘制大陆、香港、台湾省、澳门的图:
library(sf)
library(ggplot2)
# 垃圾回收
gc()
# 加载数据
gadm_CHN <- st_read('E:/China_shp/gadm36_CHN_shp/gadm36_CHN_1.shp')
gadm_HKG <- st_read('E:/China_shp/gadm36_HKG_shp/gadm36_HKG_1.shp')
gadm_TWN <- st_read('E:/China_shp/gadm36_TWN_shp/gadm36_TWN_1.shp')
gadm_MAC <- st_read('E:/China_shp/gadm36_MAC_shp/gadm36_MAC_1.shp')
# 使用rbind合并所有对象
gadm_China <- do.call(rbind, list(gadm_CHN, gadm_HKG, gadm_TWN, gadm_MAC))
# 使用ggplot2绘制地图
ggplot(data = gadm_China) +
geom_sf(fill = "lightblue", color = "black") +
theme_minimal()
🗺️绘制个重庆的地图吧:
library(sf)
library(ggplot2)
library(dplyr)
# 垃圾回收
gc()
cq <- st_read('China_shp/gadm36_CHN_shp/gadm36_CHN_3.shp')
cq <- cq %>%
filter(NAME_1 == 'Chongqing')
ggplot(data = cq) +
geom_sf(fill = "lightblue", color = "black") +
labs(title = "重庆区县地图") +
theme_minimal()
# plot(cq['NAME_0'])
三、sf 包的函数
以下是 sf
包中一些常用函数的列表,这些函数用于处理空间数据:
函数 | 描述 |
---|---|
st_read() | 读取空间数据,如Shapefile |
st_write() | 写入空间数据到文件 |
st_sf() | 创建一个简单特征(sf)对象 |
st_as_sf() | 将其他格式的空间数据转换为sf对象 |
st_as_sfc() | 将外部几何对象转换为简单特征集合(sfc)对象 |
st_plot() | 绘制sf对象 |
st_transform() | 改变sf对象的坐标参考系统 |
st_intersects() | 判断两个几何对象是否相交 |
st_contains() | 判断一个几何对象是否包含另一个 |
st_within() | 判断一个几何对象是否完全在另一个几何对象内部 |
st_distance() | 计算两个几何对象之间的距离 |
st_buffer() | 创建一个几何对象周围的缓冲区 |
st_convex_hull() | 计算几何对象的凸包 |
st_centroid() | 计算几何对象的质心 |
st_sample() | 从几何对象中随机抽样点 |
st_simplify() | 简化几何对象,减少点的数量 |
st_combine() | 合并多个几何对象 |
st_difference() | 计算两个几何对象的差集 |
st_union() | 计算多个几何对象的并集 |
st_intersection() | 计算多个几何对象的交集 |
st_sym_difference() | 计算两个几何对象的对称差 |
st_touches() | 判断两个几何对象是否相触 |
st_crosses() | 判断两个几何对象是否相交 |
st_overlaps() | 判断两个几何对象是否重叠 |
st_covered_by() | 判断一个几何对象是否被另一个覆盖 |
st_covers() | 判断一个几何对象是否覆盖另一个 |
st_contains_properly() | 判断一个几何对象是否完全包含另一个 |
st_is_within_distance() | 判断一个几何对象是否在另一个几何对象的指定距离内 |