在前面的推文中,小编曾多次提到R语言的空间矢量数据有sp和sf两种类型。因为sf对象有诸多优点,所以前面对其做了重点介绍。本篇,我们来简单地介绍下sp对象。
创建sp对象
下图展示了sp格式的各类对象名称及其特征:

以点对象(points)为例,
SpatialPoints
表示只包含坐标信息、没有属性信息的点对象,SpatialPointsDataFrame
表示既包含坐标信息、也包含属性信息的点对象。
sp对象的创建函数和它的类型名称相同(上图)。如创建不带属性数据的点对象的函数为SpatialPoints()
,创建带属性数据的点对象的函数为SpatialPointsDataFrame()
。下面依次举例说明。
点对象
SpatialPoints()
函数的语法结构如下:
SpatialPoints(coords, proj4string = CRS(as.character(NA)),
bbox = NULL)
coords:点的坐标,数据结构为矩阵或数据框;
proj4string:对应的投影坐标系;
bbox:坐标各维度的范围,可忽略。
SpatialPointsDataFrame()
函数的语法结构如下:
SpatialPointsDataFrame(coords, data, coords.nrs = numeric(0),
proj4string = CRS(as.character(NA)),
match.ID, bbox = NULL)
data:存储属性数据的数据框。
示例数据为sp
工具包中的meuse
数据集:
library(sp)
data("meuse")

为了创建仅包含坐标信息的点对象,可以仅保留该数据集中的x
和y
变量作为输入对象:
xy <- subset(meuse, select = c(x, y))
sp.pts <- SpatialPoints(xy)
使用SpatialPointsDataFrame()
函数需要将坐标信息和属性信息分别保存在一个数据框中:
xy <- subset(meuse, select = c(x, y))
df <- subset(meuse, select = -c(x, y))
sp.dfpts <- SpatialPointsDataFrame(xy, df)
# coords参数也可以使用无属性的点对象
sp.dfpts <- SpatialPointsDataFrame(sp.pts, df)
创建包含属性信息的对象,还有一种更便捷的方法。如下例:
# 方法1
sp.dfpts2 <- meuse
coordinates(sp.dfpts2) <- ~ x + y
# 方法2
sp.dfpts3 <- meuse
coordinates(sp.dfpts3) <- c("x", "y")
网格对象
创建网格对象前需要先创建一个网格的拓扑结构,使用函数为GridTopology()
。语法结构如下:
GridTopology(cellcentre.offset,
cellsize, cells.dim)
cellcentre.offset:网格中心在各维度的坐标起点;
cellsize:网格在各维度的单位大小;
cells.dim:各维度的网格个数。
示例:
gt <- GridTopology(c(0,0), c(0.5,1), c(10,5))
很容易理解,创建只包含坐标信息的网格对象的函数为SpatialGrid()
:
SpatialGrid(grid, proj4string = CRS(as.character(NA)))
sp.grid <-SpatialGrid(gt)
plot(sp.grid)

创建包含属性信息的网格对象的函数为SpatialGridDataFrame()
:
df <- data.frame(attr = 1:50)
sp.dfgrid <- SpatialGridDataFrame(gt, df)
同点对象一样,网格对象也可以通过coordinates(sp) <- ~ x + y
的方式创建。需要使用base
工具包中的expand.grid()
函数:
expand.grid(..., KEEP.OUT.ATTRS = TRUE,
stringsAsFactors = TRUE)
...:各维度的坐标值。
示例如下:
gt2 <- expand.grid(x = seq(0, 4.5, 0.5),
y = seq(0, 4, 1))
df2 <- data.frame(attr = 50)
sp.dfgrid2 <- data.frame(gt2, df2)
coordinates(sp.dfgrid2) <- ~ x + y
线、面对象
创建线、面对象的方法基本和点、网格对象类似,但远不如后者常用,在这里就不再进行介绍了,有需要的读者可以访问下方链接查看官方说明文档:
https://mirrors.tuna.tsinghua.edu.cn/CRAN/web/packages/sp/vignettes/intro_sp.pdf
函数方法
sp对象的数据结构如下图:

data:属性信息;
coords:坐标信息;
bbox:坐标范围;
proj4string:投影信息。
使用@
符号可以提取sp对象的上述信息,如:
sp.dfpts@data
基本函数
下面列举了一些常用函数,这些函数的功能及名称基本与sf
工具包的函数类似:
[]:提取属性数据中的列或行;
[[]]:提取属性数据中的列,即变量;
dimensions:查询维度;
bbox:查询各维度的坐标范围;
coordinates:提取坐标信息;
geometry:提取几何信息;
spplot:绘制地图,即可视化。
rgeos
工具包
对sp对象进行处理的更多函数可见rgeos
工具包。下图中的红色框内的函数,其名称以g
开头,功能基本与sf
工具包中的st_*
系列函数类似:

说明
sp对象是R语言最初采用的数据结构形式,但近年来逐渐被sf对象所替代,而R中的许多空间处理方法对两者格式同样适用,因此小编建议以掌握sf对象的处理方法为主,sp对象的处理方法了解即可。