Возникли проблемы с путями, возвращаемыми flowPath в растровом R-пакете - PullRequest
0 голосов
/ 15 апреля 2020

Пути, возвращаемые функцией flowPath в растровом пакете, состоят из сегментов, параллельных осям x и y.

Начиная с примера Векторные поля в документации rasterVis (https://oscarperpinan.github.io/rastervis/), я пытаюсь найти путь потока от начальной точки на поверхности , но выход пути неверен.

library(raster)
library(rasterVis)
proj <- CRS('+proj=longlat +datum=WGS84')
df <- expand.grid(x = seq(-2, 2, .01), y = seq(-2, 2, .01))
df$z <- with(df, (3*x^2 + y)*exp(-x^2-y^2))
r <- rasterFromXYZ(df, crs=proj)

# Up to this point we follow the example in the rasterVis documentation
# Now attempt to find the path from a point on the surface

contour(r$z)
r.fd<-terrain(r,opt='flowdir')
r.c<-cellFromXY(r,cbind(-1,0))
r.p<-flowPath(r.fd,r.c)
p.xy<-xyFromCell(r.fd,r.p)
lines(p.xy,col='green')

Путь потока из точки (-1,0), изображающий нежелательное поведение.

Как вы можете видеть выше, путь потока продолжается до минимума примерно в (0, -. 8), перемещаясь в направлении + x, а затем -y. Я не смог построить набор данных, который не имеет этой проблемы. Однако: пример, включенный в документацию flowPath (в пакете растр с использованием данных volcano ), дает ожидаемый результат и не демонстрирует эту проблему.

Что я делаю неправильно, что не могу расширить пример в документации rasterVis?

Добавление: моя причина для сомнений в выводе может заключаться в неправильном понимании того, что flowPath должен вернуться. Я ожидал, что путь, по которому может идти капля при движении вниз по склону. Например:

Ожидаемый flowPath

Это было вычислено с использованием простого обхода с самым крутым спуском. Однако, если (как заявил респондент Хиджманс) flowPath работает, как и предполагалось, тогда мне может понадобиться найти другую функцию, которая обеспечит, чтобы капли пути следовали за движением вниз.

1 Ответ

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

Почему путь неверен? Это выглядит хорошо для меня. Проиллюстрировано агрегацией и маркировкой.

library(raster)
proj <- CRS('+proj=longlat +datum=WGS84')
df <- expand.grid(x = seq(-2, 2, .01), y = seq(-2, 2, .01))
df$z <- with(df, (3*x^2 + y)*exp(-x^2-y^2))
r <- rasterFromXYZ(df, crs=proj)
r <- aggregate(r, 25) * 10

r.fd <- terrain(r, opt='flowdir')
r.p <- flowPath(r.fd, cbind(-1,0))
p.xy <- xyFromCell(r.fd,r.p)

plot(r)
lines(p.xy,col='green', lwd=2)
text(r)

Добавьте немного шума, чтобы получить более волнистый путь

set.seed(01234)
r <- rasterFromXYZ(df, crs=proj)
r <- aggregate(r, 10) * 10
r <- r + runif(ncell(r), 1, 2)
r.fd <- terrain(r, opt='flowdir')
r.p <- flowPath(r.fd, cbind(-1,0))
p.xy <- xyFromCell(r.fd,r.p)

plot(r)
lines(p.xy,col='green', lwd=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...