Project

General

Profile

Download (25.6 KB) Statistics
| Branch: | Revision:
1
## Figures associated with MOD35 Cloud Mask Exploration
2

    
3
setwd("~/acrobates/adamw/projects/MOD35C5")
4

    
5
library(raster);beginCluster(10)
6
library(rasterVis)
7
library(rgdal)
8
library(plotKML)
9
library(Cairo)
10
library(reshape)
11
library(rgeos)
12
library(splancs)
13

    
14

    
15
## add tags for distribution
16
## MOD35
17
tags=c("TIFFTAG_IMAGEDESCRIPTION='Collection 5 MOD35 Cloud Frequency for 2009 extracted from MOD09GA state_1km bits 0-1. The MOD35 bits encode four categories (with associated confidence that the pixel is actually clear): confidently clear (confidence > 0.99), probably clear (0.99 >= confidence > 0.95), probably cloudy (0.95 >= confidence > 0.66), and confidently cloudy (confidence <= 0.66).  Following the advice of the MODIS science team (Frey, 2010), we binned confidently clear and probably clear together as clear and the other two classes as cloudy.  The daily cloud mask time series were summarized to mean cloud frequency (CF) by calculating the proportion of cloudy days during 2009'",
18
  "TIFFTAG_DOCUMENTNAME='Collection 5 MOD35 Cloud Frequency'",
19
  "TIFFTAG_DATETIME='20090101'",
20
  "TIFFTAG_ARTIST='Adam M. Wilson (adam.wilson@yale.edu)'")
21
system(paste("/usr/local/src/gdal-1.10.0/swig/python/scripts/gdal_edit.py data/MOD35_2009.tif ",paste("-mo ",tags,sep="",collapse=" "),sep=""))
22
## MOD09
23
tags=c("TIFFTAG_IMAGEDESCRIPTION='Collection 5 MOD09 Cloud Frequency for 2009 extracted from MOD09GA \'PGE11\' internal cloud mask algorithm (embedded in MOD09GA \'state_1km\' bit 10. The daily cloud mask time series were summarized to mean cloud frequency (CF) by calculating the proportion of cloudy days during 2009'",
24
  "TIFFTAG_DOCUMENTNAME='Collection 5 MOD09 Cloud Frequency'",
25
  "TIFFTAG_DATETIME='20090101'",
26
  "TIFFTAG_ARTIST='Adam M. Wilson (adam.wilson@yale.edu)'")
27
system(paste("/usr/local/src/gdal-1.10.0/swig/python/scripts/gdal_edit.py data/MOD09_2009.tif ",paste("-mo ",tags,sep="",collapse=" "),sep=""))
28

    
29
## get % cloudy
30
mod09=raster("data/MOD09_2009.tif")
31
names(mod09)="C5MOD09CF"
32
NAvalue(mod09)=0
33

    
34
mod35c5=raster("data/MOD35_2009.tif")
35
names(mod35c5)="C5MOD35CF"
36
NAvalue(mod35c5)=0
37

    
38

    
39
## mod35C6 annual
40
if(!file.exists("data/MOD35C6_2009.tif")){
41
  system("/usr/local/gdal-1.10.0/bin/gdalbuildvrt  -a_srs '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs' -sd 1 -b 1 data/MOD35C6.vrt `find /home/adamw/acrobates/adamw/projects/interp/data/modis/mod35/summary/ -name '*h[1-9]*_mean.nc'` ")
42
  system("align.sh data/MOD35C6.vrt data/MOD09_2009.tif data/MOD35C6_2009.tif")
43
}
44

    
45
mod35c6=raster("data/MOD35C6_2009.tif")
46
names(mod35c6)="C6MOD35CF"
47
NAvalue(mod35c6)=255
48

    
49
## landcover
50
if(!file.exists("data/MCD12Q1_IGBP_2009_051_wgs84_1km.tif")){
51
  system(paste("/usr/local/gdal-1.10.0/bin/gdalwarp -tr 0.008983153 0.008983153 -r mode -ot Byte -co \"COMPRESS=LZW\"",
52
               " /mnt/data/jetzlab/Data/environ/global/MODIS/MCD12Q1/051/MCD12Q1_051_2009_wgs84.tif ",
53
               " -t_srs \"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs\" ",
54
               " -te -180.0044166 -60.0074610 180.0044166 90.0022083 ",
55
               "data/MCD12Q1_IGBP_2009_051_wgs84_1km.tif -overwrite ",sep=""))}
56
lulc=raster("data/MCD12Q1_IGBP_2009_051_wgs84_1km.tif")
57

    
58
  data(worldgrids_pal)  #load palette
