我有一个R中的STARS光栅对象raster
(例如大小为100x100(,可以使用st_coordinates(raster)
获得坐标
但我在两者之间转换时遇到了问题。例如,我想知道仅特定光栅像素的纬度/经度坐标,例如(50,50(。
我假设st_cordinates会给我一个1D数组,所以我可以简单地从2D光栅矩阵转换为1D数组(例如,通过使用类似#columns*i+j
的东西将2D索引(50,50(转换为一维索引,在我的示例中是100*50+50
(。
但这不起作用,这让我觉得我误解了STARS光栅对象和坐标索引是如何相互映射的。有人知道如何在逐个像素的坐标基础上在两者之间架起桥梁吗?
===
更新了我尝试做的一个例子:
r <- read_stars(system.file("tif/L7_ETMs.tif", package = "stars"))
## Let's say I want to grab the pixel 50x50 from the first band.
## I can do that going into the raster matrix like this:
pixel <- r[[1]][50,50,1]
## now I can get the coordinates for the raster
## using sf like this
## this gives me a coordinate df with columns x, y and band.
coordinates <- st_coordinates(r)
## what I want to do now is get the coordinate for the
## pixel I listed earlier, (50, 50, 1) -- in my case, I only
## have one band so I'm not going to worry about band index logic
## to do this, I assume that (50, 50) is the same as
## ncol(r)*(50-1)+50 or 17298. I say 50-1 since R is using 1 indexing.
## I use this to get a coordinate from coordinates like this:
coord <- coordinates[ncol(r)*(50-1)+50,]
## This returns me the following:
> 17298 294376.5 9119350 1
## If I wanted to do this many times, I could make a list
## of coordinates for various pixels, then put them into
## a new sf object using st_as_sf(...)
当我尝试在循环中执行上述操作并绘制结果时,出现了严重的不匹配。。。在新的sf对象中绘制光栅像素后,光栅像素没有映射到正确的坐标。这让我觉得我从光栅2D阵列到坐标1D列表的转换是不对的。事实上,我意识到我根本不知道sf使用什么逻辑将光栅转换为1D列表,这可能解释了问题。。。你对这些元素如何相互映射以及如何为给定的光栅像素索引坐标阵列有什么想法吗?如果我还需要进一步澄清,请告诉我。谢谢
我认为这里的关键是给stars
对象子集,然后把子集化的对象馈送到st_coordinates
中。
r <- read_stars(system.file("tif/L7_ETMs.tif", package = "stars"))
# extract band 1 raster value at position 50, 50
# two methods with same result
# convert to matrix then subset
r[[1]][50,50,1]
#[1] 56
# subset stars raster then extract value
r[,50,50,1][[1]]
#, , 1
#
# [,1]
#[1,] 56
如果使用子集星形光栅然后提取值工作流,则可以在st_coordinates
函数中使用子集光栅。
st_coordinates(r[,50,50,1])
# x y band
#1 290187 9119350 1