如何在R中基于空间点数据计算每平方公里的观测数量
计算每平方公里观测点数量的实现方案
错误原因说明
你之前使用
rasterFromXYZ运行失败,是因为该函数仅支持输入规则排列的栅格格点数据,你当前的输入是随机分布的离散空间点,不符合函数的输入要求。
实现步骤(基于R的sf+terra包)
- 第一步:加载依赖包,将数据框转为空间点对象,指定原始经纬度对应的WGS84坐标系
- 第二步:将地理坐标系(单位:度)转换为平面等面积投影坐标系(单位:米),保证面积计算精度
- 第三步:生成覆盖所有点范围的1km×1km格网模板
- 第四步:统计每个格网内的点数量,即为每平方公里的总观测值
完整可运行代码
# 加载依赖包,未安装可先运行 install.packages(c("sf","terra")) library(sf) library(terra) # 你的示例数据 den_dt <- structure(list(lat = c(49.0267, 49.0984, 49.1023, 49.107, 49.1077, 49.1107, 49.1178, 49.1278, 49.1493, 49.1634, 49.2385, 49.2498, 49.2834, 49.3235, 49.3467, 49.3796, 49.3878, 51.7285, 51.7319, 51.7524, 51.7781, 51.7841, 51.7851, 51.7926, 51.8188, 51.9553, 52.0331, 52.0342, 52.214, 52.2379, 52.4323, 52.492, 52.5312, 52.5337, 52.5772, 52.6456, 52.656, 52.7196, 52.8439, 52.851), lon = c(108.9861, 108.9342, 108.8654, 108.73, 109.0154, 108.9548, 108.8164, 108.6334, 108.9442, 108.6959, 119.4774, 119.5568, 117.5601, 117.5536, 119.3105, 119.9174, 117.594, 119.7592, 119.7747, 122.6436, 119.7638, 119.651, 122.6079, 119.7761, 119.7572, 121.9104, 121.8712, 122.4515, 121.7362, 121.7861, 121.9452, 121.9638, 121.471, 122.1595, 121.5216, 122.2008, 121.9462, 121.4331, 122.1229, 122.1054), val = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, -40L), class = c("tbl_df", "tbl", "data.frame")) # 转为WGS84坐标系的空间点 pts_sf <- st_as_sf(den_dt, coords = c("lon", "lat"), crs = "EPSG:4326") # 转换为中国区域的兰伯特等面积投影,也可替换为研究区对应的UTM投影 pts_proj <- st_transform(pts_sf, crs = "+proj=aea +lat_1=25 +lat_2=47 +lon_0=105") # 创建1km*1km的格网模板 ras_template <- rast(ext(pts_proj), resolution = 1000, crs = st_crs(pts_proj)$wkt) # 统计每个格网内的点数量,即每平方公里观测数 point_density <- rasterize(vect(pts_proj), ras_template, fun = "count", background = 0) # 导出为带坐标的数据框(按需使用) density_df <- as.data.frame(point_density, xy = TRUE)
结果说明
生成的point_density为栅格格式结果,每个栅格值对应1平方公里范围内的总观测点数量,无点分布的区域默认值为0。
内容的提问来源于stack exchange,提问作者Lily Nature
相关产品推荐
相关产品推荐

