Преобразование между пикселями отдельных ЗВЕЗД и координатами SF lat/long в R

#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 100

2. Или используйте пример 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. Потрясающе-я провел быстрый тест, и на основании этого показалось, что это работает. Большое спасибо!