1 |
ddd9a810
|
Adam M. Wilson
|
## 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 |
be7b1081
|
Adam M. Wilson
|
library(rgeos)
|
12 |
14ad4a96
|
Adam M. Wilson
|
library(splancs)
|
13 |
ddd9a810
|
Adam M. Wilson
|
|
14 |
be7b1081
|
Adam M. Wilson
|
## get % cloudy
|
15 |
|
|
mod09=raster("data/MOD09_2009.tif")
|
16 |
d39ab57e
|
Adam M. Wilson
|
names(mod09)="C5MOD09CF"
|
17 |
be7b1081
|
Adam M. Wilson
|
NAvalue(mod09)=0
|
18 |
|
|
|
19 |
|
|
mod35c5=raster("data/MOD35_2009.tif")
|
20 |
|
|
names(mod35c5)="C5MOD35CF"
|
21 |
|
|
NAvalue(mod35c5)=0
|
22 |
|
|
|
23 |
|
|
## mod35C6 annual
|
24 |
a57c4e3d
|
Adam M. Wilson
|
if(!file.exists("data/MOD35C6_2009.tif")){
|
25 |
555815c9
|
Adam M. Wilson
|
# 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]*_mean.nc'` ")
|
26 |
|
|
system("gdalbuildvrt data/MOD35C6.vrt `find /home/adamw/acrobates/adamw/projects/interp/data/modis/mod35/summary/ -name '*h[1]*_mean.nc'` ")
|
27 |
|
|
|
28 |
|
|
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 4 -b 1 data/MOD35C6_CFday_pmiss.vrt `find /home/adamw/acrobates/adamw/projects/interp/data/modis/mod35/summary/ -name '*h[1]*.nc'` ")
|
29 |
|
|
system("gdalwarp data/MOD35C6_CFday_pmiss.vrt data/MOD35C6_CFday_pmiss.tif -r bilinear")
|
30 |
|
|
|
31 |
598244e1
|
Adam M. Wilson
|
system("align.sh data/MOD35C6.vrt data/MOD09_2009.tif data/MOD35C6_2009.tif")
|
32 |
555815c9
|
Adam M. Wilson
|
system("align.sh data/MOD35C6_CFday_pmiss.vrt data/MOD09_2009.tif data/MOD35C6_CFday_pmiss.tif")
|
33 |
a57c4e3d
|
Adam M. Wilson
|
}
|
34 |
57d44dd9
|
Adam M. Wilson
|
mod35c6=raster("data/MOD35C6_2009.tif")
|
35 |
be7b1081
|
Adam M. Wilson
|
names(mod35c6)="C6MOD35CF"
|
36 |
|
|
NAvalue(mod35c6)=255
|
37 |
|
|
|
38 |
a57c4e3d
|
Adam M. Wilson
|
## landcover
|
39 |
5f212fe8
|
Adam M. Wilson
|
if(!file.exists("data/MCD12Q1_IGBP_2009_051_wgs84_1km.tif")){
|
40 |
a57c4e3d
|
Adam M. Wilson
|
system(paste("/usr/local/gdal-1.10.0/bin/gdalwarp -tr 0.008983153 0.008983153 -r mode -ot Byte -co \"COMPRESS=LZW\"",
|
41 |
d39ab57e
|
Adam M. Wilson
|
" /mnt/data/jetzlab/Data/environ/global/MODIS/MCD12Q1/051/MCD12Q1_051_2009_wgs84.tif ",
|
42 |
a57c4e3d
|
Adam M. Wilson
|
" -t_srs \"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs\" ",
|
43 |
5f212fe8
|
Adam M. Wilson
|
" -te -180.0044166 -60.0074610 180.0044166 90.0022083 ",
|
44 |
|
|
"data/MCD12Q1_IGBP_2009_051_wgs84_1km.tif -overwrite ",sep=""))}
|
45 |
|
|
lulc=raster("data/MCD12Q1_IGBP_2009_051_wgs84_1km.tif")
|
46 |
a57c4e3d
|
Adam M. Wilson
|
|
47 |
|
|
# lulc=ratify(lulc)
|
48 |
|
|
data(worldgrids_pal) #load palette
|
49 |
|
|
IGBP=data.frame(ID=0:16,col=worldgrids_pal$IGBP[-c(18,19)],
|
50 |
|
|
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)
|
51 |
|
|
IGBP$class=rownames(IGBP);rownames(IGBP)=1:nrow(IGBP)
|
52 |
|
|
levels(lulc)=list(IGBP)
|
53 |
5f212fe8
|
Adam M. Wilson
|
#lulc=crop(lulc,mod09)
|
54 |
a57c4e3d
|
Adam M. Wilson
|
names(lulc)="MCD12Q1"
|
55 |
|
|
|
56 |
|
|
## make land mask
|
57 |
|
|
if(!file.exists("data/land.tif"))
|
58 |
|
|
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)
|
59 |
|
|
land=raster("data/land.tif")
|
60 |
|
|
|
61 |
be7b1081
|
Adam M. Wilson
|
## mask cloud masks to land pixels
|
62 |
|
|
#mod09l=mask(mod09,land)
|
63 |
|
|
#mod35l=mask(mod35,land)
|
64 |
|
|
|
65 |
ddd9a810
|
Adam M. Wilson
|
#####################################
|
66 |
|
|
### compare MOD43 and MOD17 products
|
67 |
|
|
|
68 |
|
|
## MOD17
|
69 |
|
|
#extent(mod17)=alignExtent(mod17,mod09)
|
70 |
a57c4e3d
|
Adam M. Wilson
|
if(!file.exists("data/MOD17.tif"))
|
71 |
|
|
system("align.sh ~/acrobates/adamw/projects/interp/data/modis/MOD17/MOD17A3_Science_NPP_mean_00_12.tif data/MOD09_2009.tif data/MOD17.tif")
|
72 |
|
|
mod17=raster("data/MOD17.tif",format="GTiff")
|
73 |
|
|
NAvalue(mod17)=65535
|
74 |
d39ab57e
|
Adam M. Wilson
|
names(mod17)="MOD17_unscaled"
|
75 |
ddd9a810
|
Adam M. Wilson
|
|
76 |
a57c4e3d
|
Adam M. Wilson
|
if(!file.exists("data/MOD17qc.tif"))
|
77 |
|
|
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")
|
78 |
|
|
mod17qc=raster("data/MOD17qc.tif",format="GTiff")
|
79 |
ddd9a810
|
Adam M. Wilson
|
NAvalue(mod17qc)=255
|
80 |
be7b1081
|
Adam M. Wilson
|
names(mod17qc)="MOD17CF"
|
81 |
ddd9a810
|
Adam M. Wilson
|
|
82 |
|
|
## MOD11 via earth engine
|
83 |
a57c4e3d
|
Adam M. Wilson
|
if(!file.exists("data/MOD11_2009.tif"))
|
84 |
|
|
system("align.sh ~/acrobates/adamw/projects/interp/data/modis/mod11/2009/MOD11_LST_2009.tif data/MOD09_2009.tif data/MOD11_2009.tif")
|
85 |
|
|
mod11=raster("data/MOD11_2009.tif",format="GTiff")
|
86 |
d39ab57e
|
Adam M. Wilson
|
names(mod11)="MOD11_unscaled"
|
87 |
be7b1081
|
Adam M. Wilson
|
NAvalue(mod11)=0
|
88 |
a57c4e3d
|
Adam M. Wilson
|
if(!file.exists("data/MOD11qc_2009.tif"))
|
89 |
|
|
system("align.sh ~/acrobates/adamw/projects/interp/data/modis/mod11/2009/MOD11_Pmiss_2009.tif data/MOD09_2009.tif data/MOD11qc_2009.tif")
|
90 |
|
|
mod11qc=raster("data/MOD11qc_2009.tif",format="GTiff")
|
91 |
be7b1081
|
Adam M. Wilson
|
names(mod11qc)="MOD11CF"
|
92 |
ddd9a810
|
Adam M. Wilson
|
|
93 |
|
|
### Processing path
|
94 |
a57c4e3d
|
Adam M. Wilson
|
if(!file.exists("data/MOD35pp.tif"))
|
95 |
57d44dd9
|
Adam M. Wilson
|
system("align.sh data/C5MOD35_ProcessPath.tif data/MOD09_2009.tif data/MOD35pp.tif")
|
96 |
a57c4e3d
|
Adam M. Wilson
|
pp=raster("data/MOD35pp.tif")
|
97 |
be7b1081
|
Adam M. Wilson
|
NAvalue(pp)=255
|
98 |
|
|
names(pp)="MOD35pp"
|
99 |
ddd9a810
|
Adam M. Wilson
|
|
100 |
|
|
|
101 |
be7b1081
|
Adam M. Wilson
|
#hist(dif,maxsamp=1000000)
|
102 |
|
|
## draw lulc-stratified random sample of mod35-mod09 differences
|
103 |
|
|
#samp=sampleStratified(lulc, 1000, exp=10)
|
104 |
|
|
#save(samp,file="LULC_StratifiedSample_10000.Rdata")
|
105 |
|
|
#mean(dif[samp],na.rm=T)
|
106 |
|
|
#Stats(dif,function(x) c(mean=mean(x),sd=sd(x)))
|
107 |
ddd9a810
|
Adam M. Wilson
|
|
108 |
|
|
|
109 |
|
|
###
|
110 |
|
|
|
111 |
|
|
n=100
|
112 |
|
|
at=seq(0,100,len=n)
|
113 |
|
|
cols=grey(seq(0,1,len=n))
|
114 |
|
|
cols=rainbow(n)
|
115 |
|
|
bgyr=colorRampPalette(c("blue","green","yellow","red"))
|
116 |
|
|
cols=bgyr(n)
|
117 |
|
|
|
118 |
|
|
|
119 |
|
|
### Transects
|
120 |
|
|
r1=Lines(list(
|
121 |
|
|
Line(matrix(c(
|
122 |
be7b1081
|
Adam M. Wilson
|
-61.688,4.098,
|
123 |
|
|
-59.251,3.430
|
124 |
ddd9a810
|
Adam M. Wilson
|
),ncol=2,byrow=T))),"Venezuela")
|
125 |
|
|
r2=Lines(list(
|
126 |
|
|
Line(matrix(c(
|
127 |
|
|
133.746,-31.834,
|
128 |
|
|
134.226,-32.143
|
129 |
|
|
),ncol=2,byrow=T))),"Australia")
|
130 |
|
|
r3=Lines(list(
|
131 |
|
|
Line(matrix(c(
|
132 |
|
|
73.943,27.419,
|
133 |
|
|
74.369,26.877
|
134 |
|
|
),ncol=2,byrow=T))),"India")
|
135 |
57d44dd9
|
Adam M. Wilson
|
r4=Lines(list(
|
136 |
ddd9a810
|
Adam M. Wilson
|
Line(matrix(c(
|
137 |
be7b1081
|
Adam M. Wilson
|
33.195,12.512,
|
138 |
|
|
33.802,12.894
|
139 |
|
|
),ncol=2,byrow=T))),"Sudan")
|
140 |
|
|
|
141 |
|
|
|
142 |
|
|
|
143 |
57d44dd9
|
Adam M. Wilson
|
trans=SpatialLines(list(r1,r2,r3,r4),CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "))
|
144 |
be7b1081
|
Adam M. Wilson
|
### write out shapefiles of transects
|
145 |
|
|
writeOGR(SpatialLinesDataFrame(trans,data=data.frame(ID=names(trans)),match.ID=F),"output",layer="transects",driver="ESRI Shapefile",overwrite=T)
|
146 |
|
|
|
147 |
|
|
## buffer transects to get regional values
|
148 |
14ad4a96
|
Adam M. Wilson
|
transb=gBuffer(trans,byid=T,width=0.4)
|
149 |
be7b1081
|
Adam M. Wilson
|
|
150 |
|
|
## make polygons of bounding boxes
|
151 |
|
|
bb0 <- lapply(slot(transb, "polygons"), bbox)
|
152 |
|
|
bb1 <- lapply(bb0, bboxx)
|
153 |
|
|
# turn these into matrices using a helper function in splancs
|
154 |
|
|
bb2 <- lapply(bb1, function(x) rbind(x, x[1,]))
|
155 |
|
|
# close the matrix rings by appending the first coordinate
|
156 |
|
|
rn <- row.names(transb)
|
157 |
|
|
# get the IDs
|
158 |
|
|
bb3 <- vector(mode="list", length=length(bb2))
|
159 |
|
|
# make somewhere to keep the output
|
160 |
|
|
for (i in seq(along=bb3)) bb3[[i]] <- Polygons(list(Polygon(bb2[[i]])),
|
161 |
|
|
ID=rn[i])
|
162 |
|
|
# loop over the closed matrix rings, adding the IDs
|
163 |
|
|
bbs <- SpatialPolygons(bb3, proj4string=CRS(proj4string(transb)))
|
164 |
|
|
|
165 |
|
|
trd1=lapply(1:length(transb),function(x) {
|
166 |
|
|
td=crop(mod11,transb[x])
|
167 |
|
|
tdd=lapply(list(mod35c5,mod35c6,mod09,mod17,mod17qc,mod11,mod11qc,lulc,pp),function(l) resample(crop(l,transb[x]),td,method="ngb"))
|
168 |
|
|
## normalize MOD11 and MOD17
|
169 |
d39ab57e
|
Adam M. Wilson
|
for(j in which(do.call(c,lapply(tdd,function(i) names(i)))%in%c("MOD11_unscaled","MOD17_unscaled"))){
|
170 |
be7b1081
|
Adam M. Wilson
|
trange=cellStats(tdd[[j]],range)
|
171 |
5f212fe8
|
Adam M. Wilson
|
tscaled=100*(tdd[[j]]-trange[1])/(trange[2]-trange[1])
|
172 |
|
|
tscaled@history=list(range=trange)
|
173 |
d39ab57e
|
Adam M. Wilson
|
names(tscaled)=sub("_unscaled","",names(tdd[[j]]))
|
174 |
5f212fe8
|
Adam M. Wilson
|
tdd=c(tdd,tscaled)
|
175 |
be7b1081
|
Adam M. Wilson
|
}
|
176 |
|
|
return(brick(tdd))
|
177 |
|
|
})
|
178 |
|
|
|
179 |
|
|
## bind all subregions into single dataframe for plotting
|
180 |
|
|
trd=do.call(rbind.data.frame,lapply(1:length(trd1),function(i){
|
181 |
|
|
d=as.data.frame(as.matrix(trd1[[i]]))
|
182 |
|
|
d[,c("x","y")]=coordinates(trd1[[i]])
|
183 |
|
|
d$trans=names(trans)[i]
|
184 |
|
|
d=melt(d,id.vars=c("trans","x","y"))
|
185 |
|
|
return(d)
|
186 |
|
|
}))
|
187 |
|
|
|
188 |
|
|
transd=do.call(rbind.data.frame,lapply(1:length(trans),function(l) {
|
189 |
|
|
td=as.data.frame(extract(trd1[[l]],trans[l],along=T,cellnumbers=F)[[1]])
|
190 |
|
|
td$loc=extract(trd1[[l]],trans[l],along=T,cellnumbers=T)[[1]][,1]
|
191 |
|
|
td[,c("x","y")]=xyFromCell(trd1[[l]],td$loc)
|
192 |
|
|
td$dist=spDistsN1(as.matrix(td[,c("x","y")]), as.matrix(td[1,c("x","y")]),longlat=T)
|
193 |
|
|
td$transect=names(trans[l])
|
194 |
|
|
td2=melt(td,id.vars=c("loc","x","y","dist","transect"))
|
195 |
|
|
td2=td2[order(td2$variable,td2$dist),]
|
196 |
|
|
# get per variable ranges to normalize
|
197 |
|
|
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)
|
198 |
|
|
td2$min=tr$min[match(td2$variable,tr$L1)]
|
199 |
|
|
td2$max=tr$max[match(td2$variable,tr$L1)]
|
200 |
|
|
print(paste("Finished ",names(trans[l])))
|
201 |
ddd9a810
|
Adam M. Wilson
|
return(td2)}
|
202 |
be7b1081
|
Adam M. Wilson
|
))
|
203 |
|
|
|
204 |
|
|
transd$type=ifelse(grepl("MOD35|MOD09|CF",transd$variable),"CF","Data")
|
205 |
|
|
|
206 |
5f212fe8
|
Adam M. Wilson
|
|
207 |
|
|
## comparison of % cloudy days
|
208 |
d39ab57e
|
Adam M. Wilson
|
if(!file.exists("data/dif_c5_09.tif"))
|
209 |
|
|
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)
|
210 |
|
|
dif_c5_09=raster("data/dif_c5_09.tif",format="GTiff")
|
211 |
|
|
|
212 |
14ad4a96
|
Adam M. Wilson
|
#dif_c6_09=mod35c6-mod09
|
213 |
|
|
#dif_c5_c6=mod35c5-mod35c6
|
214 |
5f212fe8
|
Adam M. Wilson
|
|
215 |
d39ab57e
|
Adam M. Wilson
|
## exploring various ways to compare cloud products along landcover or processing path edges
|
216 |
57d44dd9
|
Adam M. Wilson
|
t1=trd1[[1]]
|
217 |
|
|
dif_p=calc(trd1[[1]], function(x) (x[1]-x[3])/(1-x[1]))
|
218 |
|
|
edge=calc(edge(subset(t1,"MCD12Q1"),classes=T,type="inner"),function(x) ifelse(x==1,1,NA))
|
219 |
|
|
edgeb=buffer(edge,width=5000)
|
220 |
|
|
edgeb=calc(edgeb,function(x) ifelse(is.na(x),0,1))
|
221 |
|
|
names(edge)="edge"
|
222 |
|
|
names(edgeb)="edgeb"
|
223 |
|
|
|
224 |
|
|
pedge=calc(edge(subset(t1,"MOD35pp"),classes=T,type="inner"),function(x) ifelse(x==1,1,NA))
|
225 |
|
|
pedgeb=buffer(pedge,width=3000)
|
226 |
|
|
pedgeb=calc(pedgeb,function(x) ifelse(is.na(x),0,1))
|
227 |
|
|
names(pedgeb)="pedgeb"
|
228 |
|
|
|
229 |
|
|
td1=as.data.frame(stack(t1,edgeb,pedgeb))
|
230 |
|
|
td1l=melt(td1,id.vars=c("pedgeb","edgeb","MOD35pp","MCD12Q1"),measure.vars=c("C5MOD35CF","C6MOD35CF","C5MOD09CF"))
|
231 |
|
|
td1l=td1l[td1l$pedgeb==1|td1l$edgeb==1,]
|
232 |
|
|
|
233 |
|
|
cast(MOD35pp~MCD12Q1~variable,fun.aggregate="mean",data=td1l)
|
234 |
|
|
|
235 |
|
|
## Moving window
|
236 |
|
|
tiles=expand.grid(xmin=seq(-180,170,by=10),ymin=seq(-60,80,by=10))
|
237 |
|
|
tiles$xmax=tiles$xmin+10;tiles$ymax=tiles$ymin+10
|
238 |
|
|
|
239 |
|
|
|
240 |
|
|
registerDoMC(10)
|
241 |
|
|
############################
|
242 |
|
|
writeLines(c(""), "log.txt")
|
243 |
|
|
nrw=nrow(mod35c5)
|
244 |
|
|
nby=10
|
245 |
|
|
nrwg=seq(1,nrw,by=nby)
|
246 |
|
|
writeLines(paste("Processing ",length(nrwg)," groups"))
|
247 |
|
|
|
248 |
|
|
output=mclapply(nrwg,function(ti){
|
249 |
|
|
## Extract focal areas
|
250 |
|
|
ngb=5
|
251 |
|
|
vals=getValuesFocal(mod35c5,ngb=ngb,row=ti,nrows=nby)
|
252 |
|
|
pp_ind=getValuesFocal(pp,ngb=ngb,row=ti,nrows=nby)
|
253 |
|
|
lulc_ind=getValuesFocal(lulc,ngb=ngb,row=ti,nrows=nby)
|
254 |
|
|
## processing path
|
255 |
|
|
pp_bias=raster(matrix(do.call(rbind,lapply(1:nrow(vals),function(i) {
|
256 |
|
|
tind1=pp_ind[i,] #vector of indices
|
257 |
|
|
tval1=vals[i,] # vector of values
|
258 |
|
|
tind2=tind1[!is.na(tind1)&!is.na(tval1)] #which classes exist without NAs?
|
259 |
|
|
if(length(unique(tind2))<2) return(255) #if only one class, return 255
|
260 |
|
|
if(sort(table(tind2),dec=T)[2]<5) return(254) # if too few observations of class 2, return 254
|
261 |
|
|
round(kruskal.test(tval1,tind1)$p.value*100) # if it works, return p.value*100
|
262 |
|
|
})),nrow=nby,ncol=ncol(mod35c5),byrow=T)) # turn it back into a raster
|
263 |
|
|
## udpate raster and write it
|
264 |
|
|
extent(pp_bias)=extent(mod35c5[ti:(ti+nby-1),1:ncol(mod35c5),drop=F])
|
265 |
|
|
projection(pp_bias)=projection(mod35c5)
|
266 |
|
|
writeRaster(pp_bias,file=paste("data/tiles/pp_bias_",ti,".tif",sep=""),
|
267 |
|
|
format="GTiff",dataType="INT1U",overwrite=T,NAflag=255) #,options=c("COMPRESS=LZW","ZLEVEL=9")
|
268 |
|
|
## landcover
|
269 |
|
|
lulc_bias=raster(matrix(do.call(rbind,lapply(1:nrow(vals),function(i) {
|
270 |
|
|
tind1=lulc_ind[i,] #vector of indices
|
271 |
|
|
tval1=vals[i,] # vector of values
|
272 |
|
|
tind2=tind1[!is.na(tind1)&!is.na(tval1)] #which classes exist without NAs?
|
273 |
|
|
if(length(unique(tind2))<2) return(255) #if only one class, return 255
|
274 |
|
|
if(sort(table(tind2),dec=T)[2]<5) return(254) # if too few observations of class 2, return 254
|
275 |
|
|
round(kruskal.test(tval1,tind1)$p.value*100) # if it works, return p.value*100
|
276 |
|
|
})),nrow=nby,ncol=ncol(mod35c5),byrow=T)) # turn it back into a raster
|
277 |
|
|
## udpate raster and write it
|
278 |
|
|
extent(lulc_bias)=extent(mod35c5[ti:(ti+nby-1),1:ncol(mod35c5),drop=F])
|
279 |
|
|
projection(lulc_bias)=projection(mod35c5)
|
280 |
|
|
writeRaster(lulc_bias,file=paste("data/tiles/lulc_bias_",ti,".tif",sep=""),
|
281 |
|
|
format="GTiff",dataType="INT1U",overwrite=T,NAflag=255) #,options=c("COMPRESS=LZW","ZLEVEL=9")
|
282 |
|
|
return(ti)
|
283 |
|
|
},mc.cores=10)
|
284 |
|
|
|
285 |
|
|
|
286 |
|
|
|
287 |
|
|
## original solution
|
288 |
|
|
# pp_bias=raster(matrix(do.call(rbind,lapply(1:nrow(vals),function(i) {
|
289 |
|
|
# if(length(unique(na.omit(pp_ind[i,])))<2) return(255)
|
290 |
|
|
# if(sort(table(pp_ind[i,]),dec=T)[2]<5) return(254)
|
291 |
|
|
# kruskal.test(vals[i,],pp_ind[i,])$p.value*100
|
292 |
|
|
# })),nrow=nrow(t_mod35c5),ncol=ncol(t_mod35c5),byrow=T))
|
293 |
|
|
# extent(pp_bias)=extent(t_mod35c5)
|
294 |
|
|
# writeRaster(pp_bias,file=paste("data/tiles/pp_bias_",ti,".tif",sep=""),
|
295 |
|
|
# format="GTiff",dataType="INT1U",options=c("COMPRESS=LZW","ZLEVEL=9"),overwrite=T)
|
296 |
|
|
## Run kruskal test for processing lulc bias
|
297 |
|
|
# lulc_bias=raster(matrix(do.call(rbind,mclapply(1:nrow(vals),function(i) {
|
298 |
|
|
# if(length(unique(na.omit(lulc_ind[i,])))<2) return(NA)
|
299 |
|
|
# if(sort(table(lulc_ind[i,]),dec=T)[2]<5) return(255)
|
300 |
|
|
# kruskal.test(vals[i,],lulc_ind[i,])$p.value*100
|
301 |
|
|
# })),nrow=nrow(t_mod35c5),ncol=ncol(t_mod35c5),byrow=T))
|
302 |
|
|
# extent(lulc_bias)=extent(t_mod35c5)
|
303 |
|
|
# writeRaster(lulc_bias,dataType="INT1U",file=paste("data/tiles/lulc_bias_",ti,".tif",sep=""),
|
304 |
|
|
# format="GTiff",options=c("COMPRESS=LZW","ZLEVEL=9"),overwrite=T)
|
305 |
|
|
|
306 |
|
|
|
307 |
|
|
### check raster temporary files
|
308 |
|
|
showTmpFiles()
|
309 |
|
|
#removeTmpFiles(h=1)
|
310 |
|
|
|
311 |
|
|
## merge all the files back again
|
312 |
|
|
system("gdalbuildvrt data/lulc_bias.vrt `find data/tiles -name 'lulc_bias*tif'` ")
|
313 |
|
|
system("gdalwarp -co 'COMPRESS=LZW' -co 'ZLEVEL=9' data/lulc_bias.vrt data/lulc_bias.tif -r near")
|
314 |
|
|
|
315 |
|
|
system("gdalbuildvrt data/pp_bias.vrt `find data/tiles -name 'pp_bias*tif'` ")
|
316 |
|
|
system("gdalwarp -co 'COMPRESS=LZW' -co 'ZLEVEL=9' data/pp_bias.vrt data/pp_bias.tif -r near")
|
317 |
|
|
|
318 |
|
|
|
319 |
|
|
#plot(stack(foc,x1))
|
320 |
|
|
pat=c(-0.02,seq(0,0.1,len=50),seq(0.1,1,len=50))
|
321 |
|
|
grayr2=colorRampPalette(c("red",grey(c(.75,.5,.25))))
|
322 |
|
|
levelplot(stack(pp_bias,lulc_bias),col.regions=c("cyan",grayr2(100)),at=pat,colorkey=list(at=pat,cuts=100),margin=F)
|
323 |
|
|
|
324 |
|
|
cor(td1$MOD17,td1$C6MOD35,use="complete",method="spearman")
|
325 |
|
|
cor(td1$MOD17[td1$edgeb==1],td1$C5MOD35[td1$edgeb==1],use="complete",method="spearman")
|
326 |
|
|
|
327 |
|
|
bwplot(value~MOD35pp|variable,data=td1l[td1l$pedgeb==1,],horizontal=F)
|
328 |
|
|
|
329 |
d39ab57e
|
Adam M. Wilson
|
|
330 |
|
|
### Correlations
|
331 |
|
|
#trdw=cast(trd,trans+x+y~variable,value="value")
|
332 |
|
|
#cor(trdw$MOD17,trdw$C5MOD35,use="complete",method="spearman")
|
333 |
5f212fe8
|
Adam M. Wilson
|
|
334 |
d39ab57e
|
Adam M. Wilson
|
#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.
|
335 |
|
|
#by(trdw,trdw$trans,function(x) cor(as.data.frame(na.omit(x[,c("C5MOD35CF","C6MOD35CF","C5MOD09CF","MOD17","MOD11")])),use="complete",method="spearman"))
|
336 |
598244e1
|
Adam M. Wilson
|
|
337 |
|
|
|
338 |
d39ab57e
|
Adam M. Wilson
|
## table of correlations
|
339 |
|
|
#trdw_cor=as.data.frame(na.omit(trdw[,c("C5MOD35CF","C6MOD35CF","C5MOD09CF","MOD17","MOD11")]))
|
340 |
|
|
#nrow(trdw_cor)
|
341 |
|
|
#round(cor(trdw_cor,method="spearman"),2)
|
342 |
5f212fe8
|
Adam M. Wilson
|
|
343 |
be7b1081
|
Adam M. Wilson
|
|
344 |
d39ab57e
|
Adam M. Wilson
|
## set up some graphing parameters
|
345 |
be7b1081
|
Adam M. Wilson
|
at=seq(0,100,leng=100)
|
346 |
|
|
bgyr=colorRampPalette(c("purple","blue","green","yellow","orange","red","red"))
|
347 |
57d44dd9
|
Adam M. Wilson
|
bgray=colorRampPalette(c("purple","blue","deepskyblue4"))
|
348 |
|
|
grayr=colorRampPalette(c("grey","red","darkred"))
|
349 |
|
|
bgrayr=colorRampPalette(c("darkblue","blue","grey","red","purple"))
|
350 |
|
|
|
351 |
be7b1081
|
Adam M. Wilson
|
cols=bgyr(100)
|
352 |
|
|
|
353 |
57d44dd9
|
Adam M. Wilson
|
strip=strip.custom(par.strip.text=list(cex=.7),bg="transparent")
|
354 |
|
|
|
355 |
be7b1081
|
Adam M. Wilson
|
## global map
|
356 |
|
|
library(maptools)
|
357 |
|
|
coast=map2SpatialLines(map("world", interior=FALSE, plot=FALSE),proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
|
358 |
|
|
|
359 |
57d44dd9
|
Adam M. Wilson
|
g1=levelplot(stack(mod35c5,mod35c6,mod09),xlab=" ",scales=list(x=list(draw=F),y=list(alternating=1)),
|
360 |
|
|
col.regions=cols,at=at,cuts=length(at),maxpixels=1e6,
|
361 |
|
|
colorkey=list(at=at))+
|
362 |
|
|
# layer(sp.polygons(bbs,lwd=5,col="black"))+
|
363 |
|
|
layer(sp.lines(coast,lwd=.5))+
|
364 |
|
|
layer(sp.points(coordinates(bbs),col="black",cex=2,pch=13,lwd=2))
|
365 |
|
|
|
366 |
|
|
### Plot of differences between MOD09 adn MOD35 masks
|
367 |
|
|
#system("gdalinfo -stats /home/adamw/acrobates/adamw/projects/MOD35C5/data/dif_c5_09.tif")
|
368 |
|
|
## get quantiles for color bar of differences
|
369 |
|
|
#qs=unique(quantile(as.vector(as.matrix(dif_c5_09)),seq(0,1,len=100),na.rm=T))
|
370 |
|
|
#c(bgray(sum(qs<0)),grayr(sum(qs>=0)+1))
|
371 |
|
|
qs=seq(-80,80,len=100)
|
372 |
|
|
g2=levelplot(dif_c5_09,col.regions=bgrayr(100),cuts=100,at=qs,margin=F,ylab=" ",colorkey=list("right",at=qs),maxpixels=1e6)+
|
373 |
|
|
layer(sp.points(coordinates(bbs),col="black",cex=2,pch=13,lwd=2))+
|
374 |
|
|
#layer(sp.polygons(bbs,lwd=2))+
|
375 |
|
|
layer(sp.lines(coast,lwd=.5))
|
376 |
598244e1
|
Adam M. Wilson
|
|
377 |
d39ab57e
|
Adam M. Wilson
|
g2$strip=strip.custom(var.name="Difference (C5MOD35-C5MOD09)",style=1,strip.names=T,strip.levels=F) #update strip text
|
378 |
|
|
#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))
|
379 |
be7b1081
|
Adam M. Wilson
|
|
380 |
|
|
### regional plots
|
381 |
d39ab57e
|
Adam M. Wilson
|
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"),
|
382 |
be7b1081
|
Adam M. Wilson
|
at=at,col.regions=cols,maxpixels=7e6,
|
383 |
57d44dd9
|
Adam M. Wilson
|
ylab="Latitude",xlab="Longitude"),strip.left=strip,strip = strip)+layer(sp.lines(trans,lwd=2))
|
384 |
be7b1081
|
Adam M. Wilson
|
|
385 |
|
|
p2=useOuterStrips(
|
386 |
|
|
levelplot(value~x*y|variable+trans,data=trd[trd$variable%in%c("MCD12Q1"),],
|
387 |
|
|
asp=1,scales=list(draw=F,rot=0,relation="free"),colorkey=F,
|
388 |
|
|
at=c(-1,IGBP$ID),col.regions=IGBP$col,maxpixels=7e7,
|
389 |
|
|
legend=list(
|
390 |
|
|
right=list(fun=draw.key(list(columns=1,#title="MCD12Q1 \n IGBP Land \n Cover",
|
391 |
|
|
rectangles=list(col=IGBP$col,size=1),
|
392 |
|
|
text=list(as.character(IGBP$ID),at=IGBP$ID-.5))))),
|
393 |
57d44dd9
|
Adam M. Wilson
|
ylab="",xlab=" "),strip = strip,strip.left=F)+layer(sp.lines(trans,lwd=2))
|
394 |
be7b1081
|
Adam M. Wilson
|
p3=useOuterStrips(
|
395 |
|
|
levelplot(value~x*y|variable+trans,data=trd[trd$variable%in%c("MOD35pp"),],
|
396 |
|
|
asp=1,scales=list(draw=F,rot=0,relation="free"),colorkey=F,
|
397 |
|
|
at=c(-1:4),col.regions=c("blue","cyan","tan","darkgreen"),maxpixels=7e7,
|
398 |
|
|
legend=list(
|
399 |
|
|
right=list(fun=draw.key(list(columns=1,#title="MOD35 \n Processing \n Path",
|
400 |
|
|
rectangles=list(col=c("blue","cyan","tan","darkgreen"),size=1),
|
401 |
|
|
text=list(c("Water","Coast","Desert","Land")))))),
|
402 |
57d44dd9
|
Adam M. Wilson
|
ylab="",xlab=" "),strip = strip,strip.left=F)+layer(sp.lines(trans,lwd=2))
|
403 |
be7b1081
|
Adam M. Wilson
|
|
404 |
|
|
## transects
|
405 |
|
|
p4=xyplot(value~dist|transect,groups=variable,type=c("smooth","p"),
|
406 |
|
|
data=transd,panel=function(...,subscripts=subscripts) {
|
407 |
|
|
td=transd[subscripts,]
|
408 |
ddd9a810
|
Adam M. Wilson
|
## mod09
|
409 |
d39ab57e
|
Adam M. Wilson
|
imod09=td$variable=="C5MOD09CF"
|
410 |
be7b1081
|
Adam M. Wilson
|
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)
|
411 |
ddd9a810
|
Adam M. Wilson
|
## mod35C5
|
412 |
be7b1081
|
Adam M. Wilson
|
imod35=td$variable=="C5MOD35CF"
|
413 |
|
|
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)
|
414 |
|
|
## mod35C6
|
415 |
|
|
imod35c6=td$variable=="C6MOD35CF"
|
416 |
|
|
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)
|
417 |
ddd9a810
|
Adam M. Wilson
|
## mod17
|
418 |
be7b1081
|
Adam M. Wilson
|
imod17=td$variable=="MOD17"
|
419 |
|
|
panel.xyplot(td$dist[imod17],100*((td$value[imod17]-td$min[imod17][1])/(td$max[imod17][1]-td$min[imod17][1])),
|
420 |
|
|
type=c("smooth"),span=0.09,subscripts=1:sum(imod17),col="darkgreen",lty=5,pch=1,cex=.25)
|
421 |
|
|
imod17qc=td$variable=="MOD17CF"
|
422 |
|
|
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)
|
423 |
ddd9a810
|
Adam M. Wilson
|
## mod11
|
424 |
be7b1081
|
Adam M. Wilson
|
imod11=td$variable=="MOD11"
|
425 |
|
|
panel.xyplot(td$dist[imod11],100*((td$value[imod11]-td$min[imod11][1])/(td$max[imod11][1]-td$min[imod11][1])),
|
426 |
|
|
type=c("smooth"),span=0.09,subscripts=1:sum(imod17),col="orange",lty="dashed",pch=1,cex=.25)
|
427 |
|
|
imod11qc=td$variable=="MOD11CF"
|
428 |
|
|
qcspan=ifelse(td$transect[1]=="Australia",0.2,0.05)
|
429 |
|
|
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)
|
430 |
ddd9a810
|
Adam M. Wilson
|
## land
|
431 |
be7b1081
|
Adam M. Wilson
|
path=td[td$variable=="MOD35pp",]
|
432 |
d39ab57e
|
Adam M. Wilson
|
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")
|
433 |
be7b1081
|
Adam M. Wilson
|
land=td[td$variable=="MCD12Q1",]
|
434 |
d39ab57e
|
Adam M. Wilson
|
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")
|
435 |
be7b1081
|
Adam M. Wilson
|
},subscripts=T,par.settings = list(grid.pars = list(lineend = "butt")),
|
436 |
ddd9a810
|
Adam M. Wilson
|
scales=list(
|
437 |
be7b1081
|
Adam M. Wilson
|
x=list(alternating=1,relation="free"),#, lim=c(0,70)),
|
438 |
57d44dd9
|
Adam M. Wilson
|
y=list(at=c(-20,-10,seq(0,100,len=5)),
|
439 |
d39ab57e
|
Adam M. Wilson
|
labels=c("MCD12Q1 IGBP","MOD35 path",seq(0,100,len=5)),
|
440 |
|
|
lim=c(-25,100)),
|
441 |
|
|
alternating=F),
|
442 |
be7b1081
|
Adam M. Wilson
|
xlab="Distance Along Transect (km)", ylab="% Missing Data / % of Maximum Value",
|
443 |
|
|
legend=list(
|
444 |
a57c4e3d
|
Adam M. Wilson
|
bottom=list(fun=draw.key(list( rep=FALSE,columns=1,title=" ",
|
445 |
d39ab57e
|
Adam M. Wilson
|
lines=list(type=c("b","b","b","b","b","l","b","l"),pch=16,cex=.5,
|
446 |
|
|
lty=c(0,1,1,1,1,5,1,5),
|
447 |
|
|
col=c("transparent","red","blue","black","darkgreen","darkgreen","orange","orange")),
|
448 |
|
|
text=list(
|
449 |
|
|
c("MODIS Products","C5 MOD09 % Cloudy","C5 MOD35 % Cloudy","C6 MOD35 % Cloudy","MOD17 % Missing","MOD17 (scaled)","MOD11 % Missing","MOD11 (scaled)")),
|
450 |
a57c4e3d
|
Adam M. Wilson
|
rectangles=list(border=NA,col=c(NA,"tan","darkgreen")),
|
451 |
|
|
text=list(c("C5 MOD35 Processing Path","Desert","Land")),
|
452 |
d39ab57e
|
Adam M. Wilson
|
rectangles=list(border=NA,col=c(NA,IGBP$col[sort(unique(transd$value[transd$variable=="MCD12Q1"]+1))])),
|
453 |
|
|
text=list(c("MCD12Q1 IGBP Land Cover",IGBP$class[sort(unique(transd$value[transd$variable=="MCD12Q1"]+1))])))))),
|
454 |
57d44dd9
|
Adam M. Wilson
|
strip = strip,strip.left=F)
|
455 |
|
|
#print(p4)
|
456 |
be7b1081
|
Adam M. Wilson
|
|
457 |
|
|
|
458 |
|
|
CairoPDF("output/mod35compare.pdf",width=11,height=7)
|
459 |
|
|
#CairoPNG("output/mod35compare_%d.png",units="in", width=11,height=8.5,pointsize=4000,dpi=1200,antialias="subpixel")
|
460 |
|
|
### Global Comparison
|
461 |
598244e1
|
Adam M. Wilson
|
print(g1,position=c(0,.35,1,1),more=T)
|
462 |
|
|
print(g2,position=c(0,0,1,0.415),more=F)
|
463 |
|
|
#print(g3,position=c(0.31,0.06,.42,0.27),more=F)
|
464 |
|
|
|
465 |
be7b1081
|
Adam M. Wilson
|
### MOD35 Desert Processing path
|
466 |
57d44dd9
|
Adam M. Wilson
|
levelplot(pp,asp=1,scales=list(draw=T,rot=0),maxpixels=1e6,cuts=3,
|
467 |
|
|
at=(0:3)+.5,col.regions=c("blue","cyan","tan","darkgreen"),margin=F,
|
468 |
|
|
colorkey=list(space="top",title="MOD35 Processing Path",labels=list(labels=c("Water","Coast","Desert","Land"),at=0:3),height=.25))+
|
469 |
|
|
layer(sp.points(coordinates(bbs),col="black",cex=2,pch=13,lwd=2))+
|
470 |
|
|
layer(sp.lines(coast,lwd=.5))
|
471 |
|
|
|
472 |
ddd9a810
|
Adam M. Wilson
|
### levelplot of regions
|
473 |
be7b1081
|
Adam M. Wilson
|
print(p1,position=c(0,0,.62,1),more=T)
|
474 |
|
|
print(p2,position=c(0.6,0.21,0.78,0.79),more=T)
|
475 |
|
|
print(p3,position=c(0.76,0.21,1,0.79))
|
476 |
|
|
### profile plots
|
477 |
|
|
print(p4)
|
478 |
|
|
dev.off()
|
479 |
ddd9a810
|
Adam M. Wilson
|
|
480 |
be7b1081
|
Adam M. Wilson
|
### summary stats for paper
|
481 |
598244e1
|
Adam M. Wilson
|
td=cast(transect+loc+dist~variable,value="value",data=transd)
|
482 |
|
|
td2=melt.data.frame(td,id.vars=c("transect","dist","loc","MOD35pp","MCD12Q1"))
|
483 |
ddd9a810
|
Adam M. Wilson
|
|
484 |
be7b1081
|
Adam M. Wilson
|
## function to prettyprint mean/sd's
|
485 |
|
|
msd= function(x) paste(round(mean(x,na.rm=T),1),"% ±",round(sd(x,na.rm=T),1),sep="")
|
486 |
ddd9a810
|
Adam M. Wilson
|
|
487 |
be7b1081
|
Adam M. Wilson
|
cast(td2,transect+variable~MOD35pp,value="value",fun=msd)
|
488 |
|
|
cast(td2,transect+variable~MOD35pp+MCD12Q1,value="value",fun=msd)
|
489 |
|
|
cast(td2,transect+variable~.,value="value",fun=msd)
|
490 |
|
|
|
491 |
|
|
cast(td2,transect+variable~.,value="value",fun=msd)
|
492 |
|
|
|
493 |
|
|
cast(td2,variable~MOD35pp,value="value",fun=msd)
|
494 |
|
|
cast(td2,variable~.,value="value",fun=msd)
|
495 |
|
|
|
496 |
|
|
td[td$transect=="Venezuela",]
|
497 |
ddd9a810
|
Adam M. Wilson
|
|
498 |
|
|
|
499 |
d39ab57e
|
Adam M. Wilson
|
#### export KML
|
500 |
ddd9a810
|
Adam M. Wilson
|
library(plotKML)
|
501 |
|
|
|
502 |
d39ab57e
|
Adam M. Wilson
|
kml_open("output/modiscloud.kml")
|
503 |
ddd9a810
|
Adam M. Wilson
|
|
504 |
d39ab57e
|
Adam M. Wilson
|
readAll(mod35c5)
|
505 |
ddd9a810
|
Adam M. Wilson
|
|
506 |
d39ab57e
|
Adam M. Wilson
|
kml_layer.Raster(mod35c5,
|
507 |
57d44dd9
|
Adam M. Wilson
|
plot.legend = TRUE,raster_name="Collection 5 MOD35 2009 Cloud Frequency",
|
508 |
d39ab57e
|
Adam M. Wilson
|
z.lim = c(0,100),colour_scale = get("colour_scale_numeric", envir = plotKML.opts),
|
509 |
ddd9a810
|
Adam M. Wilson
|
# home_url = get("home_url", envir = plotKML.opts),
|
510 |
|
|
# metadata = NULL, html.table = NULL,
|
511 |
d39ab57e
|
Adam M. Wilson
|
altitudeMode = "clampToGround", balloon = FALSE
|
512 |
ddd9a810
|
Adam M. Wilson
|
)
|
513 |
|
|
|
514 |
d39ab57e
|
Adam M. Wilson
|
system(paste("gdal_translate -of KMLSUPEROVERLAY ",mod35c5@file@name," output/mod35c5.kmz -co FORMAT=JPEG"))
|
515 |
|
|
|
516 |
ddd9a810
|
Adam M. Wilson
|
logo = "http://static.tumblr.com/t0afs9f/KWTm94tpm/yale_logo.png"
|
517 |
|
|
kml_screen(image.file = logo, position = "UL", sname = "YALE logo",size=c(.1,.1))
|
518 |
d39ab57e
|
Adam M. Wilson
|
kml_close("modiscloud.kml")
|
519 |
|
|
kml_compress("modiscloud.kml",files=c(paste(month.name,".png",sep=""),"obj_legend.png"),zip="/usr/bin/zip")
|