Как извлечь конкретные значения с точечными координатами из интерполяций Кригинга, выполненных в R?
Используя R версии 3.4.2 и библиотеку "geoR", я сделал кригол интерполяции для разных переменных (ниже я привожу пример моего процесса). Я также сделал матрицу с координатами для 305 деревьев с различными отметками (виды, DBH, высота), которые находятся в одном и том же пространстве для интерполяции, как показано на прилагаемом изображении ( https://imgur.com/SLQBnZH). Я искал способы извлечь ближайшее значение из каждой переменной для каждого дерева и сохранить соответствующие значения в data.frame или матрице, но не удалось, и я не могу найти конкретные ответы на это.
Одна вещь, на которую я смотрел, это попытка преобразовать результат Кригинга в Растр (.tif) и перейти оттуда. Но интерполяции Кригинга сделаны из векторных данных, так что это вообще возможно?
Буду рад любой помощи, заранее благодарю!
PS Я делаю это для того, чтобы позднее я мог использовать данные для анализа пространственных точек.
#Kriging####:
PG<-read.csv("PGF.csv", header=T, stringsAsFactors=FALSE)
library("geoR")
x<-(PG$x)
y<-(PG$y)
#Grid
loci<-expand.grid(x=seq(-5, 65, length=100), y=seq(-5, 85, length=100))
names(loci)<-c("x", "y")
mix<-cbind(rep(1,10000), loci$x, loci$y, loci$x*loci$y)
#Model
pH1.mod<-lm(pH1~y*x, data=PG, x=T)
pH1.kg<-cbind(pH1.mod$x[,3], pH1.mod$x[,2], pH1.mod$residuals)
#Transform to geographic data
pH1.geo<-as.geodata(pH1.kg)
#Variogram
pH1.vario<-variog(pH1.geo, max.dist=35)
pH1.vario.mod<-eyefit(pH1.vario)
#Cross validation
pH1.valcruz<-xvalid(pH1.geo, model=pH1.vario.mod)
#Kriging
pH1.krig<-krige.conv(pH1.geo, loc=loci, krige=krige.control(obj.model=pH1.vario.mod[[1]]))
#Predictive model
pH1a.yhat<-mix %*% pH1.mod$coefficients + pH1.krig$predict
#Exchange Kriging prediction values
pH1.krig$predict<-pH1.yhat
#Image
image(pH1.krig2)
contour(pH1.krig2, add=TRUE)
#Tree matrix####:
CoA<-read.csv("CoAr.csv", header=T)
#Data
xa<-(CoA$X)
ya<-(CoA$Y)
points(xa,ya, col=4)
TreeDF<-(cbind.data.frame(xa, ya, CoA$Species, CoA$DBH, CoA$Height, stringsAsFactors = TRUE))
m<-(cbind(xa, ya, 1:305))
as.matrix(m)
Я попытался найти значение точки в пространстве (деревья [1:305]) по минимальному расстоянию до прогнозируемого значения, используя следующий код (я предлагаю не запускать это, поскольку это занимает слишком много времени):
for(i in 1:2){print(c(2:10000)[as.matrix(dist(rbind(m[i,], as.matrix(pH1.krig2$predict))))[i,2:10000]==min(as.matrix(dist(rbind(m[i,],as.matrix(pH1.krig2$predict))))[i,2:10000])])}
1 ответ
В следующей ссылке ответ aldo_tapia был подход, необходимый для этой проблемы. Спасибо всем! https://gis.stackexchange.com/questions/284698/how-to-extract-specific-values-with-point-coordinates-from-kriging-interpolation
Процесс выглядит следующим образом:
Используйте функцию extract() из растрового пакета:
library(raster)
r <- SpatialPointsDataFrame(loci, data.frame(predict = pH1.krig$predict))
gridded(r) <- T
r <- as(r,'RasterLayer')
pts <- SpatialPointsDataFrame(CoA[,c('X','Y')],CoA)
pH1.arb <-extract(r, pts)
к этому я просто добавил значения через cbind к фрейму данных дерева, так как они в порядке.
COA2<-cbind(CoA, pH1val=pH1.arb)
Я повторю процесс для каждой переменной.