Cara tercepat untuk mengkonversi raster besar ke polyline menggunakan R atau Python?

14

Saya memiliki file raster besar (129600 x 64800 piksel) dengan badan air global (nilai 1 bit 0 dan 1) dan mencoba mengekstrak garis pantai samudera dan perairan daratan.

Saya sudah mencoba dengan ArcGIS dan QGIS untuk mengkonversi dari raster ke polyline, tetapi butuh waktu lama.

Adakah yang tahu cara yang lebih baik / lebih cepat (Python atau R) atau alat yang lebih baik untuk tugas ini?

Memperbarui

  • R: rasterToContour mungkin cepat dan tepat, tetapi jika Anda memiliki dataset yang sangat besar seperti milik saya (8.398.080.000 piksel), Anda memerlukan jumlah RAM yang sangat besar (lebih dari 16GB) atau Anda memaksa R untuk melakukan lebih banyak pemrosesan pada hard drive dan itu juga akan memakan waktu lama.
  • Python / GDAL: gdal_poligonize membuat poligon bukan polyline

Perbarui 2

  • R rasterToContour: rasterToContour tidak memberikan hasil yang diinginkan. Dibandingkan dengan ArcGIS (raster ke polygon diikuti oleh fitur untuk garis) itu tidak mengekstrak garis piksel yang tepat, seperti yang ditunjukkan dalam contoh di bawah ini.

hasil rasterToContour hasil rasterToContour

Hasil ArcGIS Hasil ArcGIS

PEMBARUAN 3

Python / GDAL: Saya telah menjalankan gdal_polygonize dari baris perintah terhadap ArcGIS pada dataset uji dan hasilnya sangat jelas:

  • gdal: 49 detik
  • ArcGIS: 1,84 detik
Generik Wevers
sumber
Apakah itu, lihat Pembaruan 3.
Generic Wevers
Bisakah Anda memberikan dataset uji tersebut, sehingga kami dapat melihat apakah alternatif yang diusulkan lebih cepat dan / atau menghasilkan hasil yang diperlukan?
Kersten
Untuk raster sebesar itu, Anda sebaiknya menggunakan C / C ++ dengan pustaka gdal.
Rodrigo

Jawaban:

7

Saya bekerja dengan R dan digunakan rasterToPolygonsdari rasterpaket di masa lalu, tapi sekarang saya lebih suka gdal_polygonizeRoleh John Baumgartner. Ini berdasarkan gdal_polygonize.pydan jauh lebih cepat. John Baumgartner menerbitkan kode dan memberikan contoh untuk digunakan di blog - nya .

Jika Anda terbiasa dengan python, Anda bisa menggunakan gdal_polygonize.pylangsung tentu saja.

Iris
sumber
1
Saya akan memberikannya saya coba. Terakhir kali saya menggunakan ArcGIS gdal_polygonize.py masih lebih cepat.
Generic Wevers
Saya tidak berharap bahwa ArcGis bisa lebih cepat dari itu. @Generic Militzer
Iris
Ah tunggu, ini akan membuat poligon tapi saya butuh polyline.
Generic Wevers
Jika Anda memasukkan data ke File Geodatabase, ini cukup cepat. Namun masih belum cukup cepat. Itu sebabnya saya mencari alternatif.
Generic Wevers
2
Itu tidak selalu masalah bahwa Anda mendapatkan poligon, Anda selalu dapat mengubahnya menjadi polyline (walaupun, dengan banyak itu tentu saja bisa memakan waktu cukup lama juga).
Martin
7

Untuk anak cucu, saya sudah sukses dengan stars::paket Runtuk melakukan operasi jenis ini dengan cepat.

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

masukkan deskripsi gambar di sini

plot(r)
plot(x, add = TRUE)

masukkan deskripsi gambar di sini

mikoontz
sumber
5

Coba rasterToContourdari paket raster .

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

masukkan deskripsi gambar di sini

Anda kemudian dapat dengan mudah menulis file ke folder lokal, misalnya sebagai 'ESRI Shapefile' (.shp), menggunakan kode di bawah ini. Lihat ogrDriversdari rgdal untuk mengetahui driver mana yang kompatibel dengan sistem Anda.

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")
fdetsch
sumber
Saya akan mencoba dan tetap menyilangkan jari itu tidak akan membunuh RAM saya. Meskipun saya memiliki 16GB, yang semoga cukup, R terkadang tidak begitu efisien dengan file raster besar. Tapi mari kita lihat.
Generic Wevers
Konversi entah bagaimana berhasil, tetapi saya tidak dapat memeriksa secara detail. Karena saya biasanya lebih ke pemrosesan data raster, dapatkah Anda memberi tahu saya cara mentransfer SpatialLineDataFrame ke dalam shapefile atau sesuatu yang sebanding. Saya sudah googled dan masih berjuang, karena saya tidak tahu nama layer (OGRwrite).
Generic Wevers
Haha, saya pasti mengerti maksud Anda. Lihat pembaruan di atas.
fdetsch
2
Petunjuk lain: coba set 'maxpixels' rasterToContourke beberapa nilai yang lebih tinggi, misalnya 1e + 9. Anda akan berakhir dengan detail lebih lanjut. Pengaturan default membuat garis kontur yang cukup umum.
fdetsch
1
Jika Anda tidak mau resampledata Anda menjadi resolusi spasial yang lebih kasar, satu-satunya solusi yang dapat saya bayangkan adalah dengan membagi data Anda menjadi beberapa ubin (mis. 16 sub-raster), kemudian lakukan rasterToContourpada setiap ubin secara terpisah dengan cara yang iteratif dan Akhirnya, mergeshapefile yang dihasilkan menjadi satu shapefile besar. Jika Anda tertarik, paket kelompok kerja kami Rsenal menawarkan fungsi yang dipanggil splitRasteruntuk membuat beberapa sub-raster dari satu raster besar.
fdetsch
2

Walaupun saya penggemar berat GDAL, alat poligonisasi terlalu lambat untuk aplikasi saya.

Alternatif cepat adalah gdal_trace_outlinedari skrip Dans GDAL yang juga memiliki lebih banyak opsi mengenai toleransi, donat, dll.

Seperti gdal_polygonizeini juga menghasilkan poligon yang perlu Anda konversi sesudahnya ogr2ogr -nlt MULTILINESTRING.

Kekurangannya adalah Anda perlu mengompilasinya sendiri, kecuali jika Anda menggunakan Linux atau Mac OsX System.

Kersten
sumber
Sayangnya gagal dengan pesan kesalahan: "Segmentasi fault (core dumped)". Saya menduga file saya terlalu besar atau lebih tepat akan menghasilkan terlalu banyak poligon kecil.
Generic Wevers