在R语言SF包中筛选同心圆多边形间的点数据
问题分析与解决方法
原代码的核心问题
- 几何对象生成错误:你生成的
d和e是两条平行纬线(y=-88和y=-30),并非同心圆的点,后续转成的多边形完全不是你需要的环形区域。 - 多边形创建逻辑错误:把两条线直接合并转多边形,得到的是无效的、不符合预期的几何图形,自然无法筛选点。
- 空间筛选逻辑不对:环形区域是“在外侧大圆内,同时在内侧小圆外”,不能直接用
st_filter匹配错误的多边形。
正确实现步骤(创建环形掩码+筛选点)
以下是完整的修正代码,直接运行即可实现需求:
library(sf) library(tidyverse) # ---------------------- # 1. 创建模拟点数据 # ---------------------- set.seed(123) # 固定随机种子,结果可复现 my.data <- data.frame( lon = sample(-180:180, 100, replace = TRUE), lat = sample(-88:-14, 100, replace = TRUE) ) %>% st_as_sf(coords = c("lon", "lat"), crs = 4326) %>% # WGS84坐标系 st_transform(3976) # 转换到epsg:3976 # ---------------------- # 2. 创建两个同心圆多边形 # ---------------------- # 定义圆心(这里选坐标原点,可根据需求修改) center <- st_sfc(st_point(c(0, 0)), crs = 3976) # 创建大圆(半径1000000米)和小圆(半径500000米) circle_large <- st_buffer(center, dist = 1000000) circle_small <- st_buffer(center, dist = 500000) # 创建环形区域:大圆减去小圆 ring_mask <- st_difference(circle_large, circle_small) # ---------------------- # 3. 筛选落在环形区域内的点 # ---------------------- # 方法1:用st_filter直接筛选 filtered_points <- st_filter(my.data, ring_mask) # 方法2:用st_intersects手动判断(适合更复杂的逻辑) # intersect_flag <- st_intersects(my.data, ring_mask, sparse = FALSE)[,1] # filtered_points <- my.data[intersect_flag,] # 查看结果 print(filtered_points)
关键说明
- 创建环形区域:用
st_difference把大圆多边形减去小圆多边形,得到的就是两个同心圆之间的环形掩码,这是实现筛选的核心。 - 坐标系统一:所有几何对象必须保持同一坐标系,代码里先转成epsg:3976再操作,避免投影错误。
- 随机种子:加入
set.seed让模拟数据固定,方便你调试。
内容的提问来源于stack exchange,提问作者AlexOcean
相关产品推荐
相关产品推荐

