Имитация изменения уровня моря с помощью R - PullRequest
0 голосов
/ 09 апреля 2020

Dropbox связанные файлы Я пытаюсь смоделировать изменение уровня моря с помощью R, но не знаю, как это сделать. Подобный желаемый результат. Аналогичный желаемый результат Я видел статью, в которой говорится, что человек использовал contour (), но не знаю, как использовать эту функцию. Я также видел много людей, использующих ggplot2, но я не уверен, как реализовать фрейм данных, используя мой набор данных для этого.

У меня есть DTM, который представляет собой комбинированную версию 5 в виде плиток c , используя приведенный ниже код.

setwd()
f <-list.files(pattern = ".asc")  
r <- lapply(f, raster) 
x <- do.call("merge",r) 
writeRaster(x,"DTM_combine.asc", overwrite=TRUE)  
library(rgdal)
r = raster("DTM_combine.asc")
plot(r)

enter image description here Затем я переклассифицировал растр с помощью этого.

image(r,zlim=c(0,70), main="DEM Findhornbay", col=col) m=c(0,5,1,5,10,2,10,15,3,15,20,4,20,25,5,25,30,6,30,35,7,35,40,8,40,45,9,45,50,10,50,55,11,55,60,12,60,65,13,65,70,14)
mat=matrix(m,ncol=3,byrow=TRUE)
r=reclassify(r,mat)
rcat=reclassify(r,mat)
plot(rcat)
col <-terrain.colors(14)
plot(rcat)
brk <-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
plot(rcat, col=col, breaks=brk, main="Recalssed DEM Findhorn Bay")
plot(r, col=col, breaks=brk, main="Recalssed DEM Findhorn Bay")

, который произвел это. Я не уверен, правильно ли это работает, но следующая задача - смоделировать изменение уровня моря.

plot3D(r)

enter image description here enter image description here

1 Ответ

0 голосов
/ 09 апреля 2020

Растровый пакет и базовый график

Чтобы нарисовать контуры с использованием растров и возможностей, предоставляемых растровым пакетом, вы выполните следующие действия:

Сначала загрузите пакеты, объявите crs, загрузите свой растр и назначьте свои crs:

library(raster)
library(magrittr)

#We define the crs of the project
crs <- "+proj=utm +datum=WGS84 +no_defs"

#read your raster DTM_combine.asc and assign it the projection
r <- raster::raster("PathToFolder/DTM_combine.asc")
raster::projection(r) <- crs

Поскольку мы работаем с цифровой моделью рельефа, я предполагаю, что единицы измерения высоты указаны в метрах. Мы можем определить вектор высот niveaux как последовательность от 0 до максимального значения высот каждые 5 метров:

niveaux <- (raster::extract(r, raster::extent(r)) %>% 
              range(finite = TRUE))[2] %>% 
                seq(0,.,by=5)

Затем вы можете построить растр:

raster::plot(r)

Затем добавьте ваши контуры. Здесь я добавляю береговую линию (высота = 0) синим цветом и отступление такой береговой линии (красным) в предположении, что уровень моря поднимается на 5 метров.

raster::contour(r, add=TRUE, col="blue", lwd=0.2, levels=niveaux[1], drawlabels=FALSE)
raster::contour(r, add=TRUE, col="red", lwd=0.2, levels=niveaux[2], drawlabels=FALSE)

enter image description here

В качестве альтернативы вы можете работать только с контурами, если строите их следующим образом:

raster::contour(r, col="blue", lwd=0.2, levels=niveaux[1], drawlabels=FALSE)
raster::contour(r, add=TRUE, col="red", lwd=0.2, levels=niveaux[2], drawlabels=FALSE)

enter image description here

Способ ggplot2

Сначала преобразуйте растр в кадр данных:

r.df <- raster::as.data.frame(r, xy = TRUE)

Затем постройте растр с помощью geom_raster и создайте контуры с помощью geom_contour так же, как мы делали раньше:

  ggplot(data = r.df, aes(x = x, y = y)) +
  geom_raster(aes(fill=DTM_combine)) +
  geom_contour(aes(z=DTM_combine, color = "Current"), breaks = niveaux[1], size=0.5) + 
  geom_contour(aes(z=DTM_combine, color = "New"), breaks = niveaux[2], size=0.5) +
  scale_fill_gradientn(colours = terrain.colors(10, rev=TRUE), na.value = "transparent") +
  theme_void() +
  labs(fill="Elevation", color="Coastal lines")

Получившаяся карта:

enter image description here

Если вы хотите избежать белого квадрата в верхнем левом углу, например, вы можете установить na.value в scale_fill_gradientn() на #f2f2f2.

enter image description here

* Бонус: Если вы хотите заполнить пространство между береговыми линиями, вы можете взглянуть на функцию geom_contour_fill() в пакете metR .

Надеюсь, это поможет

...