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

在R语言SF包中筛选同心圆多边形间的点数据

问题分析与解决方法

原代码的核心问题

  1. 几何对象生成错误:你生成的d和e是两条平行纬线(y=-88和y=-30),并非同心圆的点,后续转成的多边形完全不是你需要的环形区域。
  2. 多边形创建逻辑错误:把两条线直接合并转多边形,得到的是无效的、不符合预期的几何图形,自然无法筛选点。
  3. 空间筛选逻辑不对:环形区域是“在外侧大圆内,同时在内侧小圆外”,不能直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:01:09