ฉันกำลังแยกพื้นที่และร้อยละของการใช้ที่ดินประเภทต่าง ๆ จากแรสเตอร์ตามขอบเขตหลายเหลี่ยมหลายพัน ฉันพบว่าฟังก์ชั่นการดึงข้อมูลทำงานได้เร็วขึ้นมากถ้าฉันวนซ้ำรูปหลายเหลี่ยมและครอบตัดแต่ละอันจากนั้นปิดบังแรสเตอร์ให้มีขนาดเท่ากับรูปหลายเหลี่ยมที่เฉพาะเจาะจง อย่างไรก็ตามมันค่อนข้างช้าและฉันสงสัยว่าใครมีคำแนะนำในการปรับปรุงประสิทธิภาพและความเร็วของรหัสของฉันหรือไม่
สิ่งเดียวที่ฉันได้พบที่เกี่ยวข้องกับการนี้คือการตอบสนองนี้โดยโรเจอร์ Bivand ที่แนะนำให้ใช้GDAL.open()
และGDAL.close()
เช่นเดียวกับและgetRasterTable()
getRasterData()
ฉันดูสิ่งเหล่านี้ แต่เคยมีปัญหากับ gdal ในอดีตและไม่รู้จักดีพอที่จะรู้วิธีนำไปใช้
ตัวอย่างที่ทำซ้ำได้:
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
การประมวลผลแบบขนาน
การประมวลผลแบบขนานจะลดเวลาของผู้ใช้ลงครึ่งหนึ่ง แต่ไม่ได้รับประโยชน์โดยทำให้เวลาของระบบเพิ่มขึ้นสองเท่า Raster ใช้ฟังก์ชันนี้สำหรับฟังก์ชันแยกข้อมูล แต่น่าเสียดายที่ไม่ใช่สำหรับฟังก์ชันครอบตัดหรือหน้ากาก น่าเสียดายที่นี่ทำให้เวลาทั้งหมดที่ผ่านไปมีขนาดใหญ่ขึ้นเล็กน้อยเนื่องจาก"IO"
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