2015-04-20 8 views
1

У меня есть растровая карта с 202 строками и 201 столбцом Есть некоторые сетки на этой карте, значения пикселей которых 0 Я хочу написать функцию, возвращающую все значения пикселей 0 сетки координат , как я могу это сделать я пытался использовать, если цикл и в то время как цикл , но он всегда говорит TRUE/FALSE потребность вот мой пример кодаПолучение координат пикселей, значения которых равны 0

library(raster) 
library(rgdal) 
library(maptools) 
library(sp) 


setwd("E:/Landsat-data-NASA atm-corrected/sample_day1") 
restdir2 <- ("E:/Landsat-data-NASA atm-corrected/sample_day1") 
    n3 <- list.files(restdir2, pattern="*band4_clip_1.tif", full.names=TRUE) 
    n4 <- list.files(restdir2, pattern="*cloud_qa_clip_1.tif", full.names=TRUE) 
    n5 <- list.files(restdir2, pattern="*cloud.tif", full.names=TRUE) 

create<- function(x,y) 
{ 
layer <- raster(n4) 
layer2 <- raster(n3) 
    for(c in 1:x) 
    { 
    for(r in 1:y) 
    {  
     nl<- layer2 
     if(layer[c,r]==0) 
     return layer[c,r] 
    } 
    } 
} 
create (10,10) 
+1

Мы не можем запустить любого из кода без данных ... может быть, вы могли бы обмениваться данными для простого примера? Вероятно, вы должны прочитать введение в функции в R. 'return()' возвращает объект и перестает запускать функцию ... функция может возвращать только один объект. Это также функция, поэтому вам нужно использовать парсеры. Если вы поместите * внутри * цикл for, первый раз через цикл он вернется и никогда не попадет во второй раз. – Gregor

+0

Также неплохо использовать 'c' как переменную, потому что' c() 'уже является именем * самой общей функции R. – Gregor

ответ

1

Вот два (очень похожи) Подходы

library(raster) 
# set up example data 
r <- raster(nrow=18, ncol=36) 
set.seed(0) 
r[] <- round(runif(ncell(r)) * 10 - 5) 

# approach 1, for a single layer 
p <- rasterToPoints(r, fun=function(x){x == 0}) 

# approach 2, also works for multiple layers 
# first remove all non zero cells 
z <- subs(r, data.frame(0, 1)) 
p <- rasterToPoints(z) 

# results 
plot(r) 
points(p[,1:2]) 

, если у вас есть несколько слоев с одинаковыми пространственными параметрами (степенями и разрешением)

# create example data 
x1 <- setValues(r, round(runif(ncell(r)) * 10 - 5)) 
x2 <- setValues(r, round(runif(ncell(r)) * 10 - 5)) 
x3 <- setValues(r, round(runif(ncell(r)) * 10 - 5)) 

# combine layers 
s <- stack(x1, x2, x3) 

z <- subs(r, data.frame(0, 1)) 
p <- rasterToPoints(z)