59
  IGBP=data.frame(ID=0:16,col=worldgrids_pal$IGBP[-c(18,19)],
60
    lulc_levels2=c("Water","Forest","Forest","Forest","Forest","Forest","Shrublands","Shrublands","Savannas","Savannas","Grasslands","Permanent wetlands","Croplands","Urban and built-up","Cropland/Natural vegetation mosaic","Snow and ice","Barren or sparsely vegetated"),stringsAsFactors=F)
61
  IGBP$class=rownames(IGBP);rownames(IGBP)=1:nrow(IGBP)
62
  levels(lulc)=list(IGBP)
63
names(lulc)="MCD12Q1"
64

    
65
## make land mask
66
if(!file.exists("data/land.tif"))
67
  land=calc(lulc,function(x) ifelse(x==0,NA,1),file="data/land.tif",options=c("COMPRESS=LZW","ZLEVEL=9","PREDICTOR=2"),datatype="INT1U",overwrite=T)
68
land=raster("data/land.tif")
69

    
70
#####################################
71
### compare MOD43 and MOD17 products
72

    
73
## MOD17
74
if(!file.exists("data/MOD17.tif"))
75
system("align.sh ~/acrobates/adamw/projects/interp/data/modis/MOD17/MOD17A3_Science_NPP_mean_00_12.tif data/MOD09_2009.tif data/MOD17.tif")
76
mod17=raster("data/MOD17.tif",format="GTiff")
77
NAvalue(mod17)=65535
78
names(mod17)="MOD17_unscaled"
79

    
80
if(!file.exists("data/MOD17qc.tif"))
81
  system("align.sh ~/acrobates/adamw/projects/interp/data/modis/MOD17/MOD17A3_Science_NPP_Qc_mean_00_12.tif data/MOD09_2009.tif data/MOD17qc.tif")
82
mod17qc=raster("data/MOD17qc.tif",format="GTiff")
83
NAvalue(mod17qc)=255
84
names(mod17qc)="MOD17CF"
85

    
86
## MOD11 via earth engine
87
if(!file.exists("data/MOD11_2009.tif"))
88
  system("align.sh ~/acrobates/adamw/projects/interp/data/modis/mod11/2009/MOD11_LST_2009.tif data/MOD09_2009.tif data/MOD11_2009.tif")
89
mod11=raster("data/MOD11_2009.tif",format="GTiff")
90
names(mod11)="MOD11_unscaled"
91
NAvalue(mod11)=0
92
if(!file.exists("data/MOD11qc_2009.tif"))
93
  system("align.sh ~/acrobates/adamw/projects/interp/data/modis/mod11/2009/MOD11_Pmiss_2009.tif data/MOD09_2009.tif data/MOD11qc_2009.tif")
94
mod11qc=raster("data/MOD11qc_2009.tif",format="GTiff")
95
names(mod11qc)="MOD11CF"
96

    
97
### Processing path
98
if(!file.exists("data/MOD35pp.tif"))
99
system("align.sh data/C5MOD35_ProcessPath.tif data/MOD09_2009.tif data/MOD35pp.tif")
100
pp=raster("data/MOD35pp.tif")
101
NAvalue(pp)=255
102
names(pp)="MOD35pp"
103

    
104

    
105
###
106
n=100
107
at=seq(0,100,len=n)
108
cols=grey(seq(0,1,len=n))
109
cols=rainbow(n)
110
bgyr=colorRampPalette(c("blue","green","yellow","red"))
111
cols=bgyr(n)
112

    
113
### Transects
114
r1=Lines(list(
115
  Line(matrix(c(
116
                -61.688,4.098,
117
                -59.251,3.430
118
                ),ncol=2,byrow=T))),"Venezuela")
119
r2=Lines(list(
120
  Line(matrix(c(
121
                133.746,-31.834,
122
                134.226,-32.143
123
                ),ncol=2,byrow=T))),"Australia")
124
r3=Lines(list(
125
  Line(matrix(c(
126
                73.943,27.419,
127
                74.369,26.877
128
                ),ncol=2,byrow=T))),"India")
129
r4=Lines(list(
130
  Line(matrix(c(
131
                33.195,12.512,
132
                33.802,12.894
133
                ),ncol=2,byrow=T))),"Sudan")
