如何基于距离对SPDF(空间多边形数据框)中的多边形进行子集化
筛选SPDF中的特定小型多边形(MUNICIPI)解决方案
嘿,我完全懂你现在的处境!10天前你还在研究ggplot里怎么筛选海岸线附近的栅格,现在刚接触Spatial Polygons Data Frame(SPDF)和分级统计图,就碰到了核心逻辑一致但数据类型不同的筛选问题——而且还在啃S4对象这块硬骨头,确实容易卡壳。下面我给你一步步拆解怎么搞定这个问题:
核心思路:利用SPDF的S4对象结构
SPDF作为S4对象,主要由两个关键部分组成:
@data:存储每个多边形的属性数据(比如MUNICIPI的名称、人口、代码等)@polygons:存储每个多边形的几何坐标信息
我们可以从属性匹配或**几何特征(比如面积)**两个维度来筛选目标多边形。
方法一:根据MUNICIPI的属性筛选(比如名称/代码)
如果你知道要筛选的MUNICIPI的具体属性(比如名称是某个市镇或者代码是特定编号),直接通过@data槽访问属性列,再做子集筛选:
# 假设你的SPDF对象名为muni_spdf # 筛选名称为"目标市镇"的多边形 target_muni <- muni_spdf[muni_spdf@data$MUNICIPI == "目标市镇名称", ] # 如果要筛选多个目标,用%in% target_munis <- muni_spdf[muni_spdf@data$MUNICIPI %in% c("市镇1", "市镇2", "市镇3"), ]
筛选后得到的target_muni仍然是SPDF类型,可以直接用来绘制分级统计图。
方法二:根据多边形大小筛选(小型多边形)
如果你的需求是筛选面积较小的MUNICIPI,需要先计算每个多边形的面积,再基于面积阈值筛选:
- 首先加载
rgeos包(用来计算几何对象的面积):
library(rgeos)
- 计算每个多边形的面积,并把结果添加到
@data槽中:
# 遍历@polygons中的每个多边形,计算面积 muni_areas <- sapply(muni_spdf@polygons, gArea) # 将面积数据添加到属性表中 muni_spdf@data$polygon_area <- muni_areas
- 根据面积阈值筛选小型多边形:
# 假设筛选面积小于10000平方米的多边形(单位取决于你的SPDF投影) small_munis <- muni_spdf[muni_spdf@data$polygon_area < 10000, ]
注意:面积单位由你的SPDF的投影坐标系决定,如果是WGS84(经纬度),面积单位会是平方度,建议先转成UTM等投影坐标系再计算面积,结果会更准确。
额外小提示:如果之后转用sf包
现在GIS领域更推荐使用sf包(简单要素对象),它的语法更贴近普通dataframe,筛选会更直观,比如用dplyr的filter()函数:
library(sf) library(dplyr) # 将SPDF转成sf对象 muni_sf <- st_as_sf(muni_spdf) # 筛选小型多边形 small_munis_sf <- muni_sf %>% filter(st_area(geometry) < units::set_units(10000, m^2))
不过既然你现在正在学习SPDF和S4对象,先把上面的sp方法吃透就好啦!
内容的提问来源于stack exchange,提问作者delcast
相关产品推荐
相关产品推荐

