GDAL kullanarak Python'da düzleştirme / enterpolasyon raster?


20

Python'da gelişiyorum ve rasterleri ve şekil dosyalarını manipüle etmek ve etkileşimde bulunmak için OSGEO'dan GDAL kullanıyorum.

Nokta özelliklerine sahip bir şekil dosyası almak ve yüzey rasterine enterpolasyon yapmak istiyorum. Şu anda nokta özelliğinden raster içine bir değer yakan 'RasterizeLayer' yöntemini kullanıyorum (tüm nodata değerleri ile ayarlanır) ancak tüm dokunulmamış pikselleri 'nodata' değeri olarak bırakır. Bu nedenle dama tahtası tipi bir raster bıraktım.

RasterizeLayer kullandıktan sonra ne var:

[Gdal.rasterizelayer kullanarak gelen taramalar]

Nihai bir ürün için ne istiyorum:

resim açıklamasını buraya girin

Aradığım işlevin arcgisscripting içe aktarma 'Spline_sa ()' olarak bilinir inanıyorum.

GDAL'in benzer bir işlevi var mı veya istediğim çıktıyı elde etmek için farklı bir yöntem var mı?

Yanıtlar:


18

NumPy ve Scipy'ye bir göz atacağım - scipy.interpolate.griddata işlevini kullanarak SciPy Yemek Kitabı'nda enterpolasyon noktası verilerinin iyi bir örneği var . Açıkçası bu, verilerin bir numpy dizisinde olmasını gerektirir;

  • GDAL python bağlarını kullanarak gdal.Dataset.ReadAsArray()bir raster kullanarak verilerinizi Python'a okuyabilirsiniz .
  • OGR ile, özellik katmanı boyunca döngü ve şekil dosyasından nokta verilerini ayıklamak (veya daha iyisi, GEOMETRY=AS_XYZ[ OGR CSV dosya biçimine bakın] kullanarak şekil dosyasını bir CSV'ye yazın ve csv'yi Python'a okuyun).

Izgaralı bir çıkışınız olduğunda, ortaya çıkan numpy dizisini bir raster'a yazmak için GDAL kullanabilirsiniz.

Son olarak, Scipy enterpolat kütüphanesinde şansınız yoksa her zaman scipy.ndimage'i de deneyebilirsiniz .


Yardım için teşekkürler! Scipy.interpolate.griddata yaklaşımına bir koşuşturma veriyorum. Sonuçlarımı geri göndereceğim.
Doug

1
Bu gönderiye geri dönmek için çok uzun sürdüğüm için özür dilerim. Yukarıdaki cevap temelde sorunumu çözmek için yaptığım şey. Bu nodata boşluklarını doldurmak için Scipy enterpolat kütüphanesini kullandım ve raster bandına geri yazdım. Yardımlarınız için teşekkürler çocuklar!
Doug

@Doug Endişelenme - iyileşmekten mutlu!
om_henners

1
Bu çözüm ne kadar hızlı? Her 100x100'ün bilinen değerinin olduğu 10k x 10k ızgara için kullanılabilir mi? Herhangi bir enterpolasyon ile karşılaştırıldığında inanılmaz hızlı gdal_fillnodata denedim ama çok seyrek noktalar için iyi çalışmıyor. Şu anda Saga'dan üçgenleme kullanıyorum ama orta diziler için çok yavaş ve büyük dizilerle başarısız oluyor.
Miro

12

GDAL ızgara API'sına bir göz atın . Bu Python bağlamaları maruz olup olmadığını bilmiyorum, ama değilse , alt süreç modülü üzerinden gdal_grid yardımcı programı çağırır .

GDAL ızgara API'sı yalnızca Ters Mesafe Ağırlığı, Hareketli Ortalama ve En Yakın Komşu kullanır, spline kullanmaz. Başka bir seçenek Scipy kullanmaktır .


1

Bu konu biraz eski ama skspatial denilen sklearn gelen KNN algoritmasını kullanan basit bir modül yazdım.

https://github.com/rosskush/skspatial

Geopandaları kullanarak bir şekil dosyasını içe aktarabilir ve bir sütun seçerseniz, rasterlere aktarılabilecek bir yüzeye enterpolasyon uygulayabilirsiniz. Çok basit ve muhtemelen bunu yapmanın en iyi yolu değil, ama her şeyi en azından saf python'da tutar.

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.