Saya mengekstraksi area dan persen tutupan berbagai jenis penggunaan lahan dari raster berdasarkan beberapa ribu batas poligon. Saya telah menemukan bahwa fungsi ekstrak bekerja lebih cepat jika saya mengulangi setiap poligon dan memotong masing-masing lalu menutupi raster ke ukuran poligon tertentu. Meskipun demikian, ini sangat lambat, dan saya bertanya-tanya apakah ada yang punya saran untuk meningkatkan efisiensi dan kecepatan kode saya.
Satu-satunya hal yang saya temukan terkait dengan ini adalah tanggapan oleh Roger Bivand yang menyarankan menggunakan GDAL.open()
dan GDAL.close()
juga getRasterTable()
dan getRasterData()
. Saya melihat itu, tetapi memiliki masalah dengan gdal di masa lalu dan tidak cukup tahu untuk menerapkannya.
Contoh yang Dapat Diproduksi:
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)
Metode tercepat sejauh ini
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
Proses paralel
Pemrosesan paralel memotong waktu pengguna hingga setengahnya, tetapi meniadakan manfaatnya dengan menggandakan waktu sistem. Raster menggunakan ini untuk fungsi ekstrak, tetapi sayangnya tidak untuk fungsi crop atau mask. Sayangnya, ini meninggalkan jumlah total waktu berlalu yang sedikit lebih besar karena "menunggu" oleh "IO."
beginCluster( detectCores() -1) #use all but one core
jalankan kode pada banyak core:
user system elapsed
23.31 0.68 42.01
lalu akhiri cluster
endCluster()
Metode Lambat: Metode alternatif melakukan ekstrak langsung dari fungsi raster membutuhkan banyak waktu lebih lama, dan saya tidak yakin tentang manajemen data untuk memasukkannya ke dalam formulir yang saya inginkan:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14
Jawaban:
Saya akhirnya berhasil memperbaiki fungsi ini. Saya menemukan bahwa untuk tujuan saya, itu yang tercepat ke
rasterize()
poligon pertama dan menggunakannyagetValues()
sebagai gantinyaextract()
. Rasterisasi tidak jauh lebih cepat daripada kode asli untuk mentabulasi nilai raster dalam poligon kecil, tetapi bersinar ketika datang ke area poligon besar yang memiliki raster besar untuk dipangkas dan nilai diekstraksi. Saya juga menemukangetValues()
jauh lebih cepat daripadaextract()
fungsinya.Saya juga menemukan proses multi-core menggunakan
foreach()
.Saya harap ini berguna untuk orang lain yang menginginkan solusi R untuk mengekstraksi nilai raster dari hamparan poligon. Ini mirip dengan "Tabulasi Intersection" dari ArcGIS, yang tidak bekerja dengan baik untuk saya, mengembalikan output kosong setelah jam pemrosesan, seperti pengguna ini.
Inilah fungsinya:
Jadi untuk menggunakannya, sesuaikan
single@data$OWNER
agar sesuai dengan nama kolom poligon pengidentifikasi Anda (tebak yang dapat dibangun ke dalam fungsi ...) dan masukkan:sumber
getValues
jauh lebih cepat daripada yangextract
tampaknya tidak valid karena jika Anda menggunakanextract
Anda tidak harus melakukancrop
danrasterize
(ataumask
). Kode dalam pertanyaan awal melakukan keduanya, dan itu seharusnya tentang waktu pemrosesan ganda.Mempercepat penggalian raster (raster stack) dari titik, XY atau Polygon
Jawaban yang bagus Luke. Anda harus menjadi penyihir R! Berikut ini adalah tweak yang sangat kecil untuk menyederhanakan kode Anda (mungkin sedikit meningkatkan kinerja dalam beberapa kasus). Anda dapat menghindari beberapa operasi dengan menggunakan cellFromPolygon (atau cellFromXY untuk poin) dan kemudian klip dan getValues.
Ekstrak data poligon atau poin dari tumpukan raster ------------------------
sumber
Jika kehilangan dalam presisi overlay tidak terlalu penting - dengan asumsi tepat untuk memulainya - seseorang biasanya dapat mencapai kecepatan perhitungan zona yang jauh lebih besar dengan terlebih dahulu mengubah poligon menjadi raster. The
raster
paket berisizonal()
fungsi, yang harus bekerja dengan baik untuk tugas dimaksud. Namun, Anda selalu dapat mengelompokkan dua matriks dari dimensi yang sama menggunakan pengindeksan standar. Jika Anda harus memelihara poligon dan tidak keberatan dengan perangkat lunak SIG, QGIS sebenarnya harus lebih cepat pada statistik zona daripada ArcGIS atau ENVI-IDL.sumber
Saya juga berjuang dengan ini selama beberapa waktu, mencoba menghitung pangsa area kelas tutupan lahan dari peta grid ~ 300mx300m dalam grid ~ 1kmx1km. Yang terakhir adalah file poligon. Saya mencoba solusi multicore tetapi ini masih terlalu lambat untuk jumlah sel jaringan yang saya miliki. Sebaliknya saya:
Prosedur ini berjalan sangat cepat dan tanpa masalah memori pada pc saya, ketika saya mencobanya pada peta tutupan lahan dengan sel jaringan> 15 mill pada 300mx300m.
Saya menganggap pendekatan di atas juga akan berfungsi jika seseorang ingin menggabungkan file poligon dengan bentuk tidak teratur dengan data raster. Mungkin, seseorang dapat menggabungkan langkah 1 & 2 dengan langsung meraster file poligon ke grid 300mx300 menggunakan rasterize (raster mungkin lambat) atau gdal_rasterize. Dalam kasus saya, saya perlu memproyeksi ulang juga jadi saya menggunakan gdalwarp untuk memproyeksi dan memilah pada saat yang sama.
sumber
Saya harus menghadapi masalah yang sama untuk mengekstrak nilai di dalam poligon dari mosaik besar (50k x 50k). Poligon saya hanya memiliki 4 poin. Metode tercepat yang saya temukan adalah dengan
crop
mosaic menjadi terikat poligon, triangulasi poligon menjadi 2 segitiga, kemudian periksa apakah titik dalam segitiga (Algoritma tercepat yang saya temukan). Bandingkan denganextract
fungsi, run time dikurangi dari 20 detik menjadi 0,5 detik. Namun, fungsi inicrop
masih membutuhkan sekitar 2 detik untuk setiap poligon.Maaf saya tidak bisa memberikan contoh lengkap yang bisa direproduksi. Kode R di bawah ini tidak termasuk file input.
Metode ini hanya berfungsi untuk poligon sederhana.
sumber