在 R 中的各个 STARS 像素和 SF lat/long 坐标之间进行转换
Convert between individual STARS pixels and SF lat/long coordinates in R
我在 R 中有一个 STARS 栅格对象 raster
(例如大小为 100x100)并且可以使用 st_coordinates(raster)
获取坐标
但我在两者之间转换时遇到问题。例如,我想知道 仅 特定光栅像素的 lat/long 坐标,例如(50, 50).
我假设 st_coordinates 会给我一个一维数组,所以我可以简单地从二维栅格矩阵转换为一维数组(例如,通过将二维索引 (50, 50) 转换为一维使用类似 #columns*i+j
的索引,在我的示例中是 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 对象中绘制光栅像素后,它们没有映射到正确的坐标。这让我觉得我从光栅二维数组到坐标一维列表的转换是不正确的。事实上,我意识到我根本不知道 sf 使用什么逻辑将栅格转换为一维列表,这可能解释了问题......你对这些如何相互映射以及如何索引有任何想法吗给定光栅像素的坐标数组?如果我还需要进一步澄清,请告诉我。谢谢!
我认为这里的关键是对 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
我在 R 中有一个 STARS 栅格对象 raster
(例如大小为 100x100)并且可以使用 st_coordinates(raster)
但我在两者之间转换时遇到问题。例如,我想知道 仅 特定光栅像素的 lat/long 坐标,例如(50, 50).
我假设 st_coordinates 会给我一个一维数组,所以我可以简单地从二维栅格矩阵转换为一维数组(例如,通过将二维索引 (50, 50) 转换为一维使用类似 #columns*i+j
的索引,在我的示例中是 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 对象中绘制光栅像素后,它们没有映射到正确的坐标。这让我觉得我从光栅二维数组到坐标一维列表的转换是不正确的。事实上,我意识到我根本不知道 sf 使用什么逻辑将栅格转换为一维列表,这可能解释了问题......你对这些如何相互映射以及如何索引有任何想法吗给定光栅像素的坐标数组?如果我还需要进一步澄清,请告诉我。谢谢!
我认为这里的关键是对 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