在R中为克里金插值准备矢量图像的栅格底图

3

经过很多搜索、询问和编码,我在R的gstat中实现了Kriging算法的基本功能。

使用4个点(是的,非常少),我对它们之间未采样的点进行了Kriging插值。但实际上,我并不需要所有这些点。在这个区域内,有一个更小的子区域…… 这才是我真正需要的。

长话短说……我有从4个气象站收集到的降雨数据。这些点的纬度和经度坐标如下:

lat    long
7.16   124.21
8.6    123.35
8.43   124.28
8.15   125.08

我在StackOverflow上的之前的问题可以看出我走向Kriging的路程。
这个:在R的gstat包中创建变异图 还有这个:在gstat中为Kriging创建R网格 我知道图片中至少有以下坐标(根据我的估计):
Leftmost: 124 13ish 0 E(DMS)

Rightmost : 124 20ish 0 E

Topmost corrdinates: 124 17ish 0 E

Bottommost coordinates: 124 16ish 0 E

转换将会进行,但我认为这并不重要,或者可以在以后更容易处理。

图像也是不规则的(但它们都是这样的)。

把它想象成一个甜甜圈,你克里格了整个甜甜圈的形状,但你只需要孔洞覆盖的区域,所以你删除或至少忽略了从甜甜圈本身得到的值。

我有一个关于该区域的图像(.jpg),我需要使用QGIS或类似软件将图像转换成shapefile或其他矢量格式。之后,我将不得不将该矢量图像插入4个点克里格区域内,以便我知道实际要考虑哪些坐标和哪些要删除。

最后,我将取出图像覆盖区域的值,并将其存储到csv或数据库中。

有人知道我如何开始吗?我对R和统计学完全不懂。感谢任何回答的人。

我只想知道它是否可能,如果可能,请提供一些提示。再次感谢。

也许我应该发布我的脚本:

suppressPackageStartupMessages({
  library(sp)
  library(gstat)
  library(RPostgreSQL)
  library(dplyr) # for "glimpse"
  library(ggplot2)
  library(scales) # for "comma"
  library(magrittr)
  library(gridExtra)
  library(rgdal)
  library(raster)
  library(leaflet)
  library(mapview)
})


drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="Rainfall Data", host="localhost", port=5432, 
             user="postgres", password="postgres")
day_1 <- dbGetQuery(con, "SELECT lat, long, rainfall FROM cotabato.sample")

coordinates(day_1) <- ~ lat + long
plot(day_1)

x.range <- as.integer(c(7.0,9.0))
y.range <- as.integer(c(123.0,126.0))

grid <- expand.grid(x=seq(from=x.range[1], to=x.range[2], by=0.05), 
               y=seq(from=y.range[1], to=y.range[2], by=0.05))

coordinates(grid) <- ~x+y
plot(grid, cex=1.5)
points(day_1, col='red')
title("Interpolation Grid and Sample Points")

day_1.vgm <- variogram(rainfall~1, day_1, width = 0.02, cutoff = 1.8)
day_1.fit <- fit.variogram(day_1.vgm, model=vgm("Sph", psill = 8000, range = 1))
plot(day_1.vgm, day_1.fit)

plot1 <- day_1 %>% as.data.frame %>%
  ggplot(aes(lat, long)) + geom_point(size=1) + coord_equal() + 
  ggtitle("Points with measurements")

plot(plot1)

############################

plot2 <- grid %>% as.data.frame %>%
  ggplot(aes(x, y)) + geom_point(size=1) + coord_equal() + 
  ggtitle("Points at which to estimate")

plot(plot2)
grid.arrange(plot1, plot2, ncol = 2)
coordinates(grid) <- ~ x + y

############################

day_1.kriged <- krige(rainfall~1, day_1, grid, model=day_1.fit)

day_1.kriged %>% as.data.frame %>%
  ggplot(aes(x=x, y=y)) + geom_tile(aes(fill=var1.pred)) + coord_equal() +
  scale_fill_gradient(low = "yellow", high="red") +
  scale_x_continuous(labels=comma) + scale_y_continuous(labels=comma) +
  theme_bw()

write.csv(day_1.kriged, file = "Day_1.csv")

编辑:自上次以来,代码已经发生了变化。但我想这并不重要,我只是想知道是否可能,并且有人能否提供最简单的示例来证明它是可能的。我可以从中推导出解决方案,以解决自己的问题。


你说得对,我会编辑这个以符合所需的标准。 - ace_01S
@42 请看我所做的修改。这样足够了吗? - ace_01S
如果那个SQL数据集是其中一个包的一部分,那就可以了。但我不在我的机器旁边一个星期,所以不能帮忙。我怀疑我能做的不多,但如果你在3天内没有得到有用的回复,请联系我。我可以为此设置赏金。 - IRTFM
新的答案看起来非常有前途。 - IRTFM
@Ace_01S请检查是否能够工作。我想获取这个+200赏金;) - gonzalez.ivan90
显示剩余2条评论
2个回答

2
简化您的问题:
- 您想基于未进行地理参考的图像勾画出一个区域。 - 您想仅提取该区域插值结果。
需要完成以下几个步骤:
1. 使用 QGIS 进行地理参考(Raster > Georeferencer),需要准备一张已进行地理参考的地图作为背景辅助。这将创建一个带有空间信息的栅格对象。 2. 有两种可能性:
- 如果图像中心部分有一种颜色可以直接用作 R 中的掩模(例如,所有绿色像素在红色像素中间)。 - 如果没有,您需要使用 QGIS 手动勾画出该区域的多边形(Layer > Create Layer > New Shapefile > Polygon)。
3. 在 R 中导入栅格或多边形 shapefile。 4. 使用函数 raster::mask 来提取插值结果的值,使用栅格图像或 SpatialPolygon。

我会点赞,但还没有授予悬赏,因为我没有看到完全编码的解决方案。而且由于我正在度假,我无法确定这组说明是否足够适合我这种在GIS编码方面经验有限的人。 - IRTFM
我明白。确实,这个问题需要更多的QGIS知识而不是R编程。因此,代码不会太多。问题在于它需要一个完整的协议,而我通常会提出一个完整的一天教程来解决这个问题。我认为stackoverflow并不旨在提供完整的课程。有了给定的步骤,Ace_01S 就会知道该去哪里查找:QGIS手册... - Sébastien Rochette
那我会等待@Ace_01S的进一步输入。我对该应用程序没有任何经验。 - IRTFM
哇,从没想到会有人回答。我会尽力更深入地研究QGIS。至于R方面的事情,在发布问题和现在之间,我已经有了一些想法。 - ace_01S

2

如果您觉得这个有用,请告诉我:

“把它想象成一个甜甜圈,你拥有整个圆形的甜甜圈但是你只需要覆盖洞口的区域,所以你需要去掉或至少忽略甜甜圈本身的值。”

为此,您需要加载您的矢量数据:

donut <- rgdal::readOGR('/variogram', 'donut')
day_1@proj4string@projargs <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" # Becouse donut shape have this CRS

plot(donut, axes = TRUE, col = 3)
plot(day_1, col = 2, pch = 20, add = TRUE)

第一张图

然后你删除“外环”,只保留内部。这也表示第二个不再是一个孔:

hole <- donut # for keep original shape
hole@polygons[1][[1]]@Polygons[1] <- NULL
hole@polygons[1][[1]]@Polygons[1][[1]]@hole <- FALSE

plot(hole, axes = TRUE, col = 4, add = TRUE)

新的shapefile为蓝色

然后,您可以检查哪些点位于“洞”新的蓝色矢量图层中:

over.pts <- over(day_1, hole)
day_1_subset <- day_1[!is.na(over.pts$Id), ]

plot(donut, axes = TRUE, col = 3)
plot(hole, col = 4, add = TRUE)
plot(day_1, col = 2, pch = 20, add = TRUE)
plot(day_1_subset, col = 'white', pch = 1, cex = 2, add = TRUE)

write.csv(day_1_subset@data, 'myfile.csv') # write intersected points table
write.csv(as.data.frame(coordinates(day_1_subset)), 'myfile.csv') # write intersected points coords
writeOGR(day_1_subset, 'path', 'mysubsetlayer', driver = 'ESRI Shapefile') # write intersected points shape

使用此代码,您可以解决“环”或甜甜圈“孔”,如果您已经有了shapefile文件。 如果您有一张图像并想要剪裁它,请尝试以下操作:

如果您加载了栅格图像(从网络获取基础地图图像):

coordDf <- as.data.frame(coordinates(day_1)) # get basemap from points
# coordDf <- data.frame(hole@polygons[1][[1]]@Polygons[1][[1]]@coords) # get basemap from hole
colnames(coordDf) <- c('x', 'y') 
imag <- dismo::gmap(coordDf, lonlat = TRUE)
myimag <- raster::crop(day_1.kriged, hole)
plot(myimag)
plot(day_1, add = TRUE, col = 2)

如果您使用day_1.kriged
myCropKrig<- raster::crop(day_1.kriged, hole)

  myCropKrig %>% as.data.frame %>%
  ggplot(aes(x=x, y=y)) + geom_tile(aes(fill=var1.pred)) + coord_equal() +
  scale_fill_gradient(low = "yellow", high="red") +
  scale_x_continuous(labels=comma) + scale_y_continuous(labels=comma) +
  geom_point(data=coordDf[!is.na(over.pts$Id), ], aes(x=x, y=y), color="blue", size=3, shape=20) +
  theme_bw()

plot3

最后,我会将图像覆盖的区域值存储到csv或数据库中。

write.csv(as.data.frame(myCropKrig), 'myCropKrig.csv')

希望您会发现这个有用,并且我能理解您的意思。

这看起来非常有前途。我一定会试试看。编辑:那是很多要解析的代码。我需要几天时间来处理。其中一些东西对我来说相当新颖(或闻所未闻)。 - ace_01S
我仍然无法检查正确性,但它至少给人一种有用的起点的印象。感谢你的努力。 - IRTFM
如果你需要帮助,请告诉我 ;) - gonzalez.ivan90
hole <- donut # 用于保持原始形状 hole@polygons[1][[1]]@Polygons[1] <- NULL hole@polygons[1][[1]]@Polygons[1][[1]]@hole <- FALSE. @gonzales.ivan90 这是什么意思?同时很抱歉最近没有回复你。我刚刚完成了图像的地理参考。 - ace_01S
这段代码允许您获取形状的孔并创建一个新图层。在第二个图中是蓝色多边形。有了这个新的多边形,您可以检查哪些元素(在本例中为车站)位于其中。 - gonzalez.ivan90
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接