Menghitung nilai piksel berturut-turut untuk set raster menggunakan ArcGIS Spatial Analyst?

23

Saya menggunakan ArcGIS 10 dengan Spatial Analyst.

Saya memiliki satu set raster (total 8) yang hanya setiap berisi 1 atau 0 untuk setiap sel. Setiap raster mewakili nilai data tahun yang berbeda. Demi argumen tahun 1 hingga tahun 8.

Saya dapat menambahkan semua raster yang akan memberi saya kisi terakhir dengan nilai mulai dari 0 hingga 8. Angka 8 menunjukkan bahwa sel secara konstan 1 untuk himpunan raster (semua tahun).

Saya ingin mencari tahu untuk masing-masing sel nomor 1 terpanjang berturut-turut.

Jadi misalnya total grid dapat merekam untuk satu sel nilai katakanlah 5 tetapi lebih dari 8 grid sel itu memiliki jumlah berturut-turut 1 sama dengan 3. Atau cara lain untuk menyatakan ini adalah selama 3 tahun sel itu adalah 1 kemudian mulai berosilasi antara nol dan satu.

Keterampilan pemrosesan raster saya tidak sepanas keterampilan pemrosesan vektor saya dan saya telah melihat dengan baik pada file bantuan ESRI tapi saya tidak tahu bagaimana seseorang akan mencapai ini dengan menggunakan alat geo-processing dari rak?

Ada ide?

Hornbydd
sumber
1
Itu sebenarnya analisis yang sangat keren. Seperti biasa, ada lebih dari satu cara untuk melakukan apa yang Anda coba lakukan. Saya pikir Anda perlu melakukan beberapa pemrograman untuk mengulang semua kombinasi.
MLowry
1
Sebuah komentar umum (terinspirasi oleh komentar ini oleh @ MLowry): harap jawab pertanyaan kapan pun mereka terlihat menarik atau diartikulasikan dengan jelas. Pertanyaan-pertanyaan bagus mendorong semua yang ada di situs kami; tolong lakukan apa yang kami bisa untuk memberi penghargaan kepada mereka yang bertanya!
Whuber

Jawaban:

14

Karena ini adalah operasi lokal, mari kita cari tahu bagaimana melakukannya untuk sel tunggal: Peta Aljabar akan mengurus sisanya.

Catatan pertama bahwa urutan raster jelas penting. Karenanya, statistik sel yang dipotret sekali pakai, seperti jumlah sel, tidak akan melakukannya.

Jika kami menemukan urutan seperti 01110101 pada sel tertentu, kami akan memprosesnya dari awal hingga akhir dan

  1. Mulailah dengan hitungan nol.

  2. Bertambah hitungan setiap kali kita menjumpai 1.

  3. Setel ulang penghitungan setiap kali kami menemukan angka 0, setelah menyimpan penghitungan terakhir .

  4. Pada akhirnya, ambil jumlah maksimum yang disimpan (termasuk jumlah akhir).

Langkah 1 diimplementasikan dengan kisi nol konstan. Langkah 2 dan 3 bergantung pada apa yang kita temui: karena itu operasi bersyarat . Langkah 4 jelas adalah maksimum lokal. Kami akan mengkodekan ini, kemudian, sedikit lebih formal sebagai:

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

Itu paling baik dilakukan dengan skrip Python ketika Anda memiliki banyak kotak, tetapi dengan delapan itu tidak sulit untuk membuka gulungan dan menulis langkah-langkahnya dengan tangan. Ini mengungkapkan sedikit masalah: result=max(longest,count)ini adalah semacam "efek samping" yang sulit dikodekan dengan operasi raster. (Tapi itu bisa dilakukan, seperti yang ditunjukkan pada solusi kedua di bawah ini.) Ini juga tidak efisien, karena menambah perhitungan ekstra pada setiap langkah. Karena itu kami memodifikasi pendekatan sedikit, dengan tujuan untuk menunda maxoperasi sampai akhir. Ini akan membutuhkan menyimpan hitungan terpisah di setiap tahap.

Dalam menjalani proses ini saya juga menemukan jalan pintas untuk langkah pertama. Ini mengarah ke solusi berikut, yang walaupun sedikit panjang dan intensif-RAM, sederhana dan melibatkan langkah-langkah yang dijalankan dengan cepat:

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

Sintaks aktual bervariasi dengan versi ArcMap Anda. (Misalnya, saya CellStatisticsbaru mengenal versi 10, tetapi operasi maksimum lokal selalu tersedia.)

