Revision 88cf72bb
Added by Benoit Parmentier almost 12 years ago
climate/research/oregon/interpolation/covariates_production_temperatures.R | ||
---|---|---|
16 | 16 |
##Comments and TODO: |
17 | 17 |
#This script is meant to be for general processing tile by tile or region by region. |
18 | 18 |
#We must decide on a local projection. This can best set up from the tile/region extent: for now use |
19 |
#- lcc with two standard paralell and one central meridian in the middle of the region. |
|
19 |
#- lcc with two standard paralells and one central meridian in the middle of the region.
|
|
20 | 20 |
#- produce a distance to ocean layer that is global. |
21 | 21 |
#- do not keep output in memory?? |
22 | 22 |
|
... | ... | |
43 | 43 |
lc_path<-"/home/layers/data/land-cover/lc-consensus-global" |
44 | 44 |
elev_path<-"/home/layers/data/terrain/dem-cgiar-srtm-1km-tif" |
45 | 45 |
|
46 |
setwd(in_path) |
|
47 |
|
|
48 | 46 |
infile1<-"worldborder_sinusoidal.shp" |
49 | 47 |
infile2<-"modis_sinusoidal_grid_world.shp" |
50 | 48 |
infile3<-"countries_sinusoidal_world.shp" |
51 | 49 |
infile4<-"srtm_1km.tif" #this is the global file: replace later with the input produced by the DEM team |
50 |
infile5<-"Simard_Pinto_3DGlobalVeg_JGR.tif" #Canopy height |
|
52 | 51 |
list_tiles_modis = c('h11v08','h11v07','h12v07','h12v08','h10v07','h10v08') #tile for Venezuel and surrounding area |
53 | 52 |
infile_reg_outline="" #input region outline defined by polygon |
54 | 53 |
CRS_interp<-"+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs"; |
55 | 54 |
CRS_locs_WGS84<-CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +towgs84=0,0,0") #Station coords WGS84 |
56 |
out_region_name<-"modis_venezuela_region"
|
|
55 |
out_region_name<-"_venezuela_region" |
|
57 | 56 |
out_suffix<-"_VE_01292013" |
58 | 57 |
ref_rast_name<-"" #local raster name defining resolution, exent, local projection--. set on the fly?? |
59 | 58 |
#for the processing tile/region? This is a group fo six tiles for now. |
... | ... | |
84 | 83 |
return(reg_outline_poly) |
85 | 84 |
} |
86 | 85 |
|
87 |
create_raster_region <-function(raster_name,reg_ref_rast,reg_outline_poly){
|
|
86 |
create_raster_region <-function(raster_name,reg_ref_rast){ |
|
88 | 87 |
#This functions returns a subset of tiles from the modis grdi. |
89 | 88 |
#Arguments: raster name of the file,reference file with |
90 | 89 |
#Output: spatial grid data frame of the subset of tiles |
91 | 90 |
|
92 | 91 |
layer_rast<-raster(raster_name) |
93 | 92 |
new_proj<-proj4string(layer_rast) #Extract coordinates reference system in PROJ4 format |
94 |
region_temp_projected<-spTransform(reg_outline_poly,CRS(new_proj)) #Project from current to region coord. system
|
|
93 |
region_temp_projected<-projectExtent(reg_ref_rast,CRS(new_proj)) #Project from current to region coord. system
|
|
95 | 94 |
layer_crop_rast<-crop(layer_rast, region_temp_projected) #crop using the extent from teh region tile |
96 | 95 |
#layer_projected_rast<-projectRaster(from=layer_crop_rast,crs=proj4string(reg_outline),method="ngb") |
97 | 96 |
layer_projected_rast<-projectRaster(from=layer_crop_rast,to=reg_ref_rast,method="ngb") |
... | ... | |
129 | 128 |
|
130 | 129 |
##### STEP 1: Reading region or tile information to set the study or processing region |
131 | 130 |
|
131 |
setwd(in_path) |
|
132 |
|
|
132 | 133 |
filename<-sub(".shp","",infile2) #Removing the extension from file. |
133 | 134 |
modis_grid<-readOGR(".", filename) #Reading shape file using rgdal library |
135 |
filename<-sub(".shp","",infile1) #Removing the extension from file. |
|
136 |
world_countries<-readOGR(".", filename) #Reading shape file using rgdal library |
|
134 | 137 |
|
135 | 138 |
if (infile_reg_outline!=""){ |
136 | 139 |
filename<-sub(".shp","",infile_reg_outline) #Removing the extension from file. |
... | ... | |
140 | 143 |
if (infile_reg_outline==""){ |
141 | 144 |
reg_outline<-create_modis_tiles_region(modis_grid,list_tiles_modis) #problem...this does not |
142 | 145 |
#align with extent of modis LST!!! |
146 |
writeOGR(reg_outline,dsn= ".",layer= paste(out_region_name,"_",out_suffix,sep=""), driver="ESRI Shapefile") |
|
143 | 147 |
} |
144 | 148 |
|
149 |
tmp<-extent(ref_rast) |
|
150 |
|
|
145 | 151 |
#modis_tiles<-create_modis_tiles_region(modis_grid,list_tiles_modis) |
146 | 152 |
##Create covariates for the stuy area: pull everything from the same folder? |
147 | 153 |
|
... | ... | |
150 | 156 |
################################ |
151 | 157 |
#1) LST climatology: project, mosaic |
152 | 158 |
|
153 |
tile<-list_tile_modis[i] |
|
159 |
tile<-list_tiles_modis[i]
|
|
154 | 160 |
pat_str2 <- glob2rx(paste("nobs","*.tif",sep="")) |
155 | 161 |
tmp_str2<- mixedsort(list.files(pattern=pat_str2)) |
156 | 162 |
pat_str1 <- glob2rx(paste("mean","*.tif",sep="")) |
... | ... | |
159 | 165 |
|
160 | 166 |
#list_date_names<-as.character(0:11) |
161 | 167 |
#lsit_date_names<-month.abb |
162 |
out_rastnames<-paste("lst_","nobs",out_suffix,sep="") |
|
168 |
out_rastnames<-paste("_lst_","nobs",out_suffix,sep="")
|
|
163 | 169 |
list_date_names<-c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec") |
164 |
mosaic_list<-split(tmp_str1,list_date_names) |
|
170 |
mosaic_list<-split(tmp_str2,list_date_names) |
|
171 |
new_list<-vector("list",length(mosaic_list)) |
|
165 | 172 |
for (i in 1:length(list_date_names)){ |
166 | 173 |
j<-grep(list_date_names[i],mosaic_list,value=FALSE) |
167 | 174 |
names(mosaic_list)[j]<-list_date_names[i] |
175 |
new_list[i]<-mosaic_list[j] |
|
168 | 176 |
} |
169 |
|
|
177 |
mosaic_list<-new_list |
|
178 |
out_rastnames<-paste(list_date_names,out_rastnames,sep="") |
|
170 | 179 |
#reproject and crop if necessary |
171 | 180 |
nobs_m_list<-mosaic_raster_list(mosaic_list,out_rastnames,out_path) |
172 | 181 |
plot(stack(nobs_m_list)) |
... | ... | |
190 | 199 |
plot(stack(mean_m_list)) |
191 | 200 |
#Use this as ref file for now?? Ok for the time being: this will need to change to be a processing tile. |
192 | 201 |
ref_rast<-raster(mean_m_list[[1]]) |
202 |
#Modis shapefile tile is slighly shifted: |
|
203 |
# +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs for ref_rast |
|
204 |
#"+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs" ?? |
|
205 |
#reassign proj from modis tile to raster? there is a 10m diff in semi-axes...(a and b) |
|
206 |
|
|
193 | 207 |
|
194 | 208 |
######################################### |
195 | 209 |
##2) Crop and reproject Canopy height data |
196 | 210 |
|
197 | 211 |
#Make it a function? |
198 |
canopy_rast<-raster("Simard_Pinto_3DGlobalVeg_JGR.tif") |
|
199 |
new_proj<-proj4string(canopy) #Assign coordinates reference system in PROJ4 format |
|
200 |
region_temp_projected<-spTransform(modis_tiles,CRS(new_proj)) #Project from WGS84 to new coord. system |
|
201 |
canopy_crop_rast<-crop(canopy, region_temp_projected) #crop using the extent from teh region tile |
|
202 |
canopy_projected_rast<-projectRaster(from=canopy_crop_rast,crs=proj4string(modis_tiles),method="ngb") |
|
212 |
#canopy_rast<-raster("Simard_Pinto_3DGlobalVeg_JGR.tif") |
|
213 |
canopy_name<-file.path(in_path,infile5) |
|
214 |
#new_proj<-proj4string(canopy) #Assign coordinates reference system in PROJ4 format |
|
215 |
#region_temp_projected<-spTransform(modis_tiles,CRS(new_proj)) #Project from WGS84 to new coord. system |
|
216 |
#canopy_crop_rast<-crop(canopy, region_temp_projected) #crop using the extent from teh region tile |
|
217 |
#canopy_projected_rast<-projectRaster(from=canopy_crop_rast,crs=proj4string(modis_tiles),method="ngb") |
|
203 | 218 |
#Use GDAL instead?? system( 'gdalwarp...') |
204 | 219 |
|
205 |
CANHEIGHT<-raster(s_raster,layer=pos) #Select layer from stack |
|
206 |
s_raster<-dropLayer(s_raster,pos) |
|
207 |
CANHEIGHT[is.na(CANHEIGHT)]<-0 |
|
220 |
#CANHEIGHT<-raster(s_raster,layer=pos) #Select layer from stack |
|
221 |
#s_raster<-dropLayer(s_raster,pos) |
|
222 |
#CANHEIGHT[is.na(CANHEIGHT)]<-0 |
|
223 |
|
|
224 |
CANHEIGHT<-create_raster_region(canopy_name,ref_rast) |
|
208 | 225 |
|
209 | 226 |
########################################## |
210 | 227 |
#3) Creating elev, aspect, slope from STRM |
211 | 228 |
|
212 | 229 |
SRTM_name<-file.path(elev_path,infile4) |
213 |
SRTM_reg<-create_raster_region(SRTM_name,reg_outline)
|
|
230 |
SRTM_reg<-create_raster_region(SRTM_name,ref_rast)
|
|
214 | 231 |
|
215 | 232 |
#new_proj<-proj4string(SRTM_rast) #Assign coordinates reference system in PROJ4 format |
216 | 233 |
#region_temp_projected<-spTransform(modis_tiles,CRS(new_proj)) #Project from WGS84 to new coord. system |
... | ... | |
227 | 244 |
###calculate slope and aspect |
228 | 245 |
|
229 | 246 |
terrain_rast<-terrain(SRTM_reg, opt=c("slope","aspect"),unit="degrees", neighbors=8) #, filename=\u2019\u2019, ...) |
230 |
pos<-match("ASPECT",layerNames(terrain_rast)) #Find column with name "value"
|
|
231 |
r1<-raster(s_raster,layer=pos) #Select layer from stack
|
|
232 |
pos<-match("slope",layerNames(terrain_rast)) #Find column with name "value"
|
|
233 |
r2<-raster(s_raster,layer=pos) #Select layer from stack
|
|
247 |
pos<-match("aspect",names(terrain_rast)) #Find column with name "value"
|
|
248 |
r1<-raster(terrain_rast,layer=pos) #Select layer from stack
|
|
249 |
pos<-match("slope",names(terrain_rast)) #Find column with name "value"
|
|
250 |
r2<-raster(terrain_rast,layer=pos) #Select layer from stack
|
|
234 | 251 |
N<-cos(r1) |
235 | 252 |
E<-sin(r1) |
236 | 253 |
Nw<-sin(r2)*cos(r1) #Adding a variable to the dataframe |
... | ... | |
251 | 268 |
for (i in 1:length(lc_list)){ |
252 | 269 |
|
253 | 270 |
lc_name<-lc_list[[i]] |
254 |
lc_reg<-create_raster_region(lc_name,reg_outline)
|
|
271 |
lc_reg<-create_raster_region(lc_name,ref_rast)
|
|
255 | 272 |
data_name<-paste("reg_",sub(".tif","",lc_name),"_",sep="") #can add more later... |
256 | 273 |
raster_name<-paste(data_name,out_suffix,".tif", sep="") |
257 | 274 |
writeRaster(lc_reg, filename=file.path(out_path,raster_name),overwrite=TRUE) |
... | ... | |
260 | 277 |
setwd(out_path) |
261 | 278 |
lc_reg_list<-mixedsort(list.files(pattern="reg_con.*.tif")) |
262 | 279 |
lc_reg_s<-stack(lc_reg_list) |
263 |
|
|
280 |
#lc_reg_s<-as.character(lc_reg_list) |
|
264 | 281 |
#Now combine forest classes...in LC1 forest, LC2, LC3, LC4 and LC6-urban...?? |
265 | 282 |
|
266 | 283 |
#create a local mask for the tile/processing region |
267 | 284 |
|
268 |
LC12<-raster("reg_con_1km_class_12__VE_01292013.tif") #this is open water
|
|
285 |
LC12<-raster(paste("reg_con_1km_class_12_",out_suffix,".tif",sep="")) #this is open water
|
|
269 | 286 |
LC_mask<-LC12 |
270 | 287 |
LC_mask[LC_mask==100]<-NA |
271 | 288 |
LC_mask <- LC_mask > 100 |
272 |
tmp<-mask(lc_reg_s,LC_mask)
|
|
289 |
lc_reg_s<-mask(lc_reg_s,LC_mask,filename=paste("reg_con_1km_classes_",out_suffix,".tif",sep=""))
|
|
273 | 290 |
|
274 | 291 |
############################### |
275 | 292 |
#5) DISTOC, distance to coast: Would be useful to have a distance to coast layer ready... |
276 | 293 |
|
277 |
#This does not work...clump needs igraph. look into this later...for now I used IDRISI to clump pixels. |
|
294 |
#This does not work...clump needs igraph. I'll look into this later...for now I used IDRISI to clump pixels.
|
|
278 | 295 |
#rc<-clump(LC12) |
279 | 296 |
#tab_freq<-freq(rc) |
280 |
|
|
281 | 297 |
#Modify at a later stage: |
282 | 298 |
#raster<-"DISTOC_VE_01292013.rst" |
283 |
ocean_rast<-raster(file.path(in_path,"lc12_tmp_grouped_rec.rst")) |
|
284 |
ocean_rast[ocean_rast==0]<-NA |
|
299 |
#ocean_rast<-raster(file.path(in_path,"lc12_tmp_grouped_rec.rst"))
|
|
300 |
#ocean_rast[ocean_rast==0]<-NA
|
|
285 | 301 |
#Distance calculated in a global layer?? |
286 |
distoc_reg<-distance(ocean_rast,doEdge=TRUE) #this is very slow: more than 30min use GRASS instead?? |
|
302 |
#distoc_reg<-distance(ocean_rast,doEdge=TRUE) #this is very slow: more than 35 min use GRASS instead?? |
|
303 |
|
|
304 |
#load DISTOC produced from IDRISI: automate the process later |
|
305 |
distoc_reg<-raster(file.path(in_path,"DISTOC_VE_01292013.rst")) |
|
287 | 306 |
|
288 | 307 |
################################ |
289 | 308 |
#6) X-Y coordinates and LAT-LONG: do not keep in memory? |
290 |
r1<-ref_rast |
|
291 |
|
|
292 |
xy<-coordinates(r1) #get x and y projected coordinates...
|
|
309 |
r1 <-ref_rast
|
|
310 |
xy <-coordinates(r1) #get x and y projected coordinates... |
|
311 |
CRS_interp<-proj4string(r1)
|
|
293 | 312 |
xy_latlon<-project(xy, CRS_interp, inv=TRUE) # find lat long for projected coordinats (or pixels...) |
294 |
lon<-raster(xy_latlon) #Transform a matrix into a raster object ncol=ncol(r1), nrow=nrow(r1))
|
|
295 |
lon<-init(r1,v="x")
|
|
296 |
projection(lon)<-CRS #At this stage this is still an empty raster with 536 nrow and 745 ncell
|
|
297 |
lat<-lon |
|
298 |
values(lon)<-xy_latlon[,1]
|
|
299 |
values(lat)<-xy_latlon[,2]
|
|
300 |
|
|
313 |
x <-init(r1,v="x")
|
|
314 |
y <-init(r1,v="y")
|
|
315 |
lon <-x
|
|
316 |
lat <-lon
|
|
317 |
lon <-setValues(lon,xy_latlon[,1]) #longitude for every pixel in the processing tile/region
|
|
318 |
lat <-setValues(lat,xy_latlon[,2]) #latitude for every pixel in the processing tile/region
|
|
319 |
rm(r1) |
|
301 | 320 |
#coord_s<-stack(x,y,lat,lon) |
302 | 321 |
|
303 | 322 |
################################ |
... | ... | |
305 | 324 |
#Create a stack in tif format... |
306 | 325 |
|
307 | 326 |
#? output name?? |
308 |
r<-stack(N,E,Nw,Ew,lon,lat,LC1,LC3,LC4,LC6, CANHEIGHT,ELEV_SRTM) |
|
309 |
rnames<-c("Northness","Eastness","Northness_w","Eastness_w", "lon","lat","LC1","LC3","LC4","LC6","CANHEIGHT","ELEV_SRTM") |
|
310 |
layerNames(r)<-rnames |
|
311 |
s_raster<-addLayer(s_raster, r) |
|
312 |
|
|
313 |
##Extracting the variables values from the raster files |
|
314 |
|
|
315 |
lines<-read.table(paste(path,"/",inlistf,sep=""), sep=" ") #Column 1 contains the names of raster files |
|
316 |
inlistvar<-lines[,1] |
|
317 |
inlistvar<-paste(path,"/",as.character(inlistvar),sep="") |
|
318 |
covar_names<-as.character(lines[,2]) #Column two contains short names for covaraites |
|
319 |
|
|
320 |
s_raster<- stack(inlistvar) #Creating a stack of raster images from the list of variables. |
|
321 |
layerNames(s_raster)<-covar_names #Assigning names to the raster layers |
|
322 |
projection(s_raster)<-CRS |
|
323 |
|
|
324 |
#eWrite out stack of number of change |
|
325 |
data_name<-paste("covariates_",out_name_region,"_",sep="") |
|
326 |
raster_name<-paste("A_",data_name,out_suffix,".tif", sep="") |
|
327 |
writeRaster(s_raster, filename=raster_name,NAflag=-999,bylayer=False,bandorder="BSQ",overwrite=TRUE) #Writing the data in a raster file format... |
|
327 |
r<-stack(x,y,lon,lat,N,E,Nw,Ew,SRTM_reg,terrain_rast,CANHEIGHT,distoc_reg) |
|
328 |
rnames<-c("x","y","lon","lat","N","E","N_w","E_w","elev","slope","aspect","CANHEIGHT","DISTOC") |
|
329 |
names(r)<-rnames |
|
330 |
s_raster<-r |
|
331 |
#Add landcover layers |
|
332 |
lc_names<-c("LC1","LC2","LC3","LC4","LC5","LC6","LC7","LC8","LC9","LC10","LC11","LC12") |
|
333 |
names(lc_reg_s)<-lc_names #assign land cover names |
|
334 |
s_raster<-addLayer(s_raster, lc_reg_s) |
|
335 |
|
|
336 |
lst_s<-stack(c(as.character(mean_m_list),as.character(nobs_m_list))) |
|
337 |
lst_names<-c("mm_01","mm_02","mm_03","mm_04","mm_05","mm_06","mm_07","mm_08","mm_09","mm_10","mm_11","mm_12", |
|
338 |
"nobs_01","nobs_02","nobs_03","nobs_04","nobs_05","nobs_06","nobs_07","nobs_08", |
|
339 |
"nobs_09","nobs_10","nobs_11","nobs_12") |
|
340 |
names(lst_s)<-lst_names |
|
341 |
s_raster<-addLayer(s_raster, lst_s) |
|
342 |
s_raster<-mask(s_raster,LC_mask,filename="test.tif") |
|
343 |
|
|
344 |
covar_names<-c(rnames,lc_names,lst_names) |
|
345 |
names(s_raster)<-covar_names |
|
346 |
#Write out stack of number of change |
|
347 |
data_name<-paste("covariates_",out_region_name,"_",sep="") |
|
348 |
raster_name<-paste(data_name,out_suffix,".tif", sep="") |
|
349 |
writeRaster(s_raster, filename=raster_name,NAflag=-999,bylayer=FALSE,bandorder="BSQ",overwrite=TRUE) #Writing the data in a raster file format... |
|
328 | 350 |
#using bil format more efficient?? |
329 | 351 |
|
330 | 352 |
####################################################### |
Also available in: Unified diff
Covariates production, modified projection and distance to coast, added writing up of multiband covariates brick