2013-07-29 2 views
2

Я совершенно не задаю вопросы о stackoverflow и более или менее новичком в R (и программировании в целом), так что несите меня.Вычисление области перекрытия между двумя растровыми слоями различного происхождения и экстента в R

У меня есть ASCII-файлы видов, которые показывают только присутствие. После чистки дальних интернета мне удалось загрузить, конвертировать в растре, маску вдоль желаемых границ (в моем случае, береговую линию Австралии) и нарисовать их, чтобы я мог визуализировать диапазоны на непроектированной карте.

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

> d 
class  : RasterLayer 
dimensions : 85, 270, 22950 (nrow, ncol, ncell) 
resolution : 0.08, 0.08 (x, y) 
extent  : 119.4993, 141.0993, -36.65831, -29.85831 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory 
names  : layer 
values  : 2, 2 (min, max) 

> b 
class  : RasterLayer 
dimensions : 140, 222, 31080 (nrow, ncol, ncell) 
resolution : 0.08, 0.08 (x, y) 
extent  : 134.2456, 152.0056, -40.44268, -29.24268 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory 
names  : layer 
values  : 2, 2 (min, max) 

x<-resample(b,d,method="ngb") 
y<-mask(x,d) 

>y 
class  : RasterLayer 
dimensions : 85, 270, 22950 (nrow, ncol, ncell) 
resolution : 0.08, 0.08 (x, y) 
extent  : 119.4993, 141.0993, -36.65831, -29.85831 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory 
names  : layer 
values  : 2, 2 (min, max) 

у растровый перекрытия между d и Ь маскируется над д (при попытке замаскировать над б я получаю ошибку о том, что экстентов разные) , Как рассчитать его площадь? функция области() из пакета растрового плюет это:

area(y) 
class  : RasterLayer 
dimensions : 85, 270, 22950 (nrow, ncol, ncell) 
resolution : 0.08, 0.08 (x, y) 
extent  : 119.4993, 141.0993, -36.65831, -29.85831 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory 
names  : layer 
values  : 63.65553, 68.75387 (min, max) 

Я не совсем уверен, что делать с этим. Это даже хороший/правильный/правильный способ получения областей? Почему экстенты различаются между y и b, но то же самое между d и y? Кроме того, каковы единицы значений из области (y)? Я полагаю, что единицы не имеют большого значения, потому что я буду принимать соотношение в конечном счете (разделив перекрытие на диапазон более ограниченных видов), но мне любопытно узнать для дальнейшего использования.

Прошу прощения, если это глупый вопрос. Я ценю любой вклад, который может быть у кого-то.

+0

I может быть недоразумением точного вопроса, так возьмите мой комментарий с зерном поваренная соль. Не могли бы вы предоставить образец формата ASCII с данными о присутствии? Я подозреваю, что мы могли бы рассчитать перекрытие между областями более непосредственно из данных локации. Кроме того, если возможно, отправьте образец сюжета, который вы создаете. Картинка говорит тысячу слов ... – Dinre

+0

Хорошо, по-видимому, я немного пропустил описание области(), где он сообщает вам, что единицы измерения km^2. – gen

+0

@Dinre -apparently У меня нет репутации, чтобы добавлять изображения к моему вопросу. Вот ссылка . Я растолстел на меня, прежде чем у меня возникло желание добавить Австралию к изображению. Что касается формата ASCII, я не знаю, как его описать; это серия из 2s и -3,4e + 38, расположенных в шаблоне, где -3.4e + 38 представляет NODATA_VALUE и 2 Я предполагаю, что это присутствие. – gen

ответ

2

Лучший способ получить перекрытие - intersect. Вы можете создать кирпич перекрывающихся значений и использовать команду типа any, чтобы получить перекрывающиеся диапазоны, предполагая, что значение равно 1 или TRUE, в каждом диапазоне и 0, FALSE, или NA вне диапазона:

library(raster) 

wgs84 <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
d <- raster() 
extent(d) <- extent(119.4993, 141.0993, -36.65831, -29.85831) 
res(d) <- c(0.08, 0.08) 
projection(d) <- CRS(wgs84) 
values(d) <- sample(c(NA, 1), ncell(d), replace=TRUE) 

b <- raster() 
extent(b) <- c(134.2456, 152.0056, -40.44268, -29.24268) 
res(b) <- c(0.08, 0.08) 
projection(b) <- CRS(wgs84) 
values(b) <- sample(c(NA, 1), ncell(b), replace=TRUE) 

y <- intersect(b, d) 

x <- brick(resample(b, y, method = "ngb"),resample(d, y, method = "ngb")) 
x2 <- any(x, na.rm = TRUE) 

library(maps) 
map(regions = "australia") 
image(d, add = TRUE, col = "blue") 
image(b, add = TRUE, col = "green") 
plot(extent(y), add = TRUE) 
image(x2, add = TRUE, col = "red") 

enter image description here

area функция получает вас область каждый клеток приблизительная (для того, чтобы получить истинную площадь, вы должны перепроецировать его в области системы координат). Для того, чтобы получить общую приблизительную площадь перекрытия, добавить все значения ячеек, индекс область суммирования по значениям объединенного растра:

sum(values(area(x2))[which(values(x2))]) 
# [1] 361407.1 
+0

Это более интуитивно понятный, чем я, но он создает общую область перекрытия; тогда как у одного из видов, с которыми я работаю, есть разрывы в его диапазоне.Мне нужно, чтобы это выглядело так: [IMG] http://i.imgur.com/tHL99j6.png [/ IMG] Кроме того, если бы я перепрограммировал растры, сделал бы я то, что вы сделали с CRS () и просто указать другую проекцию? Смогу ли я использовать это, чтобы вычислить площадь, или это будет еще приближение? – gen

+0

Для перепрограммирования вам нужна функция преобразования, такая как projectRaster, первое приложение CRS просто сообщает R, что такое «из» системы координат, это может быть что угодно, и требуется указать, как добраться до системы координат «to». Я уверен, что аппроксимация области() будет в этом случае прекрасной, перерисовка растра добавит гораздо больше проблем. Вы можете замаскировать пиксели с помощью набора данных полигона и суммировать область пикселей на основе теста с этим, чтобы получить только части земли. – mdsumner

+0

Я вижу, что вы ищете сейчас, вы хотите область комбинированных диапазонов. Я изменил код выше, чтобы ответить на ваш вопрос. В общем, однако, растры, вероятно, не лучший инструмент для ответа на этот вопрос. Я бы использовал векторный формат ('SpatialPolygons' в пакете' sp' - отличная реализация). Что касается области: функция 'area' предназначена только для непроектированных данных. Если вы проецируете его на центральную проекцию (да, используя «CRS» с спецификацией proj4), это просто разрешение ячеек, умноженное на количество положительных ячеек. – Noah