2017-02-10 63 views
1

我希望同样的问题没有问别人,因为即使这是一个基本的练习,我也无法在其他问题中找到它...如何选择具有特定值的光栅像素?

我有一个栅格,从栅格化派生的矢量;在该光栅中,与多边形相对应的像素被分配一个数字(例如,属于多边形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个值。有关如何做的建议?

+0

另外一张贴作业 – LeDYoM

+1

@LeDYoM,这不是我的作业。但即使是这样,问题是什么?无论如何,这是我无法自己解决的问题,并且我正在向更有经验的程序员请求帮助。 –

+0

当然,但请您在问题中更具体一些,并对标签进行调整,以便现场专家能够回答 – LeDYoM

回答

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() 
+0

我已经想到了这一点,但不幸的是我的栅格数据量非常大。“我实际上需要按照13个班级的33个栅格来做到这一点(这会造成不合理的时间...)。 –

+0

@LauraPaladini我编辑了我的答案。希望对你有效。 – maRtin

相关问题