我正在尝试以0.0417度的分辨率重新投影从经度/纬度到Behrmanns等面积(EPSG:6933)的人工发光的整体栅格。由于在重新投影过程中对像素进行插值时,市区周围的数据激增,整个图层上的数据丢失率约为15%。
我尝试将栅格转换为空间点数据框,重新投影空间点数据框,然后使用使用“投影仪”功能作为模板栅格创建的栅格进行栅格化(我认为模板栅格的尺寸,范围和分辨率可能是问题吗?)但是,这会产生一个带有水平线穿过图层的栅格。
以下是一些示例代码,以西班牙为例。我可以通过电子邮件将西班牙的tif文件(246kb):
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”函数的数据。这肯定是一个常见的问题,但我在网上找不到任何帮助。
非常感谢。
Example of horizontal lines after reprojecting stack.imgur.com/IV0fZ.png
答案 0 :(得分:0)
变换栅格时,将计算新的像元值。通常,这是通过平均来完成的,这会导致较小的极值。
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