landscapemetrics调用sample_lsm报extents do not overlap错误排查
报错原因
报错的核心原因是栅格数据和点位数据的坐标参考系不匹配:
- 你读入的
landscape栅格是投影坐标系(北美阿尔伯斯等积投影ESRI:102039),坐标单位为米,坐标值范围为x:17280901843980、y:19681802236380,是百万级的米制数值。 - 你从csv读入的GPS点位存储的是地理坐标系下的经纬度值(经度-75-74、纬度3941),单位为度,数值量级和栅格差了上万倍,二者的空间范围完全没有交集,因此触发范围不重叠的报错。
你在GIS中看到两个数据对齐是GIS软件自动做了动态投影适配,但csv格式本身不存储坐标系信息,导入R后不会自动完成坐标转换,直接传入原始经纬度值必然出现空间错位。
修复方案
按照以下步骤处理点位坐标即可解决问题:
- 将读入的csv点位转为空间对象,先给它赋予原始经纬度对应的地理坐标系(你这个点位范围是美国东北部,和NLCD数据基准匹配用NAD83地理坐标系EPSG:4269即可,如果GPS采集用的是WGS84就替换为EPSG:4326)
- 将点位重投影到和
landscape栅格完全一致的投影坐标系,得到米为单位、和栅格坐标范围匹配的点位坐标 - 用转换后的坐标矩阵传入
sample_lsm计算即可
修正后的可运行代码如下:
library(raster) library(terra) library(landscapemetrics) library(landscapetools) library(sf) # 用于空间坐标转换 # 读入栅格 landscape <- raster("~/landscape.tif") # 读入原始点位csv points_raw <- read.csv("~/points.csv") # 转为空间矢量对象,指定原始经纬度对应的坐标系 points_sf <- st_as_sf(points_raw, coords = c("longitude", "latitude"), crs = 4269) # 重投影到和栅格完全一致的坐标系 points_proj <- st_transform(points_sf, crs = crs(landscape)) # 提取转换后的坐标矩阵 points_mat <- st_coordinates(points_proj) # 可选验证:查看点位坐标范围是否落在栅格范围内 apply(points_mat, 2, range) extent(landscape) # 运行景观指数计算 x <- sample_lsm(landscape, y = points_mat, plot_id = NULL, shape = "circle", size = 10000, what = "lsm_c_te", classes_max = NULL, verbose = FALSE)
注意:如果验证步骤发现转换后的点位坐标依然不在栅格范围内,需要回到GIS中确认原始点位的实际覆盖范围,是否真的落在你使用的landscape.tif栅格覆盖区域内。
内容的提问来源于stack exchange,提问作者jmf
相关产品推荐
相关产品推荐

