如何匹配采样点所属1°经×0.5°纬CRS统计矩形并写入数据集
R实现采样站点匹配固定经纬度规格网格方案
前置依赖
首先安装并加载所需工具包:
install.packages(c("sf", "dplyr")) library(sf) library(dplyr)
步骤1:计算研究区域边界
假设你的原始采样站点数据框名为sample_df,包含经度字段lon、纬度字段lat,先计算对齐网格规格的区域边界:
# 经度对齐1°整数 lon_min <- floor(min(sample_df$lon)) lon_max <- ceiling(max(sample_df$lon)) # 纬度对齐0.5°整数倍 lat_min <- floor(min(sample_df$lat)*2)/2 lat_max <- ceiling(max(sample_df$lat)*2)/2
步骤2:创建指定规格网格
使用st_make_grid生成符合要求的网格,如需兼容老版本SpatialGrid对象可直接转换:
# 生成网格并转为sf对象,添加唯一网格ID grid <- st_make_grid( offset = c(lon_min, lat_min), cellsize = c(1, 0.5), # 经度方向1°,纬度方向0.5° crs = 4326 # 对应WGS84经纬度坐标系,如用其他CRS可修改此处 ) %>% st_sf() %>% mutate(grid_id = row_number()) # 如需生成你需要的SpatialGrid对象,执行下行代码即可 spatial_grid <- as(grid, "Spatial")
步骤3:匹配站点到所属网格
通过空间连接将网格归属信息添加到原站点数据集:
# 将原始站点转为空间点对象 sample_sf <- st_as_sf(sample_df, coords = c("lon", "lat"), crs = 4326) # 空间连接,匹配每个点所属的网格 sample_with_grid <- st_join(sample_sf, grid, join = st_within) # 转换回普通数据框,保留原始经纬度字段 sample_with_grid <- sample_with_grid %>% mutate( lon = st_coordinates(.)[,1], lat = st_coordinates(.)[,2] ) %>% st_drop_geometry()
可选优化:添加网格经纬度范围字段
如果需要明确每个网格的坐标范围,可在生成网格时添加对应字段:
grid <- grid %>% mutate( grid_lon_min = st_bbox(geometry)$xmin, grid_lon_max = st_bbox(geometry)$xmax, grid_lat_min = st_bbox(geometry)$ymin, grid_lat_max = st_bbox(geometry)$ymax, .by = grid_id )
注意事项
- 若你的站点数据使用其他坐标系,需先通过
st_transform统一转换为和网格相同的CRS,避免匹配错误 - 网格ID可自定义为更易识别的格式,例如
paste0("lon_", grid_lon_min, "_lat_", grid_lat_min),方便后续按网格分组统计
内容的提问来源于stack exchange,提问作者Caro
相关产品推荐
相关产品推荐

