R语言sf包:如何平移空间多边形?
多边形平移需求与数据集
用户拥有如下可转换为sf对象的数据集:
data <- data.frame(id=c(1,2,3,4,5,6), geometry=c("POLYGON ((529411.4 178358.9, 529409.9 178358.4, 529408.5 178362.9, 529409.9 178363.3, 529411.4 178358.9))", "POLYGON ((529409.9 178363.5, 529408.4 178363.1, 529407 178367.5, 529408.4 178368, 529409.9 178363.5))", "POLYGON ((529408.4 178368.2, 529406.9 178367.7, 529405.5 178372.2, 529407 178372.7, 529408.4 178368.2))", "POLYGON ((529406.9 178372.9, 529405.4 178372.4, 529404 178376.9, 529405.5 178377.4, 529406.9 178372.9))", "POLYGON ((529405.4 178377.5, 529403.9 178377.1, 529402.5 178381.6, 529404 178382, 529405.4 178377.5))", "POLYGON ((529403.9 178382.2, 529402.4 178381.7, 529401 178386.2, 529402.5 178386.7, 529403.9 178382.2))")) data <- data %>% st_as_sf(wkt="geometry", crs=27700)
原始数据存在偏移,需要将所有多边形向东平移100单位、向北平移100单位,但sf包中没有直接的st_translate()函数,需求解实现方法。
实现方法
方法1:直接对几何对象进行坐标运算
sf包的几何对象支持直接算术运算,由于你的坐标系是EPSG:27700(英国国家格网,东向为X轴,北向为Y轴),只需给每个多边形的坐标加上对应偏移量即可:
# 生成与原数据同CRS的偏移量点对象 offset <- st_point(c(100, 100)) %>% st_sfc(crs = st_crs(data)) # 对sf对象的几何列执行平移操作 data_translated <- data %>% mutate(geometry = geometry + offset)
方法2:使用仿射变换函数st_affine()
仿射变换可实现平移、缩放等操作,平移对应的变换矩阵为3x3单位矩阵,最后一列设置为偏移量:
# 构造平移变换矩阵:X轴加100,Y轴加100 translation_matrix <- matrix(c(1, 0, 100, 0, 1, 100, 0, 0, 1), nrow = 3, byrow = TRUE) # 应用变换到几何列 data_translated <- data %>% mutate(geometry = st_affine(geometry, translation_matrix))
验证平移效果
通过对比平移前后的坐标确认结果:
# 查看原数据第一个多边形的坐标 st_coordinates(data$geometry[1]) # 查看平移后第一个多边形的坐标 st_coordinates(data_translated$geometry[1])
可观察到所有X、Y坐标均分别增加了100,符合平移需求。
内容的提问来源于stack exchange,提问作者Raga
相关产品推荐
相关产品推荐

