You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于距离对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,需要先计算每个多边形的面积,再基于面积阈值筛选:

  1. 首先加载rgeos包(用来计算几何对象的面积):
library(rgeos)
  1. 计算每个多边形的面积,并把结果添加到@data槽中:
# 遍历@polygons中的每个多边形,计算面积
muni_areas <- sapply(muni_spdf@polygons, gArea)
# 将面积数据添加到属性表中
muni_spdf@data$polygon_area <- muni_areas
  1. 根据面积阈值筛选小型多边形:
# 假设筛选面积小于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:18:53