134

    
135

    
136

    
137
trans=SpatialLines(list(r1,r2,r3,r4),CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "))
138
### write out shapefiles of transects
139
writeOGR(SpatialLinesDataFrame(trans,data=data.frame(ID=names(trans)),match.ID=F),"output",layer="transects",driver="ESRI Shapefile",overwrite=T)
140

    
141
## buffer transects to get regional values 
142
transb=gBuffer(trans,byid=T,width=0.4)
143

    
144
## make polygons of bounding boxes
145
bb0 <- lapply(slot(transb, "polygons"), bbox)
146
bb1 <- lapply(bb0, bboxx)
147
# turn these into matrices using a helper function in splancs
148
bb2 <- lapply(bb1, function(x) rbind(x, x[1,]))
149
# close the matrix rings by appending the first coordinate
150
rn <- row.names(transb)
151
# get the IDs
152
bb3 <- vector(mode="list", length=length(bb2))
153
# make somewhere to keep the output
154
for (i in seq(along=bb3)) bb3[[i]] <- Polygons(list(Polygon(bb2[[i]])),
155
                   ID=rn[i])
156
# loop over the closed matrix rings, adding the IDs
157
bbs <- SpatialPolygons(bb3, proj4string=CRS(proj4string(transb)))
158

    
159
trd1=lapply(1:length(transb),function(x) {
160
  td=crop(mod11,transb[x])
161
  tdd=lapply(list(mod35c5,mod35c6,mod09,mod17,mod17qc,mod11,mod11qc,lulc,pp),function(l) resample(crop(l,transb[x]),td,method="ngb"))
162
  ## normalize MOD11 and MOD17
163
  for(j in which(do.call(c,lapply(tdd,function(i) names(i)))%in%c("MOD11_unscaled","MOD17_unscaled"))){
164
    trange=cellStats(tdd[[j]],range)
165
    tscaled=100*(tdd[[j]]-trange[1])/(trange[2]-trange[1])
166
    tscaled@history=list(range=trange)
167
    names(tscaled)=sub("_unscaled","",names(tdd[[j]]))
168
    tdd=c(tdd,tscaled)
169
  }
170
  return(brick(tdd))
171
})
172

    
173
## bind all subregions into single dataframe for plotting
174
trd=do.call(rbind.data.frame,lapply(1:length(trd1),function(i){
175
  d=as.data.frame(as.matrix(trd1[[i]]))
176
  d[,c("x","y")]=coordinates(trd1[[i]])
177
  d$trans=names(trans)[i]
178
  d=melt(d,id.vars=c("trans","x","y"))
179
  return(d)
180
}))
181

    
182
transd=do.call(rbind.data.frame,lapply(1:length(trans),function(l) {
183
  td=as.data.frame(extract(trd1[[l]],trans[l],along=T,cellnumbers=F)[[1]])
184
  td$loc=extract(trd1[[l]],trans[l],along=T,cellnumbers=T)[[1]][,1]
185
  td[,c("x","y")]=xyFromCell(trd1[[l]],td$loc)
186
  td$dist=spDistsN1(as.matrix(td[,c("x","y")]), as.matrix(td[1,c("x","y")]),longlat=T)
187
  td$transect=names(trans[l])
188
  td2=melt(td,id.vars=c("loc","x","y","dist","transect"))
189
  td2=td2[order(td2$variable,td2$dist),]
190
  # get per variable ranges to normalize
191
  tr=cast(melt.list(tapply(td2$value,td2$variable,function(x) data.frame(min=min(x,na.rm=T),max=max(x,na.rm=T)))),L1~variable)
192
  td2$min=tr$min[match(td2$variable,tr$L1)]
193
  td2$max=tr$max[match(td2$variable,tr$L1)]
194
  print(paste("Finished ",names(trans[l])))
195
  return(td2)}
196
  ))
197

    
198
transd$type=ifelse(grepl("MOD35|MOD09|CF",transd$variable),"CF","Data")
199

    
200

    
201
## comparison of % cloudy days
202
if(!file.exists("data/dif_c5_09.tif"))
203
  overlay(mod35c5,mod09,fun=function(x,y) {return(x-y)},file="data/dif_c5_09.tif",format="GTiff",options=c("COMPRESS=LZW","ZLEVEL=9"),overwrite=T)
204
dif_c5_09=raster("data/dif_c5_09.tif",format="GTiff")
205

    
206

    
207
##################################################################################
208
## Identify problematic areas with hard edges in cloud frequency
209
############################
210
library(multicore)
211

    
212
## set up processing chunks
213
nrw=nrow(mod35c5)
214
nby=10
215
nrwg=seq(1,nrw,by=nby)
216
writeLines(paste("Processing ",length(nrwg)," groups and",nrw,"lines"))
217

    
218
## Parallel loop to conduct moving window analysis and quantify pixels with significant shifts across pp or lulc boundaries
219
output=mclapply(nrwg,function(ti){
220
  ## Extract focal areas 
221
  ngb=5
222
  vals=getValuesFocal(mod35c5,ngb=ngb,row=ti,nrows=nby)
223
  vals_mod09=getValuesFocal(mod09,ngb=ngb,row=ti,nrows=nby)
224
  pp_ind=getValuesFocal(pp,ngb=ngb,row=ti,nrows=nby)
225
  lulc_ind=getValuesFocal(lulc,ngb=ngb,row=ti,nrows=nby)
226
  ## processing path
227
  pp_bias=raster(matrix(do.call(rbind,lapply(1:nrow(vals),function(i) {
228
    tind1=pp_ind[i,]  #vector of indices
229
    tval1=vals[i,]    # vector of values
230
    tind2=tind1[!is.na(tind1)&!is.na(tval1)]  #which classes exist without NAs?
231
    if(length(unique(tind2))<2) return(255)  #if only one class, return 255
232
    if(sort(table(tind2),dec=T)[2]<5) return(254) # if too few observations of class 2, return 254
233
#    return(round(kruskal.test(tval1,tind1)$p.value*100))         # if it works, return p.value*100
234
    m=mean(tval1,na.rm=T)
235
    dif=round(diff(range(tapply(tval1,tind1,mean)))/m*100)
236
    return(dif)         # if it works, return p.value*100
237
  })),nrow=nby,ncol=ncol(mod35c5),byrow=T))     # turn it back into a raster
238
  ## update raster and write it
239
  extent(pp_bias)=extent(mod35c5[ti:(ti+nby-1),1:ncol(mod35c5),drop=F])
240
  projection(pp_bias)=projection(mod35c5)
241
  NAvalue(pp_bias) <- 255
242
  writeRaster(pp_bias,file=paste("data/tiles/pp_bias_",ti,".tif",sep=""),
243
              format="GTiff",dataType="INT1U",overwrite=T,NAflag=255) #,options=c("COMPRESS=LZW","ZLEVEL=9")
244
  ## landcover
245
  lulc_bias=raster(matrix(do.call(rbind,lapply(1:nrow(vals),function(i) {
246
    tind1=lulc_ind[i,]  #vector of indices
247
    tval1=vals[i,]    # vector of values
248
    tind2=tind1[!is.na(tind1)&!is.na(tval1)]  #which classes exist without NAs?
249
    if(length(unique(tind2))<2) return(255)  #if only one class, return 255
250
    if(sort(table(tind2),dec=T)[2]<5) return(254) # if too few observations of class 2, return 254
251
#    return(round(kruskal.test(tval1,tind1)$p.value*100))         # if it works, get p.value*100
252
    m=mean(tval1,na.rm=T)
253
    dif=round(diff(range(tapply(tval1,tind1,mean)))/m*100)
254
    return(dif)         # if it works, return the normalized difference
255
  })),nrow=nby,ncol=ncol(mod35c5),byrow=T))     # turn it back into a raster
256
  ## udpate raster and write it
257
  extent(lulc_bias)=extent(mod35c5[ti:(ti+nby-1),1:ncol(mod35c5),drop=F])
258
  projection(lulc_bias)=projection(mod35c5)
259
  NAvalue(lulc_bias) <- 255
260
  writeRaster(lulc_bias,file=paste("data/tiles/lulc_bias_",ti,".tif",sep=""),
261
              format="GTiff",dataType="INT1U",overwrite=T,NAflag=255)#,options=c("COMPRESS=LZW","ZLEVEL=9")
262

    
263
    ## MOD09
264
  mod09_lulc_bias=raster(matrix(do.call(rbind,lapply(1:nrow(vals_mod09),function(i) {
265
    tind1=lulc_ind[i,]  #vector of indices
266
    tval1=vals_mod09[i,]    # vector of values
267
    tind2=tind1[!is.na(tind1)&!is.na(tval1)]  #which classes exist without NAs?
268
    if(length(unique(tind2))<2) return(255)  #if only one class, return 255
269
    if(sort(table(tind2),dec=T)[2]<5) return(254) # if too few observations of class 2, return 254
270
#    return(round(kruskal.test(tval1,tind1)$p.value*100))         # if it works, get p.value*100
271
    m=mean(tval1,na.rm=T)
272
    dif=round(diff(range(tapply(tval1,tind1,mean)))/m*100)
273
    return(dif)         # if it works, return normalized difference
274
  })),nrow=nby,ncol=ncol(mod35c5),byrow=T))     # turn it back into a raster
275
  ## udpate raster and write it
276
  extent(mod09_lulc_bias)=extent(mod09[ti:(ti+nby-1),1:ncol(mod09),drop=F])
277
  projection(mod09_lulc_bias)=projection(mod09)
278
  NAvalue(mod09_lulc_bias) <- 255
279
  writeRaster(mod09_lulc_bias,file=paste("data/tiles/mod09_lulc_bias_",ti,".tif",sep=""),
280
              format="GTiff",dataType="INT1U",overwrite=T,NAflag=255)#,options=c("COMPRESS=LZW","ZLEVEL=9")
281

    
282
  return(ti)
283
},mc.cores=15)
284

    
285

    
286
### check raster temporary files
287
showTmpFiles()
288
#removeTmpFiles(h=1)
289

    
290
## merge all the files back again
291
  system("gdalbuildvrt -srcnodata 255 -vrtnodata 255 data/lulc_bias.vrt `find data/tiles -name 'lulc_bias*tif'` ")
292
  system("gdalwarp -srcnodata 255 -dstnodata 255 -multi -r bilinear -co 'COMPRESS=LZW' -co 'ZLEVEL=9' data/lulc_bias.vrt data/lulc_bias.tif -r near")
293
#  system("align.sh data/lulc_bias.vrt data/MOD09_2009.tif data/lulc_bias.tif")
294

    
295
  system("gdalbuildvrt data/pp_bias.vrt `find data/tiles -name 'pp_bias*tif'` ")
296
  system("gdalwarp -srcnodata 255 -dstnodata 255 -multi -r bilinear -co 'COMPRESS=LZW' -co 'ZLEVEL=9' data/pp_bias.vrt data/pp_bias.tif -r near")
297
  system("align.sh -srcnodata 255 -dstnodata 255 -multi -r bilinear data/pp_bias.vrt data/MOD09_2009.tif data/pp_bias_align.tif &")
298

    
299
  system("gdalbuildvrt data/mod09_lulc_bias.vrt `find data/tiles -name 'mod09_lulc_bias*tif'` ")
300
  system("gdalwarp -srcnodata 255 -dstnodata 255 -multi -r bilinear -co 'COMPRESS=LZW' -co 'ZLEVEL=9' data/mod09_lulc_bias.vrt data/mod09_lulc_bias.tif -r near")
301

    
302
### read them back in
303
pp_bias=raster("data/pp_bias.tif")
304
names(pp_bias)="Processing Path"
305
NAvalue(pp_bias)=255
306
lulc_bias=raster("data/lulc_bias.tif")
307
names(lulc_bias)="Land Use Land Cover"
308
NAvalue(lulc_bias)=255
309

    
310
## read in WWF biome data to summarize by biome
311
if(!file.exists("data/teow/wwf_terr_ecos.shp"){
312
  system("wget -O data/teow.zip http://assets.worldwildlife.org/publications/15/files/original/official_teow.zip?1349272619")
313
  system("unzip data/teow.zip -d data/teow/")
314
   biome=readOGR("data/teow/wwf_terr_ecos.shp","wwf_terr_ecos")
315
   biome=biome[biome$BIOME<50,]
316
   biome2=gUnaryUnion(biome,id=biome$BIOME)
317
  ## create biome.csv using names in html file   
318
  biomeid=read.csv("data/teow/biome.csv",stringsAsFactors=F)
319
  biome2=SpatialPolygonsDataFrame(biome2,data=biomeid)
320
  writeOGR(biome2,"data/teow","biomes",driver="ESRI Shapefile")
321
}
322
   biome=readOGR("data/teow/biomes.shp","biomes")
323

    
324
biome2=extract(pp_bias,biome[biome$Biome==12,],df=T,fun=function(x) data.frame(mean=mean(x,na.rm=T),sd=sd(x,na.rm=T),prop=(sum(!is.na(x))/length(x))))
325

    
326
pat=c(seq(0,100,len=100),254)#seq(0,0.-5,len=2) #,seq(0.05,.1,len=50))
327
grayr2=colorRampPalette(c("grey","green","red"))#
328
#grayr2=colorRampPalette(grey(c(.75,.5,.25)))
329
levelplot(stack(pp_bias,lulc_bias),col.regions=c(grayr2(2)),at=pat,
330
          colorkey=F,margin=F,maxpixels=1e6)+layer(sp.lines(coast,lwd=.5))
331
levelplot(lulc_bias,col.regions=c(grayr2(100),"black"),at=pat,
332
          colorkey=T,margin=F,maxpixels=1e4)+layer(sp.lines(coast,lwd=.5))
333

    
334
histogram(lulc_bias)
335

    
336
cor(td1$MOD17,td1$C6MOD35,use="complete",method="spearman")
337
cor(td1$MOD17[td1$edgeb==1],td1$C5MOD35[td1$edgeb==1],use="complete",method="spearman")
338

    
339
bwplot(value~MOD35pp|variable,data=td1l[td1l$pedgeb==1,],horizontal=F)
340

    
341
crosstab(dif_c5_09,pp)
342
### Correlations
343
#trdw=cast(trd,trans+x+y~variable,value="value")
344
#cor(trdw$MOD17,trdw$C5MOD35,use="complete",method="spearman")
345

    
346
#Across all pixels in the four regions analyzed in Figure 3 there is a much larger correlation between mean NPP and the C5 MOD35 CF (Spearman’s ρ = -0.61, n=58,756) than the C6 MOD35 CF (ρ = 0.00, n=58,756) or MOD09 (ρ = -0.07, n=58,756) products.  
347
#by(trdw,trdw$trans,function(x) cor(as.data.frame(na.omit(x[,c("C5MOD35CF","C6MOD35CF","C5MOD09CF","MOD17","MOD11")])),use="complete",method="spearman"))
348

    
349

    
350
## table of correlations
351
#trdw_cor=as.data.frame(na.omit(trdw[,c("C5MOD35CF","C6MOD35CF","C5MOD09CF","MOD17","MOD11")]))
352
#nrow(trdw_cor)
353
#round(cor(trdw_cor,method="spearman"),2)
354

    
355

    
356
## set up some graphing parameters
357
at=seq(0,100,leng=100)
358
bgyr=colorRampPalette(c("purple","blue","green","yellow","orange","red","red"))
359
bgray=colorRampPalette(c("purple","blue","deepskyblue4"))
360
grayr=colorRampPalette(c("grey","red","darkred"))
361
bgrayr=colorRampPalette(c("darkblue","blue","grey","red","purple"))
362

    
363
cols=bgyr(100)
364

    
365
strip=strip.custom(par.strip.text=list(cex=.7),bg="transparent")
366

    
367
## global map
368
library(maptools)
369
coast=map2SpatialLines(map("world", interior=FALSE, plot=FALSE),proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
370

    
371
g1=levelplot(stack(mod35c5,mod35c6,mod09),xlab=" ",scales=list(x=list(draw=F),y=list(alternating=1)),
372
  col.regions=cols,at=at,cuts=length(at),maxpixels=1e6,
373
  colorkey=list(at=at))+
374
#  layer(sp.polygons(bbs,lwd=5,col="black"))+
375
  layer(sp.lines(coast,lwd=.5))+
376
  layer(sp.points(coordinates(bbs),col="black",cex=2,pch=13,lwd=2))
377

    
378
### Plot of differences between MOD09 adn MOD35 masks
379
#system("gdalinfo -stats /home/adamw/acrobates/adamw/projects/MOD35C5/data/dif_c5_09.tif")
380
## get quantiles for color bar of differences
381
#qs=unique(quantile(as.vector(as.matrix(dif_c5_09)),seq(0,1,len=100),na.rm=T))
382
#c(bgray(sum(qs<0)),grayr(sum(qs>=0)+1))
383
qs=seq(-80,80,len=100)
384
g2=levelplot(dif_c5_09,col.regions=bgrayr(100),cuts=100,at=qs,margin=F,ylab=" ",colorkey=list("right",at=qs),maxpixels=1e6)+
385
  layer(sp.points(coordinates(bbs),col="black",cex=2,pch=13,lwd=2))+
386
  #layer(sp.polygons(bbs,lwd=2))+
387
  layer(sp.lines(coast,lwd=.5))
388

    
389
g2$strip=strip.custom(var.name="Difference (C5MOD35-C5MOD09)",style=1,strip.names=T,strip.levels=F)  #update strip text
390
#g3=histogram(dif_c5_09,col="black",border=NA,scales=list(x=list(at=c(-50,0,50)),y=list(draw=F),cex=1))+layer(panel.abline(v=0,col="red",lwd=2))
391

    
392
### regional plots
393
p1=useOuterStrips(levelplot(value~x*y|variable+trans,data=trd[!trd$variable%in%c("MOD17_unscaled","MOD11_unscaled","MCD12Q1","MOD35pp"),],asp=1,scales=list(draw=F,rot=0,relation="free"),
394
                                       at=at,col.regions=cols,maxpixels=7e6,
395
                                       ylab="Latitude",xlab="Longitude"),strip.left=strip,strip = strip)+layer(sp.lines(trans,lwd=2))
396

    
397
p2=useOuterStrips(
398
  levelplot(value~x*y|variable+trans,data=trd[trd$variable%in%c("MCD12Q1"),],
399
            asp=1,scales=list(draw=F,rot=0,relation="free"),colorkey=F,
400
            at=c(-1,IGBP$ID),col.regions=IGBP$col,maxpixels=7e7,
401
            legend=list(
402
              right=list(fun=draw.key(list(columns=1,#title="MCD12Q1 \n IGBP Land \n Cover",
403
                           rectangles=list(col=IGBP$col,size=1),
404
                           text=list(as.character(IGBP$ID),at=IGBP$ID-.5))))),
405
            ylab="",xlab=" "),strip = strip,strip.left=F)+layer(sp.lines(trans,lwd=2))
406
p3=useOuterStrips(
407
  levelplot(value~x*y|variable+trans,data=trd[trd$variable%in%c("MOD35pp"),],
408
            asp=1,scales=list(draw=F,rot=0,relation="free"),colorkey=F,
409
            at=c(-1:4),col.regions=c("blue","cyan","tan","darkgreen"),maxpixels=7e7,
410
            legend=list(
411
              right=list(fun=draw.key(list(columns=1,#title="MOD35 \n Processing \n Path",
412
                           rectangles=list(col=c("blue","cyan","tan","darkgreen"),size=1),
413
                           text=list(c("Water","Coast","Desert","Land")))))),
414
            ylab="",xlab=" "),strip = strip,strip.left=F)+layer(sp.lines(trans,lwd=2))
415

    
416
## transects
417
p4=xyplot(value~dist|transect,groups=variable,type=c("smooth","p"),
418
       data=transd,panel=function(...,subscripts=subscripts) {
419
         td=transd[subscripts,]
420
         ## mod09
421
         imod09=td$variable=="C5MOD09CF"
422
         panel.xyplot(td$dist[imod09],td$value[imod09],type=c("p","smooth"),span=0.2,subscripts=1:sum(imod09),col="red",pch=16,cex=.25)
423
         ## mod35C5
424
         imod35=td$variable=="C5MOD35CF"
425
         panel.xyplot(td$dist[imod35],td$value[imod35],type=c("p","smooth"),span=0.09,subscripts=1:sum(imod35),col="blue",pch=16,cex=.25)
426
         ## mod35C6
427
         imod35c6=td$variable=="C6MOD35CF"
428
         panel.xyplot(td$dist[imod35c6],td$value[imod35c6],type=c("p","smooth"),span=0.09,subscripts=1:sum(imod35c6),col="black",pch=16,cex=.25)
429
         ## mod17
430
         imod17=td$variable=="MOD17"
431
         panel.xyplot(td$dist[imod17],100*((td$value[imod17]-td$min[imod17][1])/(td$max[imod17][1]-td$min[imod17][1])),
432
                      type=c("smooth"),span=0.09,subscripts=1:sum(imod17),col="darkgreen",lty=5,pch=1,cex=.25)
433
         imod17qc=td$variable=="MOD17CF"
434
         panel.xyplot(td$dist[imod17qc],td$value[imod17qc],type=c("p","smooth"),span=0.09,subscripts=1:sum(imod17qc),col="darkgreen",pch=16,cex=.25)
435
         ## mod11
436
         imod11=td$variable=="MOD11"
437
         panel.xyplot(td$dist[imod11],100*((td$value[imod11]-td$min[imod11][1])/(td$max[imod11][1]-td$min[imod11][1])),
438
                      type=c("smooth"),span=0.09,subscripts=1:sum(imod17),col="orange",lty="dashed",pch=1,cex=.25)
439
         imod11qc=td$variable=="MOD11CF"
440
         qcspan=ifelse(td$transect[1]=="Australia",0.2,0.05)
441
         panel.xyplot(td$dist[imod11qc],td$value[imod11qc],type=c("p","smooth"),npoints=100,span=qcspan,subscripts=1:sum(imod11qc),col="orange",pch=16,cex=.25)
442
         ## land
443
         path=td[td$variable=="MOD35pp",]
444
         panel.segments(path$dist,-10,c(path$dist[-1],max(path$dist,na.rm=T)),-10,col=c("blue","cyan","tan","darkgreen")[path$value+1],subscripts=1:nrow(path),lwd=10,type="l")
445
         land=td[td$variable=="MCD12Q1",]
446
         panel.segments(land$dist,-20,c(land$dist[-1],max(land$dist,na.rm=T)),-20,col=IGBP$col[land$value+1],subscripts=1:nrow(land),lwd=10,type="l")
447
        },subscripts=T,par.settings = list(grid.pars = list(lineend = "butt")),
448
       scales=list(
449
         x=list(alternating=1,relation="free"),#, lim=c(0,70)),
450
         y=list(at=c(-20,-10,seq(0,100,len=5)),
451
           labels=c("MCD12Q1 IGBP","MOD35 path",seq(0,100,len=5)),
452
           lim=c(-25,100)),
453
         alternating=F),
454
       xlab="Distance Along Transect (km)", ylab="% Missing Data / % of Maximum Value",
455
       legend=list(
456
         bottom=list(fun=draw.key(list( rep=FALSE,columns=1,title=" ",
457
                      lines=list(type=c("b","b","b","b","b","l","b","l"),pch=16,cex=.5,
458
                        lty=c(0,1,1,1,1,5,1,5),
459
                        col=c("transparent","red","blue","black","darkgreen","darkgreen","orange","orange")),
460
                       text=list(
461
                         c("MODIS Products","C5 MOD09 % Cloudy","C5 MOD35 % Cloudy","C6 MOD35 % Cloudy","MOD17 % Missing","MOD17 (scaled)","MOD11 % Missing","MOD11 (scaled)")),
462
                       rectangles=list(border=NA,col=c(NA,"tan","darkgreen")),
463
                       text=list(c("C5 MOD35 Processing Path","Desert","Land")),
464
                       rectangles=list(border=NA,col=c(NA,IGBP$col[sort(unique(transd$value[transd$variable=="MCD12Q1"]+1))])),
465
                       text=list(c("MCD12Q1 IGBP Land Cover",IGBP$class[sort(unique(transd$value[transd$variable=="MCD12Q1"]+1))])))))),
466
  strip = strip,strip.left=F)
467
#print(p4)
468

    
469

    
470
CairoPDF("output/mod35compare.pdf",width=11,height=7)
471
#CairoPNG("output/mod35compare_%d.png",units="in", width=11,height=8.5,pointsize=4000,dpi=1200,antialias="subpixel")
472
### Global Comparison
473
print(g1,position=c(0,.35,1,1),more=T)
474
print(g2,position=c(0,0,1,0.415),more=F)
475
#print(g3,position=c(0.31,0.06,.42,0.27),more=F)
476
         
477
### MOD35 Desert Processing path
478
levelplot(pp,asp=1,scales=list(draw=T,rot=0),maxpixels=1e6,cuts=3,
479
          at=(0:3)+.5,col.regions=c("blue","cyan","tan","darkgreen"),margin=F,
480
          colorkey=list(space="top",title="MOD35 Processing Path",labels=list(labels=c("Water","Coast","Desert","Land"),at=0:3),height=.25))+
481
  layer(sp.points(coordinates(bbs),col="black",cex=2,pch=13,lwd=2))+
482
  layer(sp.lines(coast,lwd=.5))
483

    
484
### levelplot of regions
485
print(p1,position=c(0,0,.62,1),more=T)
486
print(p2,position=c(0.6,0.21,0.78,0.79),more=T)
487
print(p3,position=c(0.76,0.21,1,0.79))
488
### profile plots
489
print(p4)
490
dev.off()
491

    
492
### summary stats for paper
493
td=cast(transect+loc+dist~variable,value="value",data=transd)
494
td2=melt.data.frame(td,id.vars=c("transect","dist","loc","MOD35pp","MCD12Q1"))
495

    
496
## function to prettyprint mean/sd's
497
msd= function(x) paste(round(mean(x,na.rm=T),1),"% ±",round(sd(x,na.rm=T),1),sep="")
498

    
499
cast(td2,transect+variable~MOD35pp,value="value",fun=msd)
500
cast(td2,transect+variable~MOD35pp+MCD12Q1,value="value",fun=msd)
501
cast(td2,transect+variable~.,value="value",fun=msd)
502

    
503
cast(td2,transect+variable~.,value="value",fun=msd)
504

    
505
cast(td2,variable~MOD35pp,value="value",fun=msd)
506
cast(td2,variable~.,value="value",fun=msd)
507

    
508
td[td$transect=="Venezuela",]
509

    
510

    
511
#### export KML
512
library(plotKML)
513

    
514
kml_open("output/modiscloud.kml")
515

    
516
readAll(mod35c5)
517

    
518
kml_layer.Raster(mod35c5,
519
     plot.legend = TRUE,raster_name="Collection 5 MOD35 2009 Cloud Frequency",
520
    z.lim = c(0,100),colour_scale = get("colour_scale_numeric", envir = plotKML.opts),
521
#    home_url = get("home_url", envir = plotKML.opts),
522
#    metadata = NULL, html.table = NULL,
523
    altitudeMode = "clampToGround", balloon = FALSE
524
)
525

    
526
system(paste("gdal_translate -of KMLSUPEROVERLAY ",mod35c5@file@name," output/mod35c5.kmz -co FORMAT=JPEG"))
527

    
528
logo = "http://static.tumblr.com/t0afs9f/KWTm94tpm/yale_logo.png"
529
kml_screen(image.file = logo, position = "UL", sname = "YALE logo",size=c(.1,.1))
530
kml_close("modiscloud.kml")
531
kml_compress("modiscloud.kml",files=c(paste(month.name,".png",sep=""),"obj_legend.png"),zip="/usr/bin/zip")
(24-24/52)