R 球面上的大地数据插值

R 球面上的大地数据插值,r,geospatial,spatial,geo,R,Geospatial,Spatial,Geo,我有一个lat/lon坐标数据集,每个地理位置对应0/1值(4到200+个数据点)。现在,我想对空洞进行插值,并根据插值结果向球体表面添加颜色。我的主要问题是插值“环球”,因为目前我在平面上插值,这显然不起作用 我的数据 set.seed(41) n <- 5 s <- rbind(data.frame(lon = rnorm(n, 0, 180), lat = rnorm(n, 90, 180),

我有一个lat/lon坐标数据集,每个地理位置对应0/1值(4到200+个数据点)。现在,我想对空洞进行插值,并根据插值结果向球体表面添加颜色。我的主要问题是插值“环球”,因为目前我在平面上插值,这显然不起作用

我的数据

set.seed(41)
n <- 5
s <- rbind(data.frame(lon = rnorm(n, 0, 180),
                      lat = rnorm(n, 90, 180),
                      value = 0),
           data.frame(lon = rnorm(n, 180, 180),
                      lat = rnorm(n, 90, 180),
                      value = 1))
s$lon <- s$lon %% 360 -180
s$lat <- s$lat %% 180 -90
s_old <- s

显然,这不适用于球体,因为左侧与右侧不匹配。在球体上,插值应该是无缝的


我可以使用什么方法对R中的球体进行插值?

您可以自己计算点和栅格之间的距离,然后使用自己的插值。例如,下面是数据示例上的反向距离插值

生成数据 使用反距离插值在球体上进行插值 在这里,我建议使用经典的反距离插值(幂为2)(
idp=2
)进行插值。如果需要其他幂次插值或线性插值,或者如果要使用有限数量的邻居进行插值,则可以修改自己的计算

# Inverse distance interpolation using distances
# pred = 1/dist^idp
idp <- 2
inv.w <- (1/(s.r.dists^idp))
z <- (t(inv.w) %*% matrix(s$value)) / apply(inv.w, 2, sum)

r.pred <- r
values(r.pred) <- z
#使用距离的反距离插值
#pred=1/dist^idp

idp一个问题:我如何才能实现插值不给单个点赋予太多权重,即当一个绿点被许多红点包围时,绿点的插值不应该是绿色的,而应该是红色的,或者只是略带绿色的,表明该区域是红色的。看到了吗?在这种情况下,这不是插值。对于插值,距离很重要,因此当dist=0时,预测几乎等于数据。您可以减少idp的权重,但您需要的更多是一个模型,而不是插值。我可以在这里用gam或glm来告诉你我的另一个答案:但是,这并不能解决球体插值的问题。也许你们可以把坐标从北到南转换成赤平图,然后在模型上试一试?然后谴责。。。
nx <- 361
ny <- 181
xo <- seq(-180, 179, len=nx)
yo <- seq(-90, 89, len=ny)
xy <- as.data.frame(coordinates(s))
int <- akima:::interp(x = xy$lon, y = xy$lat, z = s$value, 
                      extrap = T, 
                      xo = xo, yo = yo, 
                      nx = nx, ny=100, 
                      linear = F)
z <- int$z
# correct for out of range interpolations values
z[z < 0] <- 0
z[z > 1] <- 1

grd <- expand.grid(lon = seq(-180,180, by = 20), 
                   lat = seq(-90, 90, by=10))
coordinates(grd) <- ~lon + lat
gridded(grd) <- TRUE
plot(grd, add=F, col=grey(.8))

## create raster image
r <- raster(nrows=ny, ncols=nx, crs='+proj=longlat',
            xmn=-180, xmx=180, ymn=-90, ymx=90)
values(r) <- as.vector(z)  

# tweaking of color breaks
colors <- alpha(colorRampPalette(c("red", "yellow", "green"))(21), .4)
br <- seq(0.3, 0.7, len=20)
image(xo, yo, z, add = T, col = colors, breaks=c(-.1, br, 1.1))
points(s, col=s$value + 2, pch=16, cex=.6)
library(sp)
library(rgdal)

# Data
set.seed(41)
n <- 5
s <- rbind(data.frame(lon = rnorm(n, 0, 180),
                      lat = rnorm(n, 90, 180),
                      value = 0),
           data.frame(lon = rnorm(n, 180, 180),
                      lat = rnorm(n, 90, 180),
                      value = 1))
s$lon <- s$lon %% 360 -180
s$lat <- s$lat %% 180 -90
s_old <- s
## create raster image
r <- raster(nrows=ny, ncols=nx, crs='+proj=longlat',
            xmn=-180, xmx=180, ymn=-90, ymx=90)
# Distance between points and raster
s.r.dists <- spDists(x = coordinates(s), y = coordinates(r), longlat = TRUE)
# Inverse distance interpolation using distances
# pred = 1/dist^idp
idp <- 2
inv.w <- (1/(s.r.dists^idp))
z <- (t(inv.w) %*% matrix(s$value)) / apply(inv.w, 2, sum)

r.pred <- r
values(r.pred) <- z
# tweaking of color breaks
colors <- alpha(colorRampPalette(c("red", "yellow", "green"))(21), .4)
br <- seq(0.3, 0.7, len=20)
plot(r.pred, col = colors, breaks=c(-.1, br, 1.1), legend=F)
points(s, col=s$value + 2, pch=16, cex=.6)