R এর বহু বহুগুণ দ্বারা ক্রপ, মাস্ক এবং রাস্টার উত্তোলনের গতি বাড়ছে?


29

আমি কয়েক হাজার বহুভুজ সীমানার ভিত্তিতে একটি রাস্টার থেকে অঞ্চল এবং বিভিন্ন জমি ব্যবহারের প্রকারের শতাংশ কভারটি বের করছি। আমি খুঁজে পেয়েছি যে প্রত্যক্ষ ফাংশনটি আরও দ্রুত কাজ করে যদি আমি প্রতিটি স্বতন্ত্র বহুভুজ এবং ফসলের মধ্য দিয়ে পুনরাবৃত্তি করি তবে রাস্টারটিকে নির্দিষ্ট বহুভুজের আকারে নিচে মুখোশ দিন। যাইহোক, এটি বেশ ধীর এবং আমি ভাবছি যে আমার কোডটির দক্ষতা এবং গতি উন্নত করার জন্য কারও কাছে কোনও পরামর্শ আছে কিনা।

আমি শুধু এই সংক্রান্ত পেয়েছি কোনদিন এই প্রতিক্রিয়া যারা ব্যবহার প্রস্তাবিত রজার Bivand দ্বারা GDAL.open()এবং GDAL.close()সেইসাথে getRasterTable()এবং getRasterData()। আমি সেগুলিতে সন্ধান করেছি তবে অতীতে জিডাল নিয়ে সমস্যায় পড়েছি এবং কীভাবে এটি বাস্তবায়ন করতে হবে তা সঠিকভাবে জানি না।

পুনরুত্পাদনযোগ্য উদাহরণ:

library(maptools)  ## For wrld_simpl
library(raster)

## Example SpatialPolygonsDataFrame
data(wrld_simpl) #polygon of world countries
bound <- wrld_simpl[1:25,] #name it this to subset to 25 countries and because my loop is set up with that variable  

## Example RasterLayer
c <- raster(nrow=2e3, ncol=2e3, crs=proj4string(wrld_simpl), xmn=-180, xmx=180, ymn=-90, ymx=90)
c[] <- 1:length(c)

#plot, so you can see it
plot(c)    
plot(bound, add=TRUE) 

এখন পর্যন্ত দ্রুততম পদ্ধতি

result <- data.frame() #empty result dataframe 

system.time(
     for (i in 1:nrow(bound)) { #this is the number of polygons to iterate through
      single <- bound[i,] #selects a single polygon
      clip1 <- crop(c, extent(single)) #crops the raster to the extent of the polygon, I do this first because it speeds the mask up
      clip2 <- mask(clip1,single) #crops the raster to the polygon boundary

      ext<-extract(clip2,single) #extracts data from the raster based on the polygon bound
      tab<-lapply(ext,table) #makes a table of the extract output
      s<-sum(tab[[1]])  #sums the table for percentage calculation
      mat<- as.data.frame(tab) 
      mat2<- as.data.frame(tab[[1]]/s) #calculates percent
      final<-cbind(single@data$NAME,mat,mat2$Freq) #combines into single dataframe
      result<-rbind(final,result)
      })

   user  system elapsed 
  39.39    0.11   39.52 

সমান্তরাল প্রক্রিয়াকরণ

সমান্তরাল প্রক্রিয়াকরণ ব্যবহারকারীর সময়কে অর্ধেক করে কেটে ফেলেছে, তবে সিস্টেমের সময় দ্বিগুণ করে সুবিধা উপেক্ষা করেছে। রাস্টার এটি এক্সট্রাক্ট ফাংশনের জন্য ব্যবহার করে তবে দুর্ভাগ্যক্রমে ক্রপ বা মাস্ক ফাংশনের জন্য নয়। দুর্ভাগ্যক্রমে, "আইও" দ্বারা "অপেক্ষা করার " কারণে এটি মোট অতিবাহিত সময়ের চেয়ে অল্প পরিমাণে ছেড়ে যায় leaves

beginCluster( detectCores() -1) #use all but one core

একাধিক কোরে কোড চালান:

  user  system elapsed 
  23.31    0.68   42.01 

তারপরে ক্লাস্টারটি শেষ করুন

endCluster()

ধীর পদ্ধতি: রাস্টার ফাংশন থেকে সরাসরি একটি এক্সট্রাক্ট করার বিকল্প পদ্ধতিতে অনেক বেশি সময় লাগে এবং ডেটা পরিচালনা সম্পর্কে আমি যে ফর্মটি চাই সেটিতে এটি পেতে আমি নিশ্চিত নই:

