Çokgenler için raster istatistikleri nasıl hesaplanır?


14

bir vektör katmanının poligonu başına raster noktalarının (çoklu bant) toplamlarını, ortalamalarını vb. nasıl hesaplayabilirim. Bunun "bölgesel istatistikler" olarak adlandırıldığı söylendi. İlk önce QGIS ile denedim.

Bunu yapmanın bir yolu var ama bu çok yavaş (raster vektöre dönüştür, ikinci vektör katmanıyla kesiş, geometri hesapla, sayıları dışa aktar, istatistikleri elektronik tablo veya başka bir programla hesapla, sonuçları tekrar içe aktar, sonsuza dek benim için alır 350.000 tarama noktası).

Ayrıca bana destan kullanmam konusunda ipucu verildi. Bunun "bölgesel istatistikleri" vardır, ancak bunlar bir vektör katmanındaki çokgenleri değil, bir raster bandındaki kategorileri temel alır. Bu yüzden bunu kullanmak için vektör katmanımı raster haline getirmek ve ardından istatistikleri hesaplamak zorunda kalacağım.

Bunu çözmenin yanlış yolu gibi görünüyor. 2 veya daha fazla çokgene ait raster noktalarını hesaba katmanın bir yolu olmaz, çünkü bunlar çokgen sınırıyla kesişir. Çokgen tabanlı istatistiklerin bunu yapabilmesi gerektiğini varsayıyorum, bu yüzden henüz doğru modülü bulamadığımı varsayıyorum.

Saga-gis'in gerçekten çok modülü var. Bu uygulama için hangisinin doğru olduğunu lütfen bana bildirin.


Rudivonstaden'in çözümünü deniyorum ve son iki komutu girince aşağıdaki hata mesajları görünüyor: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Geri izleme (en son çağrı son): Dosya "<input>" , satır 1, <module> AttributeError: 'module' nesnesinin 'analiz' özniteliği yok >>> zonalstats.calculateStatistics (None) Geri izleme (en son çağrı son olarak): "<input>" dosyası, satır 1, <modülünde > NameError: 'zonalstats' adı tanımlanmadı Komutların doğru olup olmadığını veya kullandığım tarama dosyasının doğru biçimde olup olmadığını merak ediyorum. Teşekkürler!
Dan Wolf

Merhaba Dan. Stackexchange bir forumdan biraz farklı çalışır. Amaç, sürekli bir tartışmadan ziyade bir Soru-Cevap türü etkileşime sahip olmaktır. Orijinal sorunun yanıtları bilmeniz gerekeni çözmezse, yorumlar bölümünde açıklama istemeniz veya yeni bir soru sormayı düşünmeniz gerekir.
Jay Guarneri

Yorumunuz için teşekkürler Dan. Cevabımda, düzeltilmesi gereken gerekli bir içe aktarma ifadesi eksikti.
rudivonstaden

Yanıtlar:


22

Aynı şeyi yapmak için uğraşıyordum, ama çeşitli nedenlerden ötürü QGIS kullanmaya kararlıyım. GRASS eklentisini ve ayrıca Sextante eklentisini kullanarak v.rast.stats kullanmayı denedim. İkinci yaklaşım başarısız oldu, çünkü istatistikleri daha sonra sileceği geçici bir vektör katmanına ekliyor gibi görünüyor. GRASS eklentisi çalıştı, ancak çakışan çokgenlerle ilgilenmiyor.

Biraz kazma yaptıktan sonra (gelecek vaat eden ZonalStats eklentisinin kaynağında), QGIS'in aslında API'de yerleşik bölgesel istatistik yöntemleri olduğunu ve bunların da Python bağlamaları olduğunu buldum. Yani sürece sadece aradığınız olarak count, sumve meansizin poligon özellikler için istatistikler, Python Konsolu (Eklentiler> Python Konsolu) şu anda çokgen nitelik tabloya istatistikleri eklemek için en kolay yoldur.

  1. İçindekiler'de raster katmanınızı seçin ve konsola aşağıdakileri yazın (raster katmanınızın kaynak dosya adını alır)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. Vektör katmanınızı seçin ve konsolda aşağıdaki komutu yürütün (vektör katmanının kendisini tutar)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. Konsolda aşağıdaki üç komutu yürütün (vektör katmanını ve tarama dosyasını QGIS'in yerleşik bölgesel istatistik hesaplayıcısına iletirler)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

Sonuçlar çokgen katmanında fazladan alanlar olarak eklenecektir.

Bölgesel İstatistikler

Yeni alanlara bir önek eklemek istiyorsanız (yalnızca toplam, ortalama ve sayım olarak kullanmak yerine), 3. adımdaki ilk komutu aşağıdakiyle değiştireceğinizi unutmayın ('zonal_' önek:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron

QGIS'de Bölgesel İstatistik eklentisi var, bu yüzden muhtemelen söz konusu komutları kendiniz yürütmenize gerek yok: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Acaba, neden maksimum ve minimum hesaplama imkanı yok? değerleri de.
matandked

Tekniğinizi kullandım ama bazı çokgenleri siler :(
niahoo

6

Sonunda buldum: Saga-GIS'de açık kategori-çokgenler ve veri ızgarası, daha sonra şekiller-> ızgara-> ızgara değeri-> çokgenler için ızgara istatistikleri



3

Bu sorun zaten bir süre önce çözülmüş gibi görünüyor, ancak son zamanlarda kendime bazı raster istatistiklerine ihtiyaç duyduğum için çorbama kaşığı ekleyeceğim.

Rudivonstaden tarafından tanımlanan QGIS metodolojisi bir cazibe gibi çalıştı, ipucu için teşekkürler. Ancak, benim durumumda ayrıca çokgenlerimdeki raster değerleri için min & max değerleri ve std'yi ve QGIS'te bulamadığım işlevleri bilmek istedim. Ben işlevi aracılığıyla bir çözüm buldu isectpolyrst içinde BOP'un bana oldukça hızlı hem de gerekli ve sadece istatistikler verdi CBS sorun 'with.This fonksiyonunu çözmek için benim favori olan.

PS. GME'nin talihsiz bir bağımlılığı var (ArcGIS). Bu nedenle, programın kendisi herkes tarafından ücretsiz olarak kullanılabilir olsa da, çalıştırmak için ArcGIS'e ihtiyacınız var. Ancak ArcGIS (herhangi bir lisans düzeyi) varsa, denemenizi öneririz.

DÜZENLE:

İstediğim istatistikleri aldım, ancak daha sonra gerçek sayılara baktıktan sonra biraz aceleyle sonuçlara atladığımı öğrendim. İstatistikleri alırsınız, evet, ancak bir rasterdeki ilk grup için. Dolayısıyla, 3 bantlı bir raster görüntüsüyle çalışırsanız istatistikler eksik olur. Orijinal yazımdaki kanal sayısını belirtmeliydim. Çok bantlı raster görüntülerle çalışıyorsanız, yukarıda önerilen stn gibi SAGA-GIS'i kullanmak en iyisidir.


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

varsayılan olarak sadece Say, Toplam ve Ortalama hesaplar ( Raster -> Zonal StatisticsQGIS Desktop'tan anlayabileceğiniz gibi, çok daha fazlasını yapabilir).

Örneğin, yalnızca kullanmak zorunda olduğunuz Ortalamayı hesaplamak istiyorsanız:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

tüm seçenekler için API'ya bakın .

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.