Openource GIS Çözümlerinde Çokgen Bir Bindirmeden Raster Değerleri Alın


16

İki katmanım var. Çok sayıda karo içeren bir çokgen şekilli katman ve bir colourmap'ta birçok kategoriye sahip CORINE 2006 arazi örtüsü içeren bir raster katmanı . Şekil katmanındaki her çokgen için raster katmanının her bir arazi örtüsü kategorisinin toplamını elde etmek istiyorum.

Örneğin, '2' kimliğine sahip bir çokgen var ve bu çokgen için bu gibi Öznitelikleri istiyorum (yüzde veya metrekare olarak):

  • Ekilebilir arazi:% 15
  • Orman:% 11
  • Sokaklar:% 2 (... ve benzeri)

Ben çim, qgis (işlev yok), destan (sadece her bir toplam değeri özetliyor) r (toplam toplamı) yapmaya çalıştım, ama hala hiçbir çözüm bulamadı. Çoğu eklenti (qgis'deki bölgesel istatistikler) yalnızca 0-1 raster katmanını destekler. v.rast.stats da yardım etmedi. İyi ve akıllı bir çözüme açığım !. Belki de yanlış bir yaklaşım kullandım ya da hatalar yaptım.

Arcgis'te bu görev oldukça kolay, eğer doğru hatırlıyorsam, ama hala günlük linux kullanıcısı için iyi bir çözüm eksik.

Bir debian linux sistemi çalıştırıyorum ve bu yüzden sadece bu işletim sistemi için programları kullanabilirsiniz.


EDIT: Bu soru hala çok sayıda görüş ve ziyaretçi var çünkü: Ayrıca raster katmanının toprak örtüsü hesaplamak için bir QGIS-eklentisi yazdım. Henüz çokgen bir bindirme kodlamadım, ama kesinlikle planlanmıştı. Eklentiyi burada bulun ve önce Scipy kütüphanesini yükleyin.


Kesinlikle R'de yapılabilir, bu sadece hangi işlevlerin çalışmasıyla ilgilidir. Her çokgeni rasterle üst üste bindirmeniz ve ardından "çerez kesimli" piksellerin bir özetini almak için table () yöntemini kullanmanız gerekir. Raster, rgdal ve rgeo paketleri faydalı olabilir. "R Mekansal Görev Görünümü"

emin, ama böyle bir özet nasıl alabilirim. Bir çokgen katmanını! İs.na (kaplama (Poly, Raster)) içeren bir raster katmanıyla kolayca kaplayabilirsiniz, ancak özü gibi komutlarla, yalnızca çerez kesimli pikseldeki toplam alanı hesaplayabilir ve farklı renk kategorilerinin farklı kategorilerini hesaplayabilirim . Ben rgeos bilmiyordum, ama api baktı ve bunu yapmak için hiçbir işlev bulamadı.
Curlew

GRW'deki r.univar'a bakın, bkz. Grasswiki.osgeo.org/wiki/Zonal_statistics
markusN

Selam! QGIS eklentisi yaptığınız için teşekkürler! Sadece eklentinin çöktüğünü belirtmek istedim (> 13000 çokgen). Görevin çökmemesi için ayrılması harika olurdu. Ve tüm sınıfları bir kerede ekleme seçeneğine sahip olmak harika olurdu (örneğin, öznitelik tablosu 2 yeni alan alır LandcoverID ve Landcover% her ikisinde de değerlerin bulunduğu bir CSV listesi bulunur) :)
Mfbaer

@Joran: Bunun bir hata olduğunu düşünüyorsanız, bunu bir yorumda yazmak yerine bir hata raporu oluşturun ( github.com/Martin-Jung/LecoS/issues ). Ayrıca 1) görevlerinizi serileştirmek veya toplu işlemek için eklenti işi değildir. Daha sonra küçük alt kümelerde çalıştırın. 2) Tabii. Eklenecek çok güzel şeyler olurdu. Kod açık kaynak kodlu, kodu çekinmeyin :)
Curlew

Yanıtlar:


13

Bir raster üzerinde bir SpatialPolygonsDataFrame'den (maptools: readShapeSpatial gibi bir şekil dosyasından okunabilen) çokgen özelliklerini yerleştirmek için 'özü' kullanın, sonra özetlemek için 'tablo' kullanın. Misal:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

İlk poligonum 542 pikseli, ikinci poligonum 958'i kapsıyor. Her birini özetleyebilirim:

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

Bu yüzden ilk çokgenim 26. sınıf 287 piksel ve 27. sınıf 255. piksel. Toplamı almak ve bölmek ve yüzde almak için 100 ile çarpmak kadar kolay.


Harika, çaba için çok teşekkürler. Bunu deneyeceğim ve geri rapor edeceğim :-)
Curlew

6

Rapor vermek istedim ve işte buradayım. Spacedman'ın çözümü harika çalıştı ve şeklimdeki her çokgen için tüm bilgileri verebildim. Birisi aynı sorunu varsa sadece, ben nasıl önce:

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

ne istediğinizi doğru bir şekilde anlarsam ve GRASS GIS veritabanınızda zaten 'mypolygonlayer' vektör katmanı ve raster katmanı 'corina' olduğunu varsayarsak:

Önce vektörü raster'e dönüştürürdüm. Kedi, çokgen başına bir benzersiz tanımlayıcıya sahip olmanızı sağlayacaktır. Benzersiz sayısal tanımlayıcıya sahip bir sütununuz varsa, bunun yerine bu sütunu kullanabilirsiniz. Etiket sütunu isteğe bağlıdır:

