R语言:如何用空间数据填充habitat矩阵(陆地填0,海洋取邻近值)
解决方案
1. 标记陆地区域并填充0
利用你已有的habitat_points_sf和land空间对象,通过空间交集判断每个网格点是否位于陆地区域,直接批量赋值0:
# 判断每个网格点是否在陆地区域内(返回布尔向量) habitat_dt$is_land <- st_within(habitat_points_sf, land, sparse = FALSE)[, 1] # 为陆地区域的单元格填充0 habitat_dt$value[habitat_dt$is_land] <- 0
2. 为海洋区域填充最近SDM点的lbs值
先将sdm数据框转换为空间点对象,再通过空间最近邻匹配,批量提取对应lbs值:
# 将sdm转换为sf空间点对象(保持与habitat相同的坐标系EPSG:4326) sdm_sf <- st_as_sf(sdm, coords = c("lon", "lat"), crs = 4326) # 筛选出所有海洋区域的点索引 ocean_points_idx <- which(!habitat_dt$is_land) # 为每个海洋点找到sdm中距离最近的点的索引 nearest_sdm_idx <- st_nearest_feature(habitat_points_sf[ocean_points_idx, ], sdm_sf) # 将对应的lbs值填充到海洋区域单元格 habitat_dt$value[ocean_points_idx] <- sdm$lbs[nearest_sdm_idx]
3. 将填充后的数据转回原始矩阵结构
最后把处理好的data.table重新整理为矩阵,恢复原有的行(纬度)列(经度)结构:
# 重新构建填充完成的habitat矩阵 habitat_filled <- matrix( habitat_dt$value, nrow = length(latitudes), ncol = length(longitudes), dimnames = list(latitudes, longitudes) )
补充说明
- 若
land包含多个多边形,st_within仍能正确判断点是否落在任意陆地多边形内; st_nearest_feature是向量化操作,完全避免了for循环,效率远高于逐点遍历;- 如果
sdm数据量极大,可通过st_sfc构建空间索引优化匹配速度:sdm_sf <- st_sfc(sdm_sf, index = TRUE)。
内容的提问来源于stack exchange,提问作者E Norton
相关产品推荐
相关产品推荐

