如何在具有特定值的栅格像素中进行选择?

时间:2017-02-10 13:51:00

标签: r spatial raster pixels r-raster

我希望其他地方也不会问同样的问题,因为即使这是一项基本的练习,我也无法在其他问题中找到它......

我有一个光栅,源自矢量的光栅化;在该光栅中,对应于多边形的像素被分配了一个数字(例如,属于多边形A的所有像素被分配了数字53;属于多边形H的像素被分配了数字102)。请注意原始矢量中的多边形没有ID代码(因此,多边形“A”或“H”是我现在发明的东西)。 这是我得到的光栅的结构:

> structure(lodi_C00)
class       : RasterLayer 
dimensions  : 1994, 1932, 3852408  (nrow, ncol, ncell)
resolution  : 30, 30  (x, y)
extent      : 516000, 573960, 4990200, 5050020  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : C:\Users\Laura\Desktop\MSc thesis\Dati\3_Segmentation\Lodi_segmented\lodi_single_classes_rasterized\lodiC00.tif 
names       : lodiC00 
values      : 1, 152  (min, max)
attributes  :
        ID   category
 from:   0           
 to  : 152 M158200079

现在我需要从此栅格中仅选择与某些多边形对应的像素,以便具有特定值的像素。我有一个我想要选择的像素值列表(有106个值):

> C00_trainingrows
  [1] 152  62  74  40 102  36  14  78  79  31  35  12   9 137   7   8  43 101  52 133  59 123  23  28  49  93  11  63  72 125   1  69  86
 [34] 100 112 145 128 135  32  99  34  44  61  66  47  50 131 129  95 108  76  38 109  39  64  37  53 122  57  21  55 111 113  33  91  77
 [67] 132  51  88  10  13 107  24  65 105  60  87  71 147 149  17 139  25 120 124 114  27  45 103   6  84  29 144 141  22  26   5  16  75
[100]   2  41  42 126 118  54 110

所以,我希望有一个新的栅格,其中只保留值为“152”,“62”等的像素。

我知道当只选择一个值(例如152)时,这有效:

lodi_C00_training <- lodi_C00 == 152
writeRaster(lodi_C00_training, "lodi_C00_training", format="GTiff", progress="text", overwrite=TRUE)

但是,我需要拥有所有106个值。有关如何做的任何建议吗?

1 个答案:

答案 0 :(得分:0)

如果你的光栅不是太大,你可以试试这个:

#Dummy data start
lodi_C00          <- raster(matrix(1:9))
C00_trainingrows  <- c(1,5,9)

#copy your raster
lodi_C00_training <- lodi_C00

#set all pixels that are not contained in your vector to NA
lodi_C00_training[!(lodi_C00[] %in% C00_trainingrows)] <- NA

评论后编辑:

您可以尝试这样的事情:

#define function 
#(setting C00_trainingsrows as a fixed paramater might not be the best practice)

selectPixels <- function(x) {
if(!is.na(x)) { 
  if(!(x %in% C00_trainingrows)){
    x <- NA
  }
} 
return(x)
}


 #Set up a cluster with two cores
 beginCluster(2)
 lodi_C00_training <- clusterR(lodi_C00, 
                                fun=calc,
                                args=list(fun=selectPixels),
                                export='C00_trainingrows')
 endCluster()