Saya bertanya-tanya apakah ada cara untuk menemukan batas batas minimum untuk raster dengan nilai tertentu. Saya memotong raster dari gambar global dan sejauh ini ditetapkan sebagai tingkat global dengan banyak area NoData. Saya ingin menghapus area NoData dari raster ini dan hanya mempertahankan area yang mengandung piksel dari nilai tertentu. Bagaimana saya bisa melakukan ini?
Berikut adalah contoh saya: Saya ingin mengekstraksi nilai = 1 (Area biru) dan menggunakan luas area biru daripada seluruh dunia untuk diproses lebih lanjut.
arcgis-desktop
raster
extents
Terlihat
sumber
sumber
Jawaban:
JIKA saya telah memahami pertanyaan dengan benar, sepertinya Anda ingin tahu kotak batas minimum dari nilai-nilai yang tidak nol. Mungkin Anda bisa mengonversi raster ke poligon, pilih poligon yang Anda minati dan kemudian mengubahnya kembali menjadi raster. Anda kemudian dapat melihat nilai properti yang akan memberi Anda kotak pembatas minium.
sumber
Caranya adalah dengan menghitung batas data yang memiliki nilai. Mungkin cara tercepat, paling alami, dan paling umum untuk memperoleh ini adalah dengan ringkasan zonal: dengan menggunakan semua sel non-NoData untuk zona tersebut, zonal min dan maks kisi-kisi yang berisi koordinat X dan Y akan memberikan cakupan penuh.
ESRI terus mengubah cara penghitungan ini dapat dilakukan; misalnya, ekspresi bawaan untuk kisi-kisi koordinat dijatuhkan dengan ArcGIS 8 dan tampaknya tidak kembali. Hanya untuk bersenang-senang, inilah serangkaian perhitungan cepat dan sederhana yang akan melakukan pekerjaan apa pun yang terjadi.
Konversi kisi menjadi satu zona dengan menyamakannya dengan dirinya sendiri, seperti pada
"Kisi saya" == "Kisi saya"
Buat kisi indeks kolom dengan mengumpulkan aliran kisi konstan dengan nilai 1. (Indeks akan mulai dengan 0.) Jika diinginkan, kalikan ini dengan cellsize dan tambahkan koordinat x asal untuk mendapatkan kisi koordinat x " X "(ditampilkan di bawah).
Demikian pula, buat kisi indeks baris ( dan kemudian kisi koordinat y "Y") dengan mengakumulasi aliran kisi konstan dengan nilai 64.
Gunakan kisi zona dari langkah (1) untuk menghitung zonal min dan maks "X" dan "Y" : Anda sekarang memiliki tingkat yang diinginkan.
(Luasnya, seperti yang ditunjukkan dalam dua tabel statistik zonal, digambarkan oleh garis persegi panjang pada gambar ini. Kotak "I" adalah kotak zona yang diperoleh pada langkah (1).)
Untuk melangkah lebih jauh, Anda perlu mengekstraksi empat angka ini dari tabel output mereka dan menggunakannya untuk membatasi tingkat analisis. Menyalin kisi asli, dengan batas analisis terbatas di tempat, menyelesaikan tugas.
sumber
Berikut adalah versi metode @whubers untuk ArcGIS 10.1+ sebagai python toolbox (.pyt).
sumber
Saya telah menemukan solusi berbasis gdal dan numpy. Ini memecah matriks raster menjadi baris dan kolom dan menjatuhkan baris / kolom kosong. Dalam implementasi ini "kosong" adalah kurang dari 1, dan hanya raster band tunggal yang diperhitungkan.
(Saya menyadari ketika saya menulis bahwa pendekatan scanline ini hanya cocok untuk gambar dengan "kerah" nodata. Jika data Anda adalah pulau-pulau di lautan nol, ruang antar pulau akan turun juga, menyelipkan semuanya bersama-sama, dan benar-benar mengacaukan georeferencing .)
Bagian bisnis (perlu disempurnakan, tidak akan berfungsi apa adanya):
Dalam skrip lengkap:
Skripnya ada di simpanan kode saya di Github, jika tautannya berbunyi 404; folder ini sudah matang untuk reorganisasi.
sumber
MemoryError
Source raster (geo units): Origin (top left): 2519950.0001220703, 5520150.00012207 Pixel size (x,-y): 100.0, -100.0 Columns, rows : 42000, 43200 Traceback (most recent call last): File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 72, in <module> cropped_raster, cropped_transform = main(src_raster) File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 22, in main data = np.array(raster.ReadAsArray()) MemoryError
Untuk semua kekuatan analitisnya, ArcGIS tidak memiliki manipulasi raster dasar yang dapat Anda temukan dengan editor gambar desktop tradisional seperti GIMP . Itu mengharapkan bahwa Anda ingin menggunakan tingkat analisis yang sama untuk raster output Anda sebagai raster input Anda, kecuali Anda secara manual mengabaikan pengaturan lingkungan Extent Output . Karena ini adalah persis apa yang Anda cari, bukan ditetapkan, cara ArcGIS dalam melakukan sesuatu menghalangi.
Terlepas dari upaya terbaik saya, dan tanpa menggunakan pemrograman, saya tidak dapat menemukan cara untuk mendapatkan tingkat subset gambar yang Anda inginkan (tanpa konversi raster-ke-vektor yang secara komputasi boros).
Sebagai gantinya, saya menggunakan GIMP untuk memilih area biru menggunakan alat pilih oleh warna dan kemudian membalikkan seleksi, tekan Delete untuk menghapus sisa piksel, membalikkan seleksi lagi, memotong gambar untuk seleksi, dan akhirnya mengekspornya kembali ke PNG. GIMP menyimpannya sebagai gambar kedalaman 1-bit. Hasilnya di bawah ini:
Tentu saja, karena gambar sampel Anda tidak memiliki komponen referensi spasial, dan GIMP tidak sadar secara spasial, gambar keluaran kira-kira sama berguna dengan input sampel Anda. Anda perlu melakukan georeferensi agar dapat digunakan dalam analisis spasial.
sumber
Berikut adalah satu kemungkinan menggunakan SAGA GIS: http://permalink.gmane.org/gmane.comp.gis.gdal.devel/33021
Kemungkinan lain hanya menggunakan alat ArcGIS GP adalah membangun TIN dari raster Anda menggunakan Raster ke TIN , menghitung batasnya menggunakan Domain TIN , dan Klip raster Anda dengan batas (atau amplopnya menggunakan Fitur Envelope to Polygon ).
sumber