Skip to content
Snippets Groups Projects
Select Git revision
  • 075ea82f180833dc74bec99ccaeee6d054aaa1a0
  • main default protected
  • develop
  • v0.1
4 results

parameters_valugaps.R

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    A98_PredictorsExtract.R 2.31 KiB
    
    PredExtr <- function(x.shp, myfunction=NA, output,  
                         toextract, typp=c("raster", "shp"), ncores, chunkn=1, chunk.i=NA){
      print("Load Packages")
      require(foreach)
      require(parallel)
      require(doParallel)
      require(raster)
      require(rgeos)
      require(rgdal) 
     
      print(paste("Loading", typp, "data :", toextract))
      print(paste("output will be:", output))
      if(typp=="raster"){ mypredictor <- raster(toextract)} else
        mypredictor <- readOGR(toextract)
      header.shp <-readOGR(x.shp)
      crs(mypredictor) <- crs(header.shp) #should be verified beforehand!
    
      ## Divide in chunks if requested
      if(chunkn>1 & !is.na(chunk.i)){
        print(paste("divide in chunks and run on chunk n.", chunk.i))
        indices <- 1:length(header.shp)
        chunks <- split(indices, sort(indices%%chunkn))
        header.shp <- header.shp[chunks[[chunk.i]],]
        } 
    
      # define ancillary functions
      robust.mean <- function(x){mean(x, rm.na=T)}
      robust.mode <- function(x){if(any(x!=0)) {
     	 a <- x[which(x!=0)] #exclude zero (i.e. NAs)
      	return(as.numeric(names(sort(table(a), decreasing=T))[1]))} else
    	    return(NA)                          }
    
      print("go parallel")
      cl <- makeForkCluster(ncores, outfile="" )
      registerDoParallel(cl)
    
      print("start main foreach loop")
      if(typp=="raster"){
      out <- foreach(i=1:length(header.shp), .packages=c('raster'), .combine=rbind) %dopar% { 
        tmp <- raster::extract(mypredictor, header.shp[i,], 
                             buffer=min(10000,  max(250, header.shp@data$loc.uncert[i])), fun=myfunction) 
        }
      write.csv(out, file = output)
      } else {
        out <- sp::over(x=header.shp, y=mypredictor) 
        toassign <- header.shp[which(is.na(out[,1])),]
        print(paste(length(toassign), "plots not matched directely - seek for NN"))
      if(length(toassign)>0){
        
        nearest <- foreach(i=1:length(toassign), .packages=c('raster'), .combine=rbind) %dopar% { 
          print(i)
          nearest.tmp <- tryCatch(geosphere::dist2Line(header.shp[i,], mypredictor),
                                  error = function(e){data.frame(distance=NA, lon=NA, lat=NA,ID=NA)}
                                  )
          #nearest.tmp <- geosphere::dist2Line(toassign[i,], mypredictor)
          return(nearest.tmp)
        }
        
    
        out[which(is.na(out[,1])),] <- mypredictor@data[nearest[,"ID"],]
       }
        write.csv(out, file=output)
      }
      stopCluster(cl)
      }