本篇介绍sf
包的一些函数方法,这些函数方法都是用于处理空间矢量对象的几何信息。
提取对象几何信息
st_bbox:提取对象的地理或投影坐标范围;
st_area:提取对象的各要素面积;
st_length:提取对象的各要素周长;
st_geometry:提取对象的几何信息列;
st_coordinates:提取各要素几何信息的地理或投影坐标。
对象类型转换
st_boundary:提取各要素的边界,可实现面对象转为线对象的功能;
st_centriod:提取各要素的质心,可实现面对象转为点对象的功能;
st_polygonize:实现闭合线对象转换为面对象;
st_cast:类型转换通用函数,前篇已经有所介绍(sf | 空间矢量对象的“聚合”操作);
st_voronoi:生成泰森多边形,相当于把点对象转为面对象。
叠置分析
st_interp:生成对象内要素两两之间的交集;
st_difference:生成对象内要素两两之间的差集;
st_sym_difference:交集取反操作,即去除对象内两两要素的相交部分,保留不相交部分;
st_crop:用指定地理或投影坐标确定的矩形范围截取矢量对象;
使用以上函数并配合st_union
函数可以实现ArcGIS中的一系列操作:
library(sf)
library(tidyverse)
# 示例数据
nc <- st_read(system.file("shape/nc.shp", package="sf")) %>%
filter(AREA > 0.2)
bbox <- st_bbox(nc) + c(-0.1,0.4,0.1,0.1)
ncgrid <- st_sf(geom = st_make_grid(st_as_sfc(bbox), n = c(4,5)))
par(plt = c(0,1,0,0.8))
plot(st_geometry(nc), main = "nc",
col = sf.colors(categorical = TRUE, alpha = .5))
plot(st_geometry(ncgrid), main = "ncgrid",
col = sf.colors(categorical = TRUE, alpha = .5))
# 相交操作
plot(st_geometry(st_interp(ncgrid, nc)),
col = sf.colors(categorical = TRUE, alpha = .5),
main = "Intersect")
# 裁剪操作
plot(st_geometry(st_interp(ncgrid, st_union(nc))),
col = sf.colors(categorical = TRUE, alpha = .5),
main = "Clip")
# 擦除操作
st_difference(ncgrid, st_union(nc)) -> erase
plot(st_geometry(erase),
col = sf.colors(categorical = TRUE, alpha = .5),
main = "Erase")
# 交集取反操作
st_sym_difference(ncgrid, st_union(nc)) %>%
st_difference(st_union(st_interp(ncgrid, st_union(nc)))) -> symdiff
plot(st_geometry(symdiff),
col = sf.colors(categorical = TRUE, alpha = .5),
main = "SymDiff")
# 矩形切块
bbox <- c(xmin = -79, ymin = 34, xmax = -78, ymax = 34.8)
plot(st_geometry(st_crop(nc, bbox)),
col = sf.colors(categorical = TRUE, alpha = .5),
main = "切块")
邻域分析
st_distance:计算两个矢量对象内两两要素质心之间的距离,当第二个对象缺省时计算第一个对象各要素相互之间的距离;
st_nearest_feature:返回第二个对象中与第一个对象各要素距离最近的要素索引;
st_nearest_points:返回两个矢量对象各要素之间距离最近的两个点之间的线路;
st_buffer:生成缓冲区。
nc <- read_sf(system.file("gpkg/nc.gpkg", package="sf"))
par(plt = c(0,1,0,0.45))
plot(st_geometry(nc), main = "最近点对")
ls = st_nearest_points(nc[1,], nc)
plot(ls, col = 'red', add = TRUE)
par(plt = c(0,1,0,0.9))
ncbuffer <- st_buffer(st_union(filter(nc, AREA > 0.2)), dist = 0.2)
plot(st_geometry(ncbuffer), col = "grey", main = "缓冲区")
plot(st_geometry(nc), add = T)
plot(st_boundary(st_union(filter(nc, AREA > 0.2))), add = T, col = "red")
其他函数
st_simplify:简化对象的拓扑关系;
st_make_grid:在指定地理或投影坐标范围内创建网格;
st_jitter:随机偏移矢量对象各要素的位置;
st_sample:在面数据内部按某种规则选取若干个点(默认随机选取);
st_line_sample:在线数据上按某种规则选取若干点(默认均匀选取)。
nc <- filter(nc, AREA > 0.2)
# 随机偏移位置
ncjitter <- st_jitter(nc, factor = 0.01)
par(plt = c(0,1,0,0.85))
plot(st_geometry(nc), main = "随机偏移")
plot(st_geometry(ncjitter), add = T, border = "red")
# 在面内选点
ncsample <- st_sample(nc, 100)
plot(st_geometry(nc), main = "面内选点")
plot(st_geometry(ncsample), add = T, col = "red")
# 在线上选点
st_boundary(st_union(nc)) %>% st_cast("LINESTRING") %>%
st_transform(2246) -> ncboundary
linesample <- st_line_sample(st_geometry(ncboundary), n = 50)
plot(ncboundary, main = "线上选点")
plot(linesample, add = T, col = "red")