Меньше экстремальных значений при перепроектировании растровых данных

#r #raster #map-projections

#r #растровые #картографические проекции

Вопрос:

Я пытаюсь перепроектировать глобальный растр искусственного излучения света с долготы / широты на равную площадь Берманна (EPSG: 6933) с разрешением 0,0417 градусов. Из-за скачков данных в городских районах, когда пиксели интерполируются во время перепроектирования, происходит потеря данных на уровне около 15% по всему слою.

Я попытался преобразовать растр в фрейм данных пространственных точек, перепроектировать фрейм данных пространственных точек, а затем растрировать с использованием растра, созданного с использованием функции «projectraster» в качестве растра шаблона (я думаю, что размеры, протяженность и разрешение растра шаблона могут быть проблемой?) Однако при этом получается растр с горизонтальными линиями через слой.

Вот пример кода с Испанией в качестве примера. Я могу отправить по электронной почте файл tif для Испании (246 КБ):

 library("sf")
library("raster")

behrmann <- CRS(' proj=cea  lon_0=0  lat_ts=30  x_0=0  y_0=0  datum=WGS84  ellps=WGS84  units=m  no_defs')

r <- raster("~/Documents/R spatial data[enter image description here][1]/Spain.tif")
cellStats(r, sum) # check summed light emissions
r_temp <- projectRaster(r, crs = behrmann) # creates template for rasterisation (data is lost due to interpolation of data spikes)
spdf <- rasterToPoints(r, spatial = TRUE)
spdf2 <- spTransform(spdf, CRS = behrmann)
r2 <- rasterize(spdf2, r_temp, field = "Spain", fun = "sum")
cellStats(r2, sum) # check no data has been lost
plot(log10(r2)) # see attached image[enter image description here][1]
  

Как можно перепроектировать на равную область без потери данных и избегая горизонтальных линий? Я также попытался преобразовать в фрейм пространственных полигонов вместо пространственных точек, и это не приводит к созданию линий, а вместо этого теряет данные, аналогичные функции ‘projectRaster’. Это должно быть распространенной проблемой, но я не могу найти никакой помощи в Интернете.

Заранее большое спасибо.

Пример горизонтальных линий после перепроектирования stack.imgur.com/IV0fZ.png

Ответ №1:

При преобразовании растра вычисляются новые значения ячеек. Обычно это делается путем усреднения, что приводит к менее экстремальным значениям.

 library(raster)
r <- raster(res=5)
set.seed(1)
values(r) <- runif(ncell(r))
r <- focal(r, w=matrix(1, 3, 3))
r <- focal(r, w=matrix(1, 3, 3))
r <- round(focal(r, w=matrix(1, 3, 3)))
r
#class      : RasterLayer 
#dimensions : 36, 72, 2592  (nrow, ncol, ncell)
#resolution : 5, 5  (x, y)
#extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#crs        :  proj=longlat  datum=WGS84  no_defs 
#source     : memory
#names      : layer 
#values     : 229, 473  (min, max)


behrmann <- " proj=cea  lon_0=0  lat_ts=30  x_0=0  y_0=0  datum=WGS84  ellps=WGS84  units=m"
x <- projectRaster(r, crs=behrmann)
x
#class      : RasterLayer 
#dimensions : 27, 78, 2106  (nrow, ncol, ncell)
#resolution : 482000, 638000  (x, y)
#extent     : -18813530, 18782470, -8607770, 8618230  (xmin, xmax, ymin, ymax)
#crs        :  proj=cea  lat_ts=30  lon_0=0  x_0=0  y_0=0  datum=WGS84  units=m  no_defs 
#source     : memory
#names      : layer 
#values     : 233.0725, 471.7214  (min, max)
  

Однако вместо этого вы могли бы использовать метод ближайшего соседа (это было бы похоже на то, что вы пытались сделать, преобразуя точечные данные).

 z <- projectRaster(r, crs=behrmann, method="ngb")
z
#class      : RasterLayer 
# ...
#values     : 229, 473  (min, max)
  

или действительно используйте полигоны (если у вас не слишком много ячеек)

 p <- as(r, "SpatialPolygonsDataFrame")
y <- spTransform(p, behrmann)

y
#class       : SpatialPolygonsDataFrame 
#features    : 2160 
#extent      : -17367530, 17367530, -7089914, 7089914  (xmin, xmax, ymin, ymax)
#crs         :  proj=cea  lat_ts=30  lon_0=0  x_0=0  y_0=0  datum=WGS84  units=m  no_defs 
#variables   : 1
#names       : layer 
#min values  :   229 
#max values  :   473 
  

Комментарии:

1. Спасибо за быстрый ответ. К сожалению, я уже пробовал подход ближайшего соседа, с тем же результатом (потерянные данные). Я думаю, что при использовании данных об искусственном освещении в ночное время или данных о населении, если на то пошло, всплески в городских районах слишком велики, и поэтому данные теряются. При использовании подхода с пространственными точками данные не теряются, но в итоге вы получаете эти горизонтальные линии на растре. Использование подхода с пространственными полигонами привело к потере данных. кроме того, для работы с глобальным растром с разрешением 0,0417 градуса потребовалось более суток