sf | 空间矢量对象的几何信息处理方法

本篇介绍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")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值