R语言STARS栅格像素与SF经纬度坐标转换方法咨询
STARS栅格像素索引与坐标映射的正确方法
错位原因
你之前的索引换算逻辑不符合st_coordinates()的排序规则:st_coordinates()返回的坐标会先按横坐标x从左到右遍历所有列,再按纵坐标y从大到小(栅格从上到下)遍历所有行,和R矩阵[行,列]的索引顺序不匹配,因此直接按列优先换算一维索引会出现错位。
解决方法
方法1:直接计算像素坐标(最高效,适合大栅格)
不需要生成全量坐标表,直接从栅格维度属性计算坐标:
# 读取示例数据 r <- read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) # 获取栅格基础属性 dim_info <- st_dimensions(r) x_origin <- dim_info$x$offset # 栅格左上角x坐标 y_origin <- dim_info$y$offset # 栅格左上角y坐标 x_res <- dim_info$x$delta # x方向分辨率(正数,向右递增) y_res <- dim_info$y$delta # y方向分辨率(负数,向下递减) # 要查询的像素索引[i,j],对应r[[1]][i,j,波段]的索引 i <- 50 j <- 50 # 计算像素中心坐标,加0.5是取像素中心而非左上角 x_coord <- x_origin + x_res * (j - 1 + 0.5) y_coord <- y_origin + y_res * (i - 1 + 0.5)
方法2:修正一维索引换算逻辑
如果你需要使用st_coordinates()返回的全量坐标表,正确的索引换算公式如下:
coordinates <- st_coordinates(r) n_col <- ncol(r) n_row <- nrow(r) i <- 50 j <- 50 # 正确的一维索引计算公式 correct_idx <- (n_row - i) * n_col + j coord <- coordinates[correct_idx, ]
方法3:批量提取最简方案
如果需要批量提取多个像素的坐标并转为sf对象,不需要手动计算索引,直接用stars原生切片语法即可自动对齐坐标:
# 示例:批量提取多组像素的坐标和对应值 pixel_index <- data.frame( i = c(50, 60, 70, 80), j = c(50, 70, 90, 110) ) # 直接切片后转sf,自动包含坐标和像素值 pixel_sf <- st_as_sf(r[pixel_index$i, pixel_index$j, ])
内容的提问来源于stack exchange,提问作者coder11
相关产品推荐
相关产品推荐

