ArcGIS Spatial Analyst? Kullanılarak raster kümesi için ardışık piksel değerleri sayılıyor mu?


23

Spatial Analyst ile ArcGIS 10 kullanıyorum.

Her hücre için sadece her birinin 1 veya 0 içerdiği bir raster seti (toplamda 8) var. Her raster farklı veri değerlerini gösterir. Tartışmalar için 1 ile 8 arasındaki yıllara dikkat edin.

Tüm rasterleri bir araya getirebilirim ki bu da bana 0 ila 8 arasında değişen değerleri içeren son bir ızgara verir. Hücre, rasterlerin (her yıl) için sürekli olarak 1 olduğunu gösteren bir 8.

Her hücre için ardışık en fazla 1 sayısını öğrenmek istiyorum.

Örneğin, toplam ızgara, tek bir hücreye 5 sayısında bir değer kaydedebilir, ancak 8 ızgara üzerinde, hücrenin 3'e eşit ardışık en yüksek sayıya sahip olduğu anlamına gelir. sonra sıfırlar ve olanlar arasında salınmaya başladı.

Raster işleme becerilerim, vektör işleme becerilerim kadar sıcak değil ve ESRI yardım dosyasına iyi baktım ancak birinin raf jeo-işlem araçlarını kullanarak bunu nasıl başaracağını çözemedim?

Herhangi bir fikir?


1
Bu aslında çok güzel bir analiz. Her zamanki gibi, yapmaya çalıştığınız şeyi yapmanın birden fazla yolu var. Bence tüm kombinasyonları tekrarlamak için biraz programlama yapmanız gerekecek.
MLowry

1
Genel bir yorum (@MLowry tarafından bu açıklamadan ilham alınmıştır): Lütfen ilginç göründüğünde veya açıkça ifade edildiğinde soruları boşaltın . İyi sorular sitemizdeki her şeyi yönlendirir; lütfen onlara soranları ödüllendirmek için elimizden geleni yapalım!
whuber

Yanıtlar:


14

Bu yerel bir işlem olduğu için, tek bir hücre için nasıl yapılacağına bakalım: Harita Cebiri gerisini halledecek.

İlk not , rasterlerin sırasının önemli olduğunu açıkça belirtti. Bu nedenle, hücre toplamı gibi tek atış hücre istatistikleri bunu yapmaz.

Belirli bir hücrede 01110101 gibi bir sekansla karşılaşsaydık, bunu baştan sona ve

  1. Sıfırdan saymaya başlayın.

  2. Her 1 karşılaştığımızda sayımı arttır.

  3. Son sayıyı kaydettikten sonra her 0 karşılaştığımızda sayımı sıfırlayın .

  4. Sonunda, kaydedilen maksimum sayımı alın (son sayım dahil).

Adım 1, sabit bir sıfır ızgarası ile uygulanır. Adım 2 ve 3, karşılaştığımız şeye bağlıdır: bu nedenle şartlı bir işlemdir. 4. Adım açıkça yerel bir maksimumdur. Bunu daha sonra resmen şöyle kodlardık:

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

Bu, en çok ızgaralarınız olduğunda Python betiği ile yapılır, ancak sekiz ile döngüyü açmak ve adımları elle yazmak zahmetli değildir. Bu ufak bir problemi ortaya çıkarmaktadır: result=max(longest,count)raster işlemleriyle kodlanması zor bir tür "yan etki" dir. (Ancak, aşağıdaki ikinci çözümde gösterildiği gibi yapılabilir.) Aynı zamanda verimsizdir, çünkü her adımda ek bir hesaplama ekler. Bu nedenle, maxoperasyonu sona erdirmek amacıyla yaklaşımı biraz değiştirdik . Bu , her aşamada ayrı bir sayının kaydedilmesini gerektirir .

Bu süreçte de ilk adım için bir kısayol buldum. Bu, biraz uzun ve RAM yoğun olmasına rağmen, basit ve hızlı bir şekilde uygulanan adımları içeren aşağıdaki çözüme yol açar:

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")

Gerçek sözdizimi ArcMap sürümünüze göre değişir. (Örneğin, CellStatisticssürüm 10 için yeni, inanıyorum, ancak yerel bir maksimum işlem her zaman kullanılabilir.)