system.time(ext<-extract(c,bound))
   user  system elapsed 
1170.64   14.41 1186.14 

আপনি এই আর কোড প্রোফাইলারটি ব্যবহার করতে পারেন ( marcodvisser.github.io/aprof/Tutorial.html )। এটি আপনাকে বলতে পারে কোন লাইনগুলি বেশিরভাগ সময় নেয়। লিঙ্কটিতে আর।
জে কেলি

এখানে আমার দুটি সেন্ট। । । ফসলে পিক্সেলের সংখ্যা খুব কম হলে ফসল / গেটভ্যালু পদ্ধতি কার্যকর হয় না। আমি সীমাটি কোথায় তা নিশ্চিত নই, তবে আমি যেখানে ফসলের বিষয়ে মাত্র 1-5 পিক্সেল ছিল সেগুলি নিয়ে আমার সমস্যা ছিল (কেন আমি সঠিক কারণটি নির্ধারণ করতে পারি নি (স্থানীয় প্যাকেজগুলিতে এখনও কিছুটা নতুন)) তবে আমি বাজি ধরেছি যে ফসলের কার্যকারিতা নির্ভর করে পিক্সেল সীমানা, সুতরাং এইভাবে কোনও পৃথক পিক্সেল ক্রপ করতে সংগ্রাম করে)। রাস্টার প্যাকেজ থেকে এক্সট্রাক্ট করার ক্ষেত্রে এ জাতীয় কোনও সমস্যা নেই তবে ব্যবহারকারী সময় দ্বিগুণ হয়ে গেছে এবং সিস্টেম টাইমের চেয়ে দ্বিগুণের চেয়ে বেশি। যাদের কম রেজোলিউশন রাস্টার রয়েছে তাদের কেবল একটি সতর্কতা (এবং একটি
নিল বার্শ

2
কিছুটা নতুন প্যাকেজ রয়েছে, ভেলাক্স, যা আরসিপি প্যাকেজটির মাধ্যমে এক্সট্র্যাক্টটিকে সিতে স্থানান্তরিত করেছে। এটি বহুভুজ ব্যবহার করে নিষ্কাশন পরিচালনায় গতিতে 10 ডলার বৃদ্ধি দিচ্ছে।
জেফ্রি ইভান্স

@ জেফ্রিএভান্স এখন ভেলাক্স ব্যবহার করে এই প্রশ্নের উত্তর পরীক্ষা করা হচ্ছে। এটির সাথে সমস্যাগুলি অত্যন্ত বড় ভেক্টরগুলি বরাদ্দ করে।
সেলডমসিনস্লিম

উত্তর:


23

অবশেষে আমি এই ফাংশনটি উন্নত করতে পেরেছি। আমি দেখতে পেয়েছি যে আমার উদ্দেশ্যে, এটি rasterize()বহুগুণে সবচেয়ে দ্রুত এবং এর getValues()পরিবর্তে ব্যবহার হয়েছিল extract()। ক্ষুদ্র বহুভুজগুলিতে রাস্টার মানগুলি ট্যাবুলেট করার জন্য মূল কোডের চেয়ে বেশি দ্রুতগতি সম্পন্ন হয় না, তবে যখন এটি বৃহত্তর বহুভুজ অঞ্চলে আসে যখন বড় আকারের রাস্টারগুলি কাটা হয় এবং মানগুলি তোলা হয়। আমিও ফাংশন getValues()চেয়ে অনেক দ্রুত ছিল extract()

আমি মাল্টি-কোর প্রসেসিং ব্যবহার করেও বের করেছি foreach()

আমি আশা করি এটি অন্যান্য লোকেদের জন্য দরকারী যারা বহুভুজ ওভারলে থেকে রাস্টার মানগুলি বের করার জন্য আর সমাধান চান। এটি আর্কজিআইএসের "ট্যাবুলেট ছেদ" এর মতো, যা এই ব্যবহারকারীর মতো কয়েক ঘন্টা প্রসেসিংয়ের পরে খালি আউটপুটগুলি ফিরিয়ে দিয়ে আমার পক্ষে ভাল কাজ করে না ।

#initiate multicore cluster and load packages
library(foreach)
library(doParallel)
library(tcltk)
library(sp)
library(raster)

cores<- 7
cl <- makeCluster(cores, output="") #output should make it spit errors
registerDoParallel(cl)

ফাংশনটি এখানে:

multicore.tabulate.intersect<- function(cores, polygonlist, rasterlayer){ 
  foreach(i=1:cores, .packages= c("raster","tcltk","foreach"), .combine = rbind) %dopar% {

    mypb <- tkProgressBar(title = "R progress bar", label = "", min = 0, max = length(polygonlist[[i]]), initial = 0, width = 300) 

    foreach(j = 1:length(polygonlist[[i]]), .combine = rbind) %do% {
      final<-data.frame()
      tryCatch({ #not sure if this is necessary now that I'm using foreach, but it is useful for loops.

        single <- polygonlist[[i]][j,] #pull out individual polygon to be tabulated

        dir.create (file.path("c:/rtemp",i,j,single@data$OWNER), showWarnings = FALSE) #creates unique filepath for temp directory
        rasterOptions(tmpdir=file.path("c:/rtemp",i,j, single@data$OWNER))  #sets temp directory - this is important b/c it can fill up a hard drive if you're doing a lot of polygons

        clip1 <- crop(rasterlayer, extent(single)) #crop to extent of polygon
        clip2 <- rasterize(single, clip1, mask=TRUE) #crops to polygon edge & converts to raster
        ext <- getValues(clip2) #much faster than extract
        tab<-table(ext) #tabulates the values of the raster in the polygon

        mat<- as.data.frame(tab)
        final<-cbind(single@data$OWNER,mat) #combines it with the name of the polygon
        unlink(file.path("c:/rtemp",i,j,single@data$OWNER), recursive = TRUE,force = TRUE) #delete temporary files
        setTkProgressBar(mypb, j, title = "number complete", label = j)

      }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")}) #trycatch error so it doesn't kill the loop

      return(final)
    }  
    #close(mypb) #not sure why but closing the pb while operating causes it to return an empty final dataset... dunno why. 
  }
}

সুতরাং এটি ব্যবহার করতে, single@data$OWNERআপনার সনাক্তকারী বহুভুজের কলাম নামের সাথে মানানসই সামঞ্জস্য করুন (অনুমান করুন যে ফাংশনটিতে তৈরি করা যেতে পারে ...) এবং এতে লিখুন:

myoutput <- multicore.tabulate.intersect(cores, polygonlist, rasterlayer)

3
যে পরামর্শটি getValuesতার চেয়ে অনেক দ্রুত ছিল extractতা বৈধ বলে মনে হচ্ছে না কারণ আপনি যদি ব্যবহার করেন তবে আপনাকে extractকরতে হবে না cropএবং rasterize(বা mask)। মূল প্রশ্নের কোডটি উভয়ই করে এবং এটি দ্বিগুণ প্রক্রিয়াকরণের সময় হওয়া উচিত।
রবার্ট হিজম্যানস

জানার একমাত্র উপায় হচ্ছে পরীক্ষা করা।
ডিজেস

এখানে বহুভুজ তালিকাটি কোন শ্রেণি, এবং বহুভুজ তালিকাটি [[i]] [, জে] এখানে কী করা উচিত (ELI5, দয়া করে)? আমি সমান্তরাল স্টাফগুলিতে নবাগত, তাই আমি এটি খুব ভাল বুঝতে পারি না। আমি বহুগুণ তালিকাতে [[i]] [, জে] বহুভুক্ত তালিকায় [[জে]], যা যৌক্তিক বেকাউস [, জে] একটি স্প্যাটিয়ালপলিজোনস ডেটাফ্রেমের জেথ উপাদান হিসাবে পরিবর্তিত হওয়া অবধি পরিবর্তিত না হওয়া পর্যন্ত আমি কোনও কিছু ফেরত ফাংশনটি পেতে পারি না সঠিক বর্গ কি? পরিবর্তনের পরে আমি প্রক্রিয়াটি চলমান এবং কিছু আউটপুট পেয়েছিলাম, তবে অবশ্যই এখনও কিছু ভুল আছে। (আমি এন ছোট বহুভুজগুলির মধ্যে মধ্যমানের মানটি বের করার চেষ্টা করি, তাই আমি কোডটিরও কিছুটা পরিবর্তন করেছি)।
রিমা

@ রবার্টএইচ আমার ক্ষেত্রে, ক্রপিং (এবং মাস্কিং) এটি প্রায় 3 গুণ দ্রুত চালিত করে। আমি একটি 100 মিলিয়ন একর রাস্টার ব্যবহার করছি এবং বহুভুজ এটির একটি ক্ষুদ্র ভগ্নাংশ। যদি আমি বহুভুতে ক্রপ না করি তবে প্রক্রিয়াটি অনেক ধীর গতিতে চলে। এখানে আমার ফলাফলগুলি: ক্লিপ 1 <- ক্রপ (রাস্টারলেয়ার, সীমা (একক))> system.time (এক্সট্রাক্ট-এক্সট্র্যাক্ট (ক্লিপ 1, একক)) # ক্রপযুক্ত রাস্টার ব্যবহারকারী সিস্টেম থেকে পাঠানো 65.94 0.37 67.22> system.time (ext < -অক্ষেত্র (রাস্টারলেয়ার, একক) # 100 মিলিয়ন একর রাস্টার ব্যবহারকারী সিস্টেম থেকে পাঠ্যকাল 175.00 4.92 181.10 কেটে গেছে
লুক ম্যাকাওল

4

বিন্দু, এক্সওয়াই বা বহুভুজ থেকে রাস্টার (রাস্টার স্ট্যাক) বের করার গতি বাড়ান

দুর্দান্ত উত্তর লূক। আপনি অবশ্যই একটি আর উইজার্ড হতে হবে! আপনার কোডটি সহজ করার জন্য এখানে একটি অতি সামান্য টুইট রয়েছে (কিছু ক্ষেত্রে পারফরম্যান্সকে কিছুটা উন্নতি করতে পারে)। আপনি সেলফ্রিমপলিগন (বা পয়েন্টগুলির জন্য সেলফ্রোমএক্সওয়াই) ব্যবহার করে কিছু অপারেশন এড়াতে পারেন এবং তারপরে ক্লিপ এবং গেটভ্যালু।

রাস্টার স্ট্যাকগুলি থেকে বহুভুজ বা পয়েন্ট ডেটা বের করুন ------------------------

 library(raster)  
 library(sp)   

  # create polygon for extraction
  xys= c(76.27797,28.39791,
        76.30543,28.39761,
        76.30548,28.40236,
        76.27668,28.40489)
  pt <- matrix(xys, ncol=2, byrow=TRUE)
  pt <- SpatialPolygons(list(Polygons(list(Polygon(pt)), ID="a")));
  proj4string(pt) <-"+proj=longlat +datum=WGS84 +ellps=WGS84"
  pt <- spTransform(pt, CRS("+proj=sinu +a=6371007.181 +b=6371007.181 +units=m"))
  ## Create a matrix with random data & use image()
  xy <- matrix(rnorm(4448*4448),4448,4448)
  plot(xy)

  # Turn the matrix into a raster
  NDVI_stack_h24v06 <- raster(xy)
  # Give it lat/lon coords for 36-37°E, 3-2°S
  extent(NDVI_stack_h24v06) <- c(6671703,7783703,2223852,3335852)
  # ... and assign a projection
  projection(NDVI_stack_h24v06) <- CRS("+proj=sinu +a=6371007.181 +b=6371007.181 +units=m")
  plot(NDVI_stack_h24v06)
  # create a stack of the same raster
  NDVI_stack_h24v06 = stack( mget( rep( "NDVI_stack_h24v06" , 500 ) ) )


  # Run functions on list of points
  registerDoParallel(16)
  ptm <- proc.time()
  # grab cell number
  cell = cellFromPolygon(NDVI_stack_h24v06, pt, weights=FALSE)
  # create a raster with only those cells
  r = rasterFromCells(NDVI_stack_h24v06, cell[[1]],values=F)
  result = foreach(i = 1:dim(NDVI_stack_h24v06)[3],.packages='raster',.combine=rbind,.inorder=T) %dopar% {
     #get value and store
     getValues(crop(NDVI_stack_h24v06[[i]],r))
  }
  proc.time() - ptm
  endCluster()

ব্যবহারকারী সিস্টেম 16.682 2.610 2.530 কেটে গেছে

  registerDoParallel(16)
  ptm <- proc.time()
  result = foreach(i = 1:dim(NDVI_stack_h24v06)[3],.packages='raster',.inorder=T,.combine=rbind) %dopar% {
        clip1 <- crop(NDVI_stack_h24v06[[i]], extent(pt)) #crop to extent of polygon
        clip2 <- rasterize(pt, clip1, mask=TRUE) #crops to polygon edge & converts to raster
         getValues(clip2) #much faster than extract
  }
  proc.time() - ptm
  endCluster()

ব্যবহারকারী সিস্টেমটি 33.038 3.511 3.288 কেটে গেছে


আমি দুটি পদ্ধতির দৌড়েছি এবং আপনার ব্যবহারটি আমার ব্যবহারের ক্ষেত্রে কিছুটা ধীরে ধীরে বেরিয়ে এসেছিল।
লুক ম্যাকোলে

2

যদি ওভারলেয়ের নির্ভুলতার কোনও ক্ষতি ভয়ঙ্করভাবে গুরুত্বপূর্ণ না হয় - ধরে নেওয়া সুনির্দিষ্টভাবে মনে করা - প্রথমত বহুভুজগুলিকে একজন রাস্টারে রূপান্তরিত করে কেউ সাধারণত অনেক বেশি জোনাল গণনার গতি অর্জন করতে পারে। rasterপ্যাকেজ রয়েছে zonal()ফাংশন, যা অভিপ্রেত কাজের জন্য ভাল কাজ করা উচিত। তবে, আপনি সর্বদা স্ট্যান্ডার্ড ইনডেক্সিং ব্যবহার করে একই মাত্রার দুটি ম্যাট্রিককে সাবসেট করতে পারেন। যদি আপনাকে অবশ্যই বহুভুজ বজায় রাখতে হয় এবং আপনি জিআইএস সফ্টওয়্যারটিকে কিছু মনে করেন না, তবে আঞ্চিআইএসআইএস বা এনভিআই-আইডিএল-এর চেয়ে জোনাল স্ট্যাটিস্টিতে কিউজিআইএস অবশ্যই দ্রুততর হবে।


2

আমি এটির জন্যও কিছু সময়ের জন্য সংগ্রাম করেছিলাম, একটি ~ 1kmx1km গ্রিডে ~ 300mx300m গ্রিড মানচিত্রের জমি কভার শ্রেণির অঞ্চল ভাগ গণনা করার চেষ্টা করে। পরবর্তীটি একটি বহুভুজ ফাইল ছিল। আমি মাল্টিকোর সলিউশন চেষ্টা করেছিলাম তবে গ্রিড সেলগুলির সংখ্যার জন্য এটি এখনও খুব ধীর ছিল। পরিবর্তে আমি:

  1. সমস্ত গ্রিড কোষকে একটি অনন্য নম্বর প্রদান করে 1kmx1km গ্রিডটি নতুন করে তৈরি করুন
  2. 1kmx1km গ্রিডটির রেজোলিউশন 300mx300 মি, একই প্রক্ষেপণ ইত্যাদি বাড়ানোর জন্য r = "কাছাকাছি" বিকল্পের সাহায্যে gdalUtils প্যাকেজ থেকে allign_rasters (বা সরাসরি gdalwarp) ব্যবহার করুন etc.
  3. রাস্টার প্যাকেজটি ব্যবহার করে, পদক্ষেপ 2 থেকে 300mx300 মি স্থল কভার মানচিত্র এবং 300mx300 মি গ্রিডটি স্ট্যাক করুন: স্ট্যাক_ফাই <<স্ট্যাক (এলসি, গ্রিড)।
  4. মানচিত্রগুলি একত্রিত করতে একটি ডেটা ফ্রেম তৈরি করুন: ডিএফ <- as.data.frame (রাস্টারটোপয়েন্টস (স্ট্যাক_ফাইল)), যা 1kmx1km মানচিত্রের গ্রিড সেল নম্বরগুলি 300mx300 মি স্থল কভার মানচিত্রে মানচিত্র করে?
  5. 1kmx1km সেলগুলিতে স্থলভাগের শ্রেণীর কক্ষগুলির ভাগ গণনা করতে dplyr ব্যবহার করুন।
  6. মূল 1kmx1km গ্রিডের সাথে লিঙ্ক করে 5 ধাপের ভিত্তিতে একটি নতুন রাস্টার তৈরি করুন।

এই পদ্ধতিটি আমার পিসিতে খুব দ্রুত এবং মেমরির সমস্যা ছাড়াই চলে I আমি যখন 15 মিলি গ্রিড সেলগুলি 300mx300m এ ল্যান্ড কভার মানচিত্রে চেষ্টা করেছি।

আমি ধরে নিয়েছি যে কেউ রাস্টার ডেটার সাথে অনিয়মিত আকারের সাথে একটি বহুভুজ ফাইল একত্রিত করতে চায় তবে উপরের পদ্ধতিরটিও কাজ করবে। সম্ভবত, রাস্টারাইজ (রাস্টার সম্ভবত ধীর) বা gdal_rasterize ব্যবহার করে একটি বহুভুজ ফাইলটিকে সরাসরি 300mx300 গ্রিডে রাস্টারাইজেশনের মাধ্যমে পদক্ষেপ 1 এবং 2 টি একত্রিত করা যেতে পারে। আমার ক্ষেত্রে আমারও পুনরায় প্রজেক্ট করা দরকার ছিল তাই আমি একই সাথে পুনরায় প্রজেক্ট এবং অসমত উভয়কেই জিডালওয়ার্প ব্যবহার করেছি।


0

একটি বড় মোজাইক (50 কে x 50 কে) থেকে বহুভুজের ভিতরে মানগুলি বের করতে আমাকে এই একই সমস্যার মুখোমুখি হতে হবে। আমার বহুভুজের মাত্র 4 পয়েন্ট রয়েছে। আমি যে দ্রুততম পদ্ধতিটি পেয়েছি তা হ'ল cropবহুভুজকে আবদ্ধ করে মোজাইক করা, বহুভুজকে 2 ত্রিভুজ করে ত্রিভুজুলেট করা, তারপরে ত্রিভুজের বিন্দুগুলি খুঁজে পাওয়া যায় কিনা তা পরীক্ষা করুন (আমি খুঁজে পাওয়া দ্রুততম অ্যালগোরিদম)। extractফাংশনের সাথে তুলনা করুন , রান সময়টি 20 এস থেকে 0.5 এস-এ কমিয়ে আনা হয়েছে। যাইহোক, ফাংশনটি cropএখনও প্রতিটি বহুভুজ জন্য প্রায় 2 গুলি প্রয়োজন।

দুঃখিত, আমি সম্পূর্ণ পুনরুত্পাদনযোগ্য উদাহরণ প্রদান করতে পারি না। নীচের আর কোডগুলিতে ইনপুট ফাইল অন্তর্ভুক্ত নয়।

এই পদ্ধতিটি কেবল সহজ বহুভুজগুলির জন্য কাজ করছে।

par_dsm <- function(i, image_tif_name, field_plys2) {
    library(raster)
    image_tif <- raster(image_tif_name)
    coor <- field_plys2@polygons[[i]]@Polygons[[1]]@coords
    ext <- extent(c(min(coor[,1]), max(coor[,1]), min(coor[,2]), max(coor[,2])))

    extract2 <- function(u, v, us, vs) {
        u1 <- us[2]  - us[1]
        u2 <- us[3]  - us[2]
        u3 <- us[1]  - us[3]
        v1 <- vs[1]  - vs[2]
        v2 <- vs[2]  - vs[3]
        v3 <- vs[3]  - vs[1]
        uv1 <- vs[2] * us[1] - vs[1] * us[2]
        uv2 <- vs[3] * us[2] - vs[2] * us[3]
        uv3 <- vs[1] * us[3] - vs[3] * us[1]

        s1 <- v * u1 + u * v1 + uv1
        s2 <- v * u2 + u * v2 + uv2
        s3 <- v * u3 + u * v3 + uv3
        pos <- s1 * s2 > 0 & s2 * s3 > 0
        pos 
    }

    system.time({
        plot_rect <- crop(image_tif, ext, snap ='out')
        system.time({
        cell_idx <- cellFromXY(plot_rect, coor[seq(1,4),])
        row_idx <- rowFromCell(plot_rect, cell_idx)
        col_idx <- colFromCell(plot_rect, cell_idx)

        rect_idx <- expand.grid(lapply(rev(dim(plot_rect)[1:2]), function(x) seq(length.out = x)))

        pixel_idx1 <- extract2(
            rect_idx[,2], rect_idx[,1], 
            row_idx[c(1,2,3)], col_idx[c(1,2,3)])
        pixel_idx2 <- extract2(
            rect_idx[,2], rect_idx[,1], 
            row_idx[c(1,4,3)], col_idx[c(1,4,3)])
        pixel_idx <- pixel_idx1 | pixel_idx2
        })
    })
    mean(values(plot_rect)[pixel_idx])
}

# field_plys2: An object of polygons
# image_taf_name: file name of mosaic file
library(snowfall)
sfInit(cpus = 14, parallel = TRUE)
system.time(plot_dsm <- sfLapply(
    seq(along = field_plys2), par_dsm, image_tif_name, field_plys2))
sfStop()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.