v.to.rast input = mypolygonlayer layer = 1 output = mypolygons use = cat labelcolumn = NameMappingUnit

Ardından istatistiklerinizi almak için r.stats komutunu çalıştırın:

r.stats -a-1 girişi = mikogogon, corina ayırıcı =; çıkış = / home / paulo / corinastats.csv

Son adım corinastats.csv dosyasını LibreOffice'de açmak ve pivot tablo oluşturmak veya çapraz tablonuzu oluşturmak için R'yi kullanmaktır.


3

Bu yazı oldukça eski biliyorum ama son zamanlarda aynı tür analiz yapmak için şapka ama R gibi programları indirmek benim iş bilgisayar üzerinde bir güçlük ve onay gerekiyor. Sadece QGis ve Excel ile kullanabileceğim bir yöntemi araştırdıktan uzun saatler sonra, bu yöntemin benim için en iyi işe yaradığını buldum ve aynı türdeki insanlara sunmak istedim.

  1. Çokgeni raster katmanına kırpın (Raster → çıkarma → kesme: giriş dosyası = raster katmanı, çıktı adını ve konumunu seçin, maske katmanını tıklayın, çokgeninizi seçin → tamam)

  2. Kesme katmanını çokgenleştirin (Raster → Dönüştürme → çokgenleme: girdi dosyası = klip katmanınız, çıktıyı kaydet → tamam)

  3. Piksel sayısını hesaplama (Yeni oluşturduğunuz şekil dosyasına tıklayın → alan hesaplayıcıyı açın: “yeni alan oluştur” seçeneğini işaretleyin ve alan adı ekleyin, İşlev = geometri → alan → tamam). Artık özellik tablonuzda piksel sayısını gösteren yeni bir sütununuz olmalıdır.

  4. Çokgen katmanını kaydet (Çokgen katmanını sağ tıklayın, farklı kaydet: format = DBF dosyası, farklı kaydet → tamam)

  5. Her habitat için piksel sayısını özetleme (başlangıç ​​excel, açık dosya, her sütun için şimdi bir başlık ekleyin, boş bir hücreyi tıklayın, DATA sekmesine gidin, birleştirin, toplamda olduğundan emin olun, "göz at ..." ın yanındaki kırmızı ok ve iki sütun seçin (başlıklar dahil), "ekle" yi tıklayın ve hem "Üst satır" hem de "sol sütun" kutularını işaretleyin → tamam)

  6. Benim gibi, analiz etmek için çokgeniniz varsa ve bunları aynı tabloda karşılaştırmanız gerekiyorsa, bu adım faydalı olacaktır. Yeni bir excel çalışma kitabında habitat sayılarınızı A sütununa (benim için 1 ila 48) listeleyin ve B ve C sütununa yeni birleştirdiğiniz iki sütunu (B'deki habitat ve C'deki piksel sayısı) yerleştirin. D1 hücresine aşağıdaki formülü yazın: = IFNA (INDEX (C: C; MAÇ (A2; B: B; 0)); "") ve son değerinize sürükleyin (veya sağ alt köşeye çift tıklayın) (eğer D48 hücresine kadar 48 habitatınız var). Piksel sayısı artık habitatınıza karşılık gelen hücrelerde ve bu işlemi tüm çokgenleriniz için tekrarlayabilirsiniz.


2

CORINE verilerini QGIS ( Raster> Dönüştürme> Poligonize ) kullanarak ve çokgenlerle birleştirmek için Birlik işlevini ( Vektör> Coğrafi İşleme Araçları> Birlik ) kullanarak vektör çokgen veri kümesine dönüştürmeye ne dersiniz ? Sonuçta elde edilen vektör veri kümesi, her çokgendeki her CORINE sınıfının alanlarını içerecektir.


bu öneri için teşekkürler. Henüz vektör birliği hakkında düşünmedim. Belki de R-işlem bir şekilde başarısız olursa bunu deneyeceğim.
Curlew

0

QGIS.

QGIS bagajında, ZonalStats'ın başka bir sürümü daha var, buna Zonal İstatistik denir.

Bu, ihtiyaç duyduğunuz işlevi yerine getirir.

İş akışına gelince, kaç rasteriniz olduğu konusunda net değilim veya sadece bir rasterde bantlar mı?


yorumunuz için teşekkürler, ancak Bölgesel İstatistikler sadece kategorisiz raster yiyor. Iam QGIS Trunk 1.9
Curlew

0

Yukarıdaki cevapların aksine, çokgenlerinizi rasterleştirmek ve iki çokgen veri kümesi yerine iki raster veri kümesiyle çalışmaktan daha iyi bir seçenek olduğunu iddia ediyorum. Bu çok daha az işleme yoğun ve sonuç olarak R'deki büyük rasterleri ve büyük çokgen dosyalarını işlemek için uygulanması kolay tek çözümdür.

Çokgenlerinizi raster verileriyle aynı ölçüde ve çözünürlükte rasterleştirdikten sonra, rasteriniz belleğe sığarsa (küçük / orta raster katmanları) veya her kategoriyi işlevle ikiye ayırabiliyorsanız uygun olan özet istatistikleri burada açıklayabilirsiniz. reclassve zonalher sınıf için istatistikleri hesaplamak . Burada bir fonksiyonun içine pikselleştirmeyi ve bölgesel istatistikleri içeriyor ve çok büyük veri setleri ile güzel çalışan bir çözümdür.

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.