Dalam contoh dengan input 01110101, urutan kisi "hasil *" akan berisi nilai 0, 1, 2, 3, 0, 1, 0, 1, jadi pada akhirnya CellStatisticsakan mengembalikan 3, panjang string terpanjang dari 1

Jika RAM langka, solusinya dapat dimodifikasi untuk menggunakan kembali hasil antara, dengan biaya sekitar dua kali lipat waktu eksekusi:

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

Dalam contoh dengan input 01110101, nilai ("temp", "result") akan menjadi (NoData, 0) setelah baris pertama dan setelah setiap pasangan ("Con", "CellStatistics") operasi nilainya adalah (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Sekali lagi nilai akhir adalah 3.

Pola reguler ekspresi Peta Aljabar di salah satu solusi menunjukkan bagaimana kode algoritma sebagai loop dalam skrip, mengubah indeks yang sesuai dengan setiap iterasi.

whuber
sumber
Mungkin ada salah ketik di blok kode jenis: count = count = 1 mungkin harus count = count + 1
MLowry
1
@ ML Terima kasih (mata baik!): Sudah diperbaiki sekarang. Sulit untuk membuat kodesemu benar-benar benar; review manusia adalah aset nyata dalam menemukan kesalahan. Juga, meskipun saya tidak menguji solusi di ArcGIS, saya mengimplementasikan solusi pertama di R, jadi saya punya jaminan pendekatannya benar.
whuber
1
"Whuber" lagi-lagi kamu adalah pria yang tahu! Tuhan bantu kami semua jika kau ditabrak bus! Pendekatan Python awal Anda adalah arah yang saya pikirkan, tetapi saya tahu dengan raster, seseorang sering dapat melakukan segala hal yang jauh lebih licin yang telah Anda buktikan. Jika Anda menemukan diri Anda di Inggris, akan menjadi suatu kehormatan untuk membelikan Anda satu liter bir suhu kamar terbaik kami! :)
Hornbydd
Terima kasih, Duncan: tetapi periksa solusi luar biasa Andy Harfoot!
whuber
14

Hanya mengobrol tentang hal ini dan bertanya-tanya apakah Anda dapat mendekati masalah dengan memperlakukan kisi masukan sebagai aliran biner. Ini akan memungkinkan Anda untuk menggabungkan mereka untuk memberikan integer ringkasan unik untuk urutan - yaitu 01110101 = 117. Nilai ini kemudian dapat direklasifikasi untuk memberikan jumlah maksimum 1s berturut-turut.

Berikut ini contoh yang menunjukkan satu cara untuk menggabungkan delapan kisi:

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

Operasi bitwise juga dapat ditekan ke dalam layanan untuk langkah ini. Atau, Anda dapat menggunakan kombinasi diikuti oleh perhitungan bidang. (Perhitungan lapangan akan memiliki ekspresi yang mirip dengan yang sebelumnya.)

The meja reklasifikasi harus menyediakan panjang run max untuk semua nilai antara 00000000B = 0 dan 11111111B = 255. Dalam rangka, di sini mereka adalah:

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

Pendekatan ini terbatas pada sekitar 20 kisi di ArcGIS: menggunakan lebih dari ini dapat membuat tabel atribut yang sulit. ( Combinesecara khusus terbatas pada 20 kisi.)

Andy Harfoot
sumber
+1 besar: Ini adalah ide yang sangat bagus . (Satu-satunya batasan adalah ketika lebih dari 31 kisi terlibat, Anda akan kehabisan bit untuk digunakan.) Saya telah mengambil sedikit kebebasan untuk menyempurnakan ide Anda sehingga orang lain dapat melihat betapa mudahnya mengimplementasikannya.
whuber
3

Pernahkah Anda berpikir untuk mengubah nilai dari 0 dan 1 menjadi nilai dengan kekuatan 2 (1,2,4,8,16,32). Ketika Anda menggabungkan 8 kisi Anda akan mendapatkan nilai unik untuk setiap sel yang akan memberi Anda info berturut-turut (yaitu: nilai 3 berarti tahun 1 dan 2, di mana nilai 54 akan menjadi tahun 6 hingga 8).

Hanya pemikiran saja

Ryan Garnett
sumber
Inilah yang disarankan oleh @Andy Harfoot beberapa jam sebelumnya, Ryan. :-)
whuber
Terima kasih dan maaf Saya membaca ini di ponsel saya saat liburan.
Ryan Garnett