#r #raster #sf
Вопрос:
У меня есть растровый объект STARS raster
в R (например, размером 100×100), и я могу получить координаты, используя st_coordinates(raster)
Но у меня возникли проблемы с конвертацией между ними. Например, я хотел бы знать координаты lat/long только для определенного растрового пикселя, например (50, 50).
Я предполагал, что st_coordinates даст мне 1D-массив, поэтому я могу просто преобразовать 2D-растровую матрицу в 1D-массив (например , преобразовав 2D-индекс (50, 50) в 1D-индекс, используя что-то вроде #columns*i j
, как в моем примере 100*50 50
).
Однако это не работает, что заставляет меня думать, что я неправильно понимаю, как растровый объект «ЗВЕЗДЫ» и индексы координат сопоставляются друг с другом. Кто-нибудь знает, как построить мост между ними двумя на основе пикселя по координатам?
===
Обновлено примером того, что я пытаюсь сделать:
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, что может объяснить проблему… У вас есть какие-либо идеи о том, как они соотносятся друг с другом и как индексировать массив координат для данного растрового пикселя? Пожалуйста, дайте мне знать, если мне все еще нужно будет уточнить. Спасибо!
Комментарии:
1. Полезно, если вы можете добавить воспроизводимый пример с ожидаемыми результатами. Например, вы можете создать растр, а затем попробовать свой код на этом растре. Вы можете использовать что-то вроде
raster::raster(matrix(runif(1e4), nrow = 100))
создания растра размером 100 x 1002. Или используйте пример tif, который поставляется вместе с
stars
пакетомsystem.file("tif/L7_ETMs.tif", package = "stars")
3. Да, хороший момент, я добавлю пример, используя значение по умолчанию. Спасибо!
Ответ №1:
Я думаю, что ключ здесь в том, чтобы подмножество 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
Комментарии:
1. Потрясающе-я провел быстрый тест, и на основании этого показалось, что это работает. Большое спасибо!