01110101 girişindeki örnekte, "sonuç *" ızgaralarının sırası, 0, 1, 2, 3, 0, 1, 0, 1 değerlerini içerir; bu nedenle, sonunda CellStatistics, en uzun dize uzunluğu 3 olacak 1 sayısı.

RAM azsa, çözüm, yürütme süresini yaklaşık iki katına çıkaracak şekilde, ara sonuçları tekrar kullanmak üzere değiştirilebilir:

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"]

01110101 girişli örnekte, ("temp", "sonuç") değerleri, ilk satırdan sonra (NoData, 0) ve her bir çift ("Con", "CellStatistics") işleminden sonra, değerler (1) olur. , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Bir kez daha nihai değer 3'tür.

Her iki çözümdeki normal Harita Cebir ifadeleri deseni, algoritmayı kodda bir döngü olarak nasıl kodlayacağınızı ve her yinelemeye uygun olarak dizinleri değiştireceğinizi gösterir.


Tip kodu bloğunda bir yazım hatası olabilir: count = count = 1 muhtemelen count = count + 1 olmalıdır
MLowry 19

1
@ ML Teşekkürler (güzel gözler!): Şimdi düzeltildi. Sözde kodu kesinlikle doğru yapmak zor; İnsan incelemesi hata bulmada gerçek bir varlıktır. Ayrıca, ArcGIS'deki çözümleri test etmemiş olmama rağmen, ilk çözümü R'de uyguladım, bu nedenle yaklaşımın doğru olduğuna dair bir güvencem var.
whuber

1
"whuber" yine sen bilen adamsın! Eğer bir otobüse binerseniz, Tanrı bize yardım eder! İlk Python yaklaşımınız benim düşündüğüm yöndeydi, ancak rasterlerle birisinin kanıtladığınız her şeyi çok daha yavaş yapabileceğini biliyorum. Kendinizi Britanya'da bulursanız, en iyi oda sıcaklığındaki düz bira biramızdan bir bardak satın almak bir onurdur! :)
Hornbydd

Sağol Duncan: ama Andy Harfoot'un mükemmel çözümünü kontrol et!
whuber

14

Sadece bunun hakkında sohbet edin ve giriş ızgaralarını ikili akış olarak ele alarak soruna yaklaşıp yaklaşamayacağınızı merak edin. Bu, dizileri için benzersiz bir özet tamsayı vermek için onları birleştirmenize izin verir - yani 01110101 = 117. Bu değer daha sonra ardışık maksimum 1 sayı verecek şekilde yeniden sınıflandırılabilir.

Sekiz ızgarayı birleştirmenin bir yolunu gösteren bir örnek:

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

Bu adımda, bitsel işlemler de basılabilir. Alternatif olarak, ardından bir alan hesaplamasının ardından birleştirmeyi kullanabilirsiniz . (Alan hesaplamasında öncekine benzer bir ifade bulunur.)

Yeniden sınıflandırma tablosu , 00000000B = 0 ile 11111111B = 255 arasındaki tüm değerler için maksimum çalışma uzunluğu sağlamalıdır. Sırayla, işte bunlar:

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

Bu yaklaşım ArcGIS'te yaklaşık 20 ızgara ile sınırlıdır: bundan daha fazlasını kullanmak, hantal bir nitelik tablosu oluşturabilir. ( Combineözellikle 20 ızgarayla sınırlıdır.)


Devasa +1: Bu çok iyi bir fikir. (Tek kısıtlama, 31'den fazla şebekenin dahil olması durumunda, kullanmakta olduğunuz bitlerin tükenmesidir.) Fikrinizi hafifletmek için başkalarına uygulamanın ne kadar kolay olduğunu görebilme özgürlüğünü kullandım.
whuber

3

Değerleri 0 ve 1'den 2 (1, 2, 8, 8, 16, 32) gücündeki değerlere değiştirmeyi düşündünüz mü? 8 ızgarayı birleştirdiğinizde, her bir hücre için size ardışık bilgi verecek benzersiz değerler elde edersiniz (yani: 3 değeri, 1'in değeri 1 ve 2'dir, ki burada 54 değeri 6 ila 8'dir).

Sadece bir düşünce


Bu tam olarak @Andy Harfoot'un birkaç saat önce önerdiği şey Ryan. :-)
whuber

Teşekkürler ve üzgünüm. Bunu tatilde telefonumda okudum.
Ryan Garnett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.