Вопрос или проблема
Мой вопрос: как я могу замаскировать или обрезать результаты интерполяции IDW с использованием R так, чтобы они показывали только ту область, которая содержит оригинальный набор точек данных?
В приведенном ниже примере 20 случайных точек используются для интерполяции поверхности с помощью функции IDW в gstat. Конвексная оболочка получается из набора точек и отображается на интерполированной карте. Но я хочу обрезать карту так, чтобы на ней отображались только области внутри облака точек.
Спасибо за любые предложения!
###
# IDW в R
#
library(gstat)
#
set.seed(1234)
x <- rnorm(20)+10
y <- rnorm(20)+10
z <- rnorm(20)+10
#
xyz <- data.frame(x,y,z)
coordinates(xyz) <- ~x+y
xr <- range(x)
yr <- range(y)
b <- round((xr[2]-xr[1])/100,2)
#
grd <- expand.grid(x=seq(from=xr[1],to=xr[2],by=b),
y=seq(from=yr[1],to=yr[2],by=b))
#
coordinates(grd) <- ~ x+y
gridded(grd) <- TRUE
#
idw<-idw(formula=z~1, locations=xyz, newdata=grd)
#
image(idw, col=terrain.colors(16))
contour(idw, add=T)
points(x,y, col=4, pch=19)
#
library(spatstat)
conv<-convexhull.xy(x,y)
plot(conv,add=TRUE)
#
Вот что бы я сделал:
idw_output <- as.data.frame(idw)[, 1:3]
# Добавление растра IDW
# Первый шаг для включения результатов IDW на интерактивную карту – преобразовать его в пространственный объект
idw_raster <- rasterFromXYZ(idw_output)
# Мы хотим показывать результаты интерполяции только в области, для которой у нас есть точки данных
# Для этого мы обрежем растр по региону данных, создав конвексную оболочку, буфер и маску (обрезку) растра
# Выполните операции конвексной оболочки и буфера на проецированных данных UTM
xyz_hull <- gConvexHull(xyz)
xyz_buff <- gBuffer(xyz_hull, width = 25000) # произвольный буфер 1 км
# Маскируем растр IDW, чтобы ограничить его регионами, для которых у нас есть информация
idw_raster_crop <- mask(idw_raster, xyz)
spplot(idw_raster_crop)
# Создаем контуры IDW
idw_contour <- rasterToContour(idw_raster_crop, nlevels = 15)
Когда вы будете использовать свои реальные данные, вы можете использовать mapview, т.е. mapview(idw_raster_crop)
, чтобы увидеть интерактивную карту.
Ссылка: https://rstudio-pubs-static.s3.amazonaws.com/212793_f130ecc723da4ed98680d6d3d5c4aff9.html
Здесь я отвечаю на свой собственный вопрос:
Чтобы получить интерполяцию IDW поверхности, ограниченную областью, содержащей оригинальный набор точек данных xyz:
- Создайте прямоугольную сетку на основе диапазонов точек xy с использованием функции expand.grid {base}
- Создайте конвексную оболочку с использованием функции convexhull.xy{spatstat}
- Вырежьте неправильную сетку, используя функцию inout{splancs} на
прямоугольной сетке с маской, заданной конвексной оболочкой - Выполните интерполяцию, используя функцию idw{gstat} с новой сеткой.
- Не забудьте отключить spatstat, потому что у него есть другая функция для
IDW с тем же именем
Код:
###
# IDW в R
#
# Загрузите gstat:
library(gstat)
#
# Пример набора данных XYZ:
set.seed(1234)
x <- rnorm(20)*1000+3000
y <- rnorm(20)*1000+3000
z <- rnorm(20)+10
xyz <- data.frame(x,y,z)
#
# Рассчитайте диапазоны и расстояние:
xr <- round(range(x),1);xr
yr <- round(range(y),1);yr
b <- round((xr[2]-xr[1])/60,2);b
#
# Создайте сетку:
grd1 <- expand.grid(x=seq(from=xr[1],to=xr[2],by=b),
y=seq(from=yr[1],to=yr[2],by=b))
plot(grd1)
#
# Загрузите spatstat и splancs
library(spatstat)
library(splancs)
#
# Извлечение конвексной оболочки
w2 <- convexhull.xy(x,y)
#
# отключите spatstat, потому что у него есть другая функция "idw":
detach("package:spatstat", unload=TRUE)
#
# Создайте новую обрезанную сетку:
grd2 <- grd1[inout(grd1,w2$bdry[[1]]),]
plot(grd2)
#
# Преобразуйте сетки и набор данных в sp-объекты:
coordinates(grd1) <- ~x+y
gridded(grd1) <- TRUE
coordinates(grd2) <- ~x+y
gridded(grd2) <- TRUE
coordinates(xyz) <- ~x+y
#
# Запустите интерполяции:
idw1<-idw(formula=z~1, locations=xyz, newdata=grd1)
idw2<-idw(formula=z~1, locations=xyz, newdata=grd2)
#
# Постройте результаты:
image(idw1, col=terrain.colors(16))
contour(idw1, add=T)
points(x,y, col=4, pch=19)
image(idw2, col=terrain.colors(16))
contour(idw2, add=T)
points(x,y, col=4, pch=19)
#
Ответ или решение
Как замаскировать или обрезать результаты интерполяции IDW в R
Интерполяция с использованием метода инверсного расстояния (IDW) широко применяется в геостатистике для оценки значений в непробованных точках на основе доступных данных. Однако в некоторых случаях, например, при визуализации результатов, может возникнуть необходимость обрезки или маскировки интерполированного результата только на области, содержащей исходные данные. В данной статье мы рассмотрим, как эффективно выполнить эти задачи в R, используя библиотеки gstat
, spatstat
и raster
.
Подготовка данных
Сначала нам нужно создать набор данных, содержащий координаты точек и соответствующие им значения. Давайте начнем с создания 20 случайных точек:
set.seed(1234) # Для воспроизводимости
x <- rnorm(20) + 10
y <- rnorm(20) + 10
z <- rnorm(20) + 10
xyz <- data.frame(x, y, z)
coordinates(xyz) <- ~x+y
Создание сетки
Теперь мы создадим регулярную сетку на основе диапазонов координат этих точек:
xr <- range(x)
yr <- range(y)
b <- round((xr[2] - xr[1]) / 100, 2) # Шаг 1
grd <- expand.grid(x = seq(from = xr[1], to = xr[2], by = b),
y = seq(from = yr[1], to = yr[2], by = b))
coordinates(grd) <- ~x+y
gridded(grd) <- TRUE
Интерполяция IDW
Выполним интерполяцию IDW на созданной сетке:
library(gstat)
idw_result <- idw(formula = z ~ 1, locations = xyz, newdata = grd)
Обрезка по конвексной оболочке
Теперь мы можем использовать конвексную оболочку для создания маски, которая обрежет результаты интерполяции. В этом нам поможет библиотека spatstat
:
library(spatstat)
# Получаем конвексную оболочку
convex_hull <- convexhull.xy(x, y)
# Обрезаем результаты интерполяции
library(splancs) # Для функции inout
grd_masked <- grd[inout(grd, convex_hull$bdry[[1]]), ] # Обрезка сетки
Выполнение интерполяции на обрезанных данных
Теперь мы можем выполнить интерполяцию на новой обрезанной сетке:
gridded(grd_masked) <- TRUE
idw_masked <- idw(formula = z ~ 1, locations = xyz, newdata = grd_masked)
Визуализация результатов
Для визуализации результатов интерполяции мы можем использовать функции image
и contour
из базовой библиотеки R:
image(idw_masked, col = terrain.colors(16))
contour(idw_masked, add = TRUE)
points(x, y, col = 4, pch = 19) # Исходные данные
Заключение
Таким образом, мы успешно выполнили интерполяцию IDW, ограничив результаты только областью, содержащей исходные данные. Подход, описанный выше, можно легко адаптировать к любым другим данным. Использование конвексной оболочки для маскировки области интерполяции позволяет нам получить более информативные и визуально привлекательные результаты.
Эти шаги обеспечивают высокую степень контроля над процессом интерполяции в R и позволяют вам вручную выбирать области интереса, что особенно важно в областях с нерегулярным распределением данных. Убедитесь, что ваши результаты являются наглядными и информативными для дальнейшего анализа или презентации.