R语言中st_as_stars/read_stars转换raster丢失x&y值的解决方法
Raster转Stars时坐标丢失与CRS异常的解决方法
问题分析
你遇到的x/y值为NULL、CRS属性异常问题,本质是原Raster对象的空间范围(extent)信息未被正确传递到Stars对象,仅靠设置CRS元数据无法自动生成坐标序列。
解决方案
1. 先确认原Raster的空间属性完整性
转换前先检查Raster对象的extent和CRS是否正常:
print(x)
输出需包含完整的Extent和CRS信息,例如:
class : RasterLayer dimensions : 500, 500, 250000 (nrow, ncol, ncell) resolution : 116, 116 (x, y) extent : -29000, 29000, -29000, 29000 (xmin, xmax, ymin, ymax) crs : +proj=aeqd +datum=WGS84 +units=m +no_defs source : originalobject names : layer values : 0, 100 (min, max)
如果extent缺失,先手动重置(替换为你的实际范围):
x <- raster::setExtent(x, raster::extent(-29000, 29000, -29000, 29000))
2. 正确转换为Stars对象
方法一:转换时直接指定CRS
利用st_as_stars的crs参数,直接从Raster对象同步CRS和extent:
surfaceUD <- stars::st_as_stars(x, crs = raster::crs(x))
方法二:读取文件时直接指定空间参数
如果直接从文件读取,同步传入CRS和extent:
surfaceUD <- stars::read_stars("originalobject", crs = dataCRS, extent = raster::extent(x))
方法三:手动补全坐标序列
若前两种方法失效,手动生成坐标并绑定到Stars对象:
surfaceUD <- stars::st_as_stars(x) # 生成原Raster的坐标序列 x_coords <- seq(raster::xmin(x), raster::xmax(x), by = raster::xres(x)) y_coords <- seq(raster::ymin(x), raster::ymax(x), by = raster::yres(x)) # 替换Stars对象的维度信息 attr(surfaceUD, "dimensions")[[1]] <- stars::st_dimensions(x = x_coords, crs = dataCRS) attr(surfaceUD, "dimensions")[[2]] <- stars::st_dimensions(y = y_coords, crs = dataCRS)
3. 验证转换结果
运行print(surfaceUD),确认输出中x/y维度包含坐标范围、分辨率和正确CRS:
stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. originalobject 0.0 12.5 50.0 49.8 87.5 100.0 dimension(s): from to offset delta refsys point x/y x 1 500 -29000 116 +proj=aeqd +datum=WGS84... FALSE [x] y 1 500 -29000 116 +proj=aeqd +datum=WGS84... FALSE [y]
内容的提问来源于stack exchange,提问作者dez93_2000
相关产品推荐
相关产品推荐

