пытаясь использовать какую функцию для извлечения данных из растра, если условие выполнено в другом растре - PullRequest
1 голос
/ 21 июня 2019

У меня есть два растра, которые имеют одинаковый размер и содержат данные из одного и того же местоположения, но с разными типами данных (один растр имеет данные об уклоне, а другой имеет данные об аспектах). Я хочу иметь возможность просматривать данные об уклонах для одного аспекта за раз, поэтому я пытался создать настройку (может быть, оператор if / else?), Где я сказал: «если (условие аспекта) было выполнено в одном растре, Данные об уклоне будут получены из того же пикселя в другом растре.

#I have a slope and an aspect raster that i pulled
library(raster)
library(rgdal)
library(sp)

aspect <- raster("geotiff name here")
slope <- raster("geotiff name here") 

#Looking at the north aspect (between 0-22.5 degrees or 337.5-360 degrees)

#First I am setting the pixels in the aspect raster that correspond to north
#equal to 1, and the values that don't = 0  
aspect[aspect >= 0 & aspect <= 22.5] <- 1
aspect[aspect >= 337.5 & aspect <= 360] <- 1
aspect[aspect > 22.5 & aspect < 337.5] <- 0

#Here i am saving the indices of the raster that face north to a new one
north <- which(aspect == 1, cells = true)

Тогда я хочу только прочитать данные из пикселей растра с наклоном, которому присвоено значение ИСТИНА из растра аспекта, но это то, где я оказался в тупике! Я начал использовать R совсем недавно, поэтому, возможно, есть простой способ сделать это, которого мне не хватает, и любая помощь приветствуется. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Всегда включайте пример данных (см. Файлы справки для вдохновения, здесь от ?raster::terrain)

library(raster)
x <- getData('alt', country='CHE')
aspect <- terrain(x, 'aspect', unit='degrees')
slope <- terrain(x, 'slope', unit='degrees')

Это лучший способ переклассификации:

m <- matrix(c(0,22.5,1,22.5,337.50,0,337.5,360,1), ncol=3, byrow=TRUE)
aspectcls <- reclassify(aspect, m)

Получить уклонданные, где aspectcls! = 0

nslope <- mask(slope, aspectcls, maskvalue=0)

Получить значения

v <- values(nslope)   
boxplot(v)

Вы также можете сделать

crosstab(aspectcls, slope)

Я бы не рекомендовал путь, который вы выбрали, ноесли бы вы взяли его, вы могли бы сделать

cells <- Which(aspectcls, cells=T)
vv <- slope[cells]
boxplot(vv)
0 голосов
/ 21 июня 2019

Вам не нужно преобразовывать 1 в ИСТИНА, поскольку R делает это автоматически. Попробуйте этот код:

#create a data frame
data <- data.frame(aspect=aspect, slope=slope)

#create a 'north' column and populate with 1
data$north <- 1

#those that don't meet the north criteria are converted to 0
data$north[data$aspect > 22.5 & data$aspect < 337.5] <- 0

#report the 'slope' values where north=1
data$slope[data$north == 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...