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

如何为动物GPS轨迹随机采样点标注原始ID并生成二项式数据集

解决动物轨迹GPS位置生成带关联ID的随机点问题

问题需求

需要为每个动物GPS位置(总计约200个ID)的15公里半径范围内生成20个随机点,且每个随机点必须关联原始观测位置的id、time等信息,最终构建包含观测点(标记为1)和随机点(标记为0)的整洁数据集,用于二项式响应分析。

示例原始数据:

df <- data.frame(id = c("id1", "id1", "id1", "id2", "id2", "id2"),
                 long = c(-80, -81, -82, -79, -70, -75),
                 lat = c(36, 37, 38, 41, 40, 40.5),
                 time = c(7, 8, 9, 6, 7, 8))

现有代码问题

当前使用st_buffer+st_sample能生成正确数量的随机点,但因为分组操作和采样时丢失属性,导致随机点无法关联回对应的原始观测位置(缺失id、time信息)。

解决方案

核心思路:在采样全过程保留原始观测的属性信息,确保每个缓冲区(对应单个GPS位置)的采样点能精准关联到该位置的id和time。

完整修正代码

library(sf)
library(dplyr)

# 1. 转换原始数据为空间对象并投影到米制坐标系
df_sf <- df %>%
  st_as_sf(coords = c("long", "lat"), crs = "epsg:4326") %>%
  st_transform(crs = "epsg:26915") # 用米制CRS,方便设置15km缓冲区

# 2. 为每个GPS位置生成带属性的15km缓冲区
buffers <- df_sf %>%
  st_buffer(dist = 15000) # 15公里=15000米,此时每行仍保留id、time

# 3. 为每个缓冲区生成20个随机点,绑定原始属性
random_points <- buffers %>%
  st_sample(size = 20, by_feature = TRUE, exact = TRUE) %>%
  st_as_sf() %>%
  # 把缓冲区的id、time属性关联到采样点
  bind_cols(buffers %>% st_drop_geometry()) %>%
  mutate(type = 0) %>% # 标记为随机点
  st_set_geometry("geometry")

# 4. 处理原始观测点,标记为type=1
observed_points <- df_sf %>%
  mutate(type = 1)

# 5. 合并数据集并转回WGS84坐标系,提取经纬度
final_df <- bind_rows(observed_points, random_points) %>%
  st_transform(crs = "epsg:4326") %>%
  # 提取经纬度列
  mutate(long = st_coordinates(.)[,1],
         lat = st_coordinates(.)[,2]) %>%
  # 移除空间几何列(如果不需要空间对象)
  st_drop_geometry() %>%
  # 整理列顺序
  select(id, long, lat, time, type)

# 查看结果示例
head(final_df, 10)

关键细节说明

  • by_feature=TRUE:强制每个缓冲区(对应单个原始GPS位置)独立采样20个点,避免不同位置的采样点混淆
  • bind_cols(buffers %>% st_drop_geometry()):这是保留关联信息的核心步骤,把每个缓冲区对应的id、time直接绑定到采样点上
  • 最终合并后的数据集中,每个随机点都能精准对应到生成它的原始观测位置的id和time

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:55:22