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

landscapemetrics调用sample_lsm报extents do not overlap错误排查

报错原因

报错的核心原因是栅格数据和点位数据的坐标参考系不匹配:

  • 你读入的landscape栅格是投影坐标系(北美阿尔伯斯等积投影ESRI:102039),坐标单位为米,坐标值范围为x:17280901843980、y:19681802236380,是百万级的米制数值。
  • 你从csv读入的GPS点位存储的是地理坐标系下的经纬度值(经度-75-74、纬度3941),单位为度,数值量级和栅格差了上万倍,二者的空间范围完全没有交集,因此触发范围不重叠的报错。

你在GIS中看到两个数据对齐是GIS软件自动做了动态投影适配,但csv格式本身不存储坐标系信息,导入R后不会自动完成坐标转换,直接传入原始经纬度值必然出现空间错位。

修复方案

按照以下步骤处理点位坐标即可解决问题:

  1. 将读入的csv点位转为空间对象,先给它赋予原始经纬度对应的地理坐标系(你这个点位范围是美国东北部,和NLCD数据基准匹配用NAD83地理坐标系EPSG:4269即可,如果GPS采集用的是WGS84就替换为EPSG:4326)
  2. 将点位重投影到和landscape栅格完全一致的投影坐标系,得到米为单位、和栅格坐标范围匹配的点位坐标
  3. 用转换后的坐标矩阵传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:48:15