Подложка векторного изображения к сетке для кригинга в R

После долгих поисков, расспросов и написания кода я как бы получил необходимый минимум для кригинга в gstat R.

Используя 4 точки (знаю, совсем плохо), я провел кригинг несэмплированных точек, расположенных между ними. Но на самом деле мне не нужны все эти точки. Внутри этой области есть меньшая подобласть... это та область, которая мне действительно нужна.

Короче говоря. У меня есть измерения, сделанные с 4 метеостанций, которые сообщают данные об осадках. Широта и долгота для этих точек:

lat    long
7.16   124.21
8.6    123.35
8.43   124.28
8.15   125.08

Мой путь к кригингу можно увидеть из моих предыдущих вопросов на StackOverflow.

Это: Создайте вариограмму в пакете gstat R

А это: Создать сетку в R для кригинга в 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 или аналогичного программного обеспечения. После этого мне нужно будет вставить это векторное изображение внутрь области 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")

РЕДАКТИРОВАТЬ: код изменился с прошлого раза. Но это не имеет значения, я думаю, я просто хочу знать, возможно ли это, и может ли кто-нибудь привести простейший пример того, как это возможно. Отсюда я могу вывести решение примера для своей проблемы.


person ace_01S    schedule 17.04.2017    source источник
comment
Вы правы, я отредактирую это, чтобы оно соответствовало требуемым критериям.   -  person ace_01S    schedule 17.04.2017
comment
@42 см. сделанные мной правки. Этого достаточно?   -  person ace_01S    schedule 17.04.2017
comment
Это будет, если этот набор данных SQL является частью одного из этих пакетов. Это буду не я, так как я не подхожу к своей машине уже неделю. Я сомневаюсь, что смогу что-то сделать, но если вы не получите полезных ответов в течение 3 дней, пингуйте меня. Я мог бы назначить награду за это.   -  person IRTFM    schedule 17.04.2017
comment
награда? это механика StackOverflow, с которой я не знаком? Вроде новичок в сообществе, см.   -  person ace_01S    schedule 17.04.2017
comment
Посмотрите на рекомендуемые элементы в отдельной панели.   -  person IRTFM    schedule 18.04.2017
comment
Новый ответ выглядит очень многообещающе.   -  person IRTFM    schedule 24.04.2017
comment
@Ace_01S проверьте, работает ли. Я хотел бы заработать эту награду +200 ;)   -  person gonzalez.ivan90    schedule 25.04.2017


Ответы (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)

Синим выделен новый шейп-файл

После этого вы проверяете, какие точки находятся внутри «отверстия» нового синего векторного слоя:

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

С помощью этого кода вы можете решить «кольцо» или «дырку в пончике», если у вас уже есть шейп-файл. Если у вас есть изображение и вы хотите его обрезать, попробуйте следующее:

В случае, если вы загружаете растр (получите изображение базовой карты из Интернета):

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()

участок3

И "Наконец, я беру значения области, покрытой изображением, и сохраняю их в CSV-файле или базе данных".

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

Надеюсь, вы найдете это полезным, и я отвечу на ваше значение

person gonzalez.ivan90    schedule 24.04.2017
comment
Это выглядит действительно многообещающе. Я обязательно попробую. РЕДАКТИРОВАТЬ: это много кода для анализа. Мне нужно дать этому несколько дней, чтобы обработать. Некоторые из этих вещей довольно новы (или неслыханны) для меня. - person ace_01S; 25.04.2017
comment
Кроме того, на самом деле это не пончик, потому что сетка для пончиков выглядит странно. Это прямоугольная сетка с неправильной формой посередине. Но я вижу, как я могу обойти это. - person ace_01S; 25.04.2017
comment
Я все еще не могу проверить правильность, но это создает впечатление, по крайней мере, полезного начала. Спасибо за попытку. - person IRTFM; 26.04.2017
comment
Дайте мне знать, если вам нужна помощь ;) - person gonzalez.ivan90; 26.04.2017
comment
hole <- donut # for keep original shape hole@polygons[1][[1]]@Polygons[1] <- NULL hole@polygons[1][[1]]@Polygons[1][[1]]@hole <- FALSE. @gonzales.ivan90 Что это значит? Также извините за то, что не ответили вам в последнее время. Я только что закончил привязку изображения, которое только что вытащил. - person ace_01S; 29.04.2017
comment
Этот код позволяет вам получить отверстие формы и создать новый слой. Синий многоугольник на втором графике. С помощью этого нового многоугольника вы можете проверить, какие элементы (в данном случае станции) находятся внутри него. - person gonzalez.ivan90; 03.05.2017

Чтобы упростить ваш вопрос:

  • Вы хотите очертить область на основе изображения, которое не имеет географической привязки.
  • Вы хотите извлечь результаты интерполяции только для этой области

Требуется несколько шагов

  1. Вам необходимо использовать QGIS для географической привязки вашего изображения (Raster > Georeferencer). Вам нужна карта с географической привязкой в ​​фоновом режиме, чтобы помочь. Это создает растровый объект с пространственной информацией.
  2. Two possibilities.
    • 2.a. The central part of your image has a color than can be directly used as a mask in R (Ex. All green pixels in middle of red pixels).
    • 2.б. Если нет, вам нужно использовать QGIS, чтобы вручную очертить полигон области (Layer > Create Layer > New Shapefile > Polygon)
  3. Импортируйте свой растровый или полигональный шейп-файл в R
  4. Используйте функцию raster::mask для извлечения значений вашей интерполяции с использованием растрового изображения или SpatialPolygon.
person Sébastien Rochette    schedule 21.04.2017
comment
Я голосую, но еще не присуждаю награду, потому что не вижу полностью закодированного решения. И поскольку я в отпуске, я не могу определить, достаточно ли этого набора инструкций для человека с моим ограниченным опытом кодирования ГИС. - person IRTFM; 22.04.2017
comment
Я понимаю. Действительно, вопрос требует больше QGIS, чем R. Таким образом, не так много кодирования. Проблема вопроса в том, что для этого требуется полный протокол, который я обычно предлагаю в качестве полного однодневного учебника. Я не думаю, что stackoverflow стремится давать такие полные курсы. С помощью данных шагов Ace_01S будет знать, где искать: руководство QGIS... - person Sébastien Rochette; 22.04.2017
comment
Тогда я подожду дальнейших комментариев от @Ace_01S. У меня нет опыта работы с этим приложением. - person IRTFM; 22.04.2017
comment
Вау, не ожидал, что кто-нибудь ответит. Я постараюсь изучить QGIS более тщательно. Что касается стороны R, у меня было некоторое представление за время между публикацией вопроса и сейчас. - person ace_01S; 24.04.2017