Это растровое решение, при котором пиксели NA сначала заполняются ближайшим значением пикселя, не относящегося к NA. Однако обратите внимание, что при этом не учитывается положение точки в пикселе. Вместо этого он вычисляет расстояния между центрами пикселей, чтобы определить ближайший пиксель, не относящийся к числовой апертуре.
Во-первых, он вычисляет для каждого растрового пикселя NA расстояние и направление до ближайшего пикселя, не относящегося к NA. Следующим шагом является вычисление координат этой ячейки, не относящейся к Северной Америке (предполагается проекция CRS), извлечение ее значения и сохранение этого значения в местоположении Северной Северной Америки.
Исходные данные: спроецированный растр с идентичными значениями, как в ответе от koekenbakker:
set.seed(2)
# set projected CRS
r <- raster(ncol=10,nrow=10, xmn=0, xmx=10, ymn=0,ymx=10, crs='+proj=utm +zone=1')
r[] <- 1:10
r[sample(1:ncell(r), size = 25)] <- NA
# create sample points
xy = data.frame(x=runif(10,1,10), y=runif(10,1,10))
# use normal extract function to show that NAs are extracted for some points
extracted <- raster::extract(x = r, y = xy)
Вычислите расстояние и направление от всех пикселей NA до ближайшего пикселя, не относящегося к NA:
dist <- distance(r)
# you can also set a maximum distance: dist[dist > maxdist] <- NA
direct <- direction(r, from=FALSE)
Получить координаты пикселей NA
# NA raster
rna <- is.na(r) # returns NA raster
# store coordinates in new raster: https://stackoverflow.com/a/35592230/3752258
na.x <- init(rna, 'x')
na.y <- init(rna, 'y')
# calculate coordinates of the nearest Non-NA pixel
# assume that we have a orthogonal, projected CRS, so we can use (Pythagorean) calculations
co.x <- na.x + dist * sin(direct)
co.y <- na.y + dist * cos(direct)
# matrix with point coordinates of nearest non-NA pixel
co <- cbind(co.x[], co.y[])
Извлечь значения ближайшей не-NA ячейки с координатами 'co'
# extract values of nearest non-NA cell with coordinates co
NAVals <- raster::extract(r, co, method='simple')
r.NAVals <- rna # initiate new raster
r.NAVals[] <- NAVals # store values in raster
Заполнить исходный растр новыми значениями
# cover nearest non-NA value at NA locations of original raster
r.filled <- cover(x=r, y= r.NAVals)
sampled <- raster::extract(x = r.filled, y = xy)
# compare old and new values
print(data.frame(xy, extracted, sampled))
# x y extracted sampled
# 1 5.398959 6.644767 6 6
# 2 2.343222 8.599861 NA 3
# 3 4.213563 3.563835 5 5
# 4 9.663796 7.005031 10 10
# 5 2.191348 2.354228 NA 3
# 6 1.093731 9.835551 2 2
# 7 2.481780 3.673097 3 3
# 8 8.291729 2.035757 9 9
# 9 8.819749 2.468808 9 9
# 10 5.628536 9.496376 6 6
Обратите внимание, что точка 5 принимает другое значение, чем ответ Koekenbakker, поскольку этот метод не учитывает положение точки в пикселе (как упоминалось выше). Если это важно, это решение может оказаться неподходящим. В других случаях, например. если растровые ячейки малы по сравнению с точечной точностью, этот растровый метод должен дать хорошие результаты.
person
Lennert
schedule
23.05.2016