经过大量搜索,询问并做了一些代码之后,我在R's gstat中做了克里金的最低限度。
使用4分(我知道,非常糟糕),我在他们之间找到了非抽样点。但实际上,我并不需要所有这些要点。在该区域内,有一个较小的分区......这个区域是我真正需要的区域。
长话短说..我从4个气象站测量了雨量数据。这些点的纬度和长度坐标为:
lat long
7.16 124.21
8.6 123.35
8.43 124.28
8.15 125.08
我可以通过之前关于StackOverflow的问题看到我的克里金之路。
这:Create variogram in R's gstat package
而且:Create Grid in R for kriging in gstat
我知道图像中有坐标(至少根据我的估计):
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点kriged区域内插入该矢量图像,因此我知道要实际考虑哪些坐标以及要删除哪些坐标。
最后,我获取图像所覆盖区域的值,并将它们存储到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")
编辑:自上次以来代码已更改。但这并不重要,我想,我只是想知道它是否可能,并且任何人都可以提供最简单的例子。我可以从那里向我自己的问题推导出示例的解决方案。
答案 0 :(得分:2)
简化您的问题:
需要采取的措施很少
Raster > Georeferencer
)。您需要在后台提供地理参考地图才能提供帮助。这将创建一个包含空间信息的栅格对象。 Layer > Create Layer > New Shapefile > Polygon
)raster::mask
使用光栅图像或SpatialPolygon提取插值值。答案 1 :(得分:2)
如果您觉得这很有用,请告诉我们:
&#34;把它想象成一个甜甜圈,你可以看到甜甜圈的整个圆形形状,但是你只需要这个洞所覆盖的区域,这样你就可以移除或至少忽略你从甜甜圈本身获得的价值。 &#34;
为此你加载了矢量数据:
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)
然后删除&#39;外部环&#39;并保持内幕。同时表明第二个不再是一个洞了:
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)
在那之后,你会发现他们的内心点是“洞穴”。新的蓝色矢量图层:
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
使用此代码,您可以解决&#39; ring&#39;或甜甜圈&#39;洞&#39;如果你已经有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()
并且&#34;最后,我获取图像所覆盖区域的值并将它们存储到csv或数据库中。&#34;
write.csv(as.data.frame(myCropKrig), 'myCropKrig.csv')
希望您觉得这很有用,我会回应您的意思