R: перезаписать координаты xy растрового слоя

У меня есть растр с координатами XY в пикселях, который я хочу преобразовать в широту и долготу.

class       : RasterLayer 
dimensions  : 1617, 1596, 2580732  (nrow, ncol, ncell)
resolution  : 1, 1  (x, y)
extent      : 0, 1596, 0, 1617  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : C:\janW1.png 
names       : janW1 
values      : 0, 255  (min, max)

Я рассчитал координаты широты и долготы, используя формулу, указанную здесь.

Это привело к следующему фрейму данных

heads(cords)
       lat       lon   x      y janW1
1 46.99401 -14.99122 0.5 1616.5     0
2 46.99401 -14.97367 1.5 1616.5     0
3 46.99401 -14.95611 2.5 1616.5     0
4 46.99401 -14.93856 3.5 1616.5     0
5 46.99401 -14.92100 4.5 1616.5     0
6 46.99401 -14.90345 5.5 1616.5     0

Как я могу перезаписать или создать дубликат растра с пространственным размером в широте и долготе вместо координат изображения (XY пикселей)? Или есть более простой способ преобразовать пиксели в широту / долготу?

Код

library(raster)
test <- raster('janW1.png')
data_matrix <- rasterToPoints(test)

#  Calculate longitude.

lonfract = data_matrix[,"x"] / (1596 - 1)
lon = -15 + (lonfract * (13 - -15))

#  Calculate latitude.

latfract = 1.0 - (data_matrix[,"y"] / (1617 - 1))  
Ymin = log(tan ((pi/180.0) * (45.0 + (47 / 2.0))))
Ymax = log(tan ((pi/180.0) * (45.0 + (62.999108 / 2.0))))
Yint = Ymin + (latfract * (Ymax - Ymin))
lat = 2.0 * ((180.0/pi) * (atan (exp (Yint))) - 45.0)

# Make single dataframe with XY pixels and latlon coords.
latlon <- data.frame(lat,lon)
tmp <- data.frame(data_matrix)
cords <- cbind(latlon, tmp)

janW1.png


person G. Gip    schedule 15.03.2016    source источник
comment
Добро пожаловать в SO. Пожалуйста, всегда старайтесь предоставить воспроизводимый пример - включая изображение, способ его загрузки и необходимые пакеты, а также то, как вы выполняете геотрансформацию. На ваш вопрос: что, если вы просто сделаете extent(r) <- extent(min(cords$lon), max(cords$lon), min(cords$lat), max(cords$lat))?   -  person lukeA    schedule 15.03.2016
comment
обновлено по запросу. Я также пробовал изменять экстенты, однако изображение просто растягивается при печати.   -  person G. Gip    schedule 15.03.2016
comment
примечание: кажется, что extent(r) <- extent(min(cords$lon), max(cords$lon), min(cords$lat), max(cords$lat)) дает немного другие координаты широты и долготы по сравнению с cords фреймом данных.   -  person G. Gip    schedule 15.03.2016


Ответы (2)


Изменить проекцию растровых данных не так просто, как для точек (и линий, полигонов). Это потому, что если вы вычисляете новые координаты из текущих ячеек, они не будут в обычном растре.

Вы можете использовать функцию projectRaster (растровый пакет), чтобы справиться с этим.

library(raster)
test <- raster('janW1.png')

# In this case, you need to provide the correct crs to your data
# I am guessing. (this would be necessary for spatial data sets)
crs(test) <- '+proj=merc +datum=WGS84'

# you may also need to set the extent to actual coordinate values
# extent(test) <- c( , , ,) 
x <- projectRaster(test, crs='+proj=longlat +datum=WGS84') 

Кроме того, вы можете интерполировать вычисленные вами значения в новый растр. См. Примеры ?raster::interpolate.

person Robert Hijmans    schedule 15.03.2016
comment
К сожалению, этот код не возвращает долготу и широту, т.е.extent(x): -4.49e-05, 0.01438596, -4.826575e-05, 0.01466885 (xmin, xmax, ymin, ymax) - person G. Gip; 15.03.2016
comment
но это вероятно потому, что назначенный crs неверен, а размер r почти наверняка неверен. Вы используете графический файл, как если бы он представлял пространственные данные. - person Robert Hijmans; 15.03.2016
comment
но графический файл действительно представляет пространственные данные, это растр температуры поверхности моря, полученный со спутника AVHRR. - person G. Gip; 16.03.2016
comment
Поскольку файл не хранит пространственную привязку, мы не можем знать, где на Земле должны быть расположены данные. Если вы этого не знаете и не можете предоставить эту информацию. - person Robert Hijmans; 17.03.2016
comment
широта / долгота данных - Latitude range: 47 — 62.999108 Longditude range: -15 — 13. См. здесь для получения дополнительной информации - person G. Gip; 29.08.2016

Не могли бы вы создать растр с нуля с желаемым разрешением и пространственной протяженностью, а затем импортировать в него свои значения. Чтобы создать растр, вы можете использовать что-то вроде:

# Create a matrix of coordinates that define the limits of your raster

ex <- matrix(c(-20, -9.5, 20.5, 31.5), nrow = 2, ncol = 2, byrow = T)

# Turn those coordinates into an extent

ex <- extent(ex)

# Create a raster with the same dimensions as your original one

r <- raster(nrows = 1617, ncols = 1596)

# Set the extent of your raster

r <- setExtent(r, ex, keepres=F)

Чтобы перенести значения из вашего предыдущего растра в только что созданный растр, вы можете использовать:

test <- raster('janW1.png')

# Create vector of values from test

n <- values(test)

# Give values from test to r

values(r) <- n

Я думаю, что получил правильное разрешение из вашего кода, но вам нужно будет ввести четыре координаты вашего экстента в себя. Пустой растр должен иметь точно такое же разрешение, что и исходный растр, иначе он не будет работать. Пустой растр, который вы создаете, автоматически сохраняется в WGS84, поэтому вы можете перепроецировать его, как только вы загрузите свои данные.

person James    schedule 10.06.2016
comment
Как бы я поставил четыре координаты для протяженности? - person G. Gip; 29.08.2016
comment
Кроме того, я не могу создать растровый файл? Тот, который я могу добавить в другие программы, например, Arcmap. Исходный файл не перезаписывается новыми шнурами широты и длины. - person G. Gip; 29.08.2016
comment
Чтобы добавить координаты, вам просто нужно заменить свои собственные координаты на -20, -9,5, 20,5, 31,5, которые я использовал в первой строке моего кода. R не будет вносить никаких изменений в ваши файлы, пока вы не сообщите ему об этом, поэтому вам нужно будет использовать что-то вроде write.raster, чтобы сохранить новый растр в виде файла, который вы можете загрузить в другие программы. - person James; 30.08.2016