2015-04-20 33 views
1

我有一個202行和201列的柵格地圖 這個地圖中有一些柵格,其像素值爲0我想寫一個函數,返回所有的像素值0格座標 我怎麼能做到這一點 我嘗試使用,如果循環和while循環 但它總是說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()返回一個對象並停止運行該函數......一個函數只能返回一個對象。這也是一個功能,所以你必須使用parens。如果你把它放在* 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)