Menghaluskan / menginterpolasi raster dengan Python menggunakan GDAL?

20

Saya mengembangkan Python dan menggunakan GDAL dari OSGEO untuk memanipulasi dan berinteraksi dengan raster dan shapefile.

Saya ingin mengambil shapefile yang memiliki fitur titik dan menyisipkannya ke dalam raster permukaan. Saat ini saya menggunakan metode 'RasterizeLayer' yang membakar nilai dari fitur titik ke dalam raster (yang diatur dengan semua nilai nodata) tetapi meninggalkan semua piksel yang tidak tersentuh sebagai nilai 'nodata'. Karena itu saya pergi dengan raster jenis kotak-kotak.

Apa yang saya miliki setelah menggunakan RasterizeLayer:

[Raster dari menggunakan gdal.rasterizelayer]

Apa yang saya inginkan untuk produk akhir:

masukkan deskripsi gambar di sini

Saya percaya fungsi yang saya cari dikenal sebagai 'Spline_sa ()' dari impor arcgisscripting.

Apakah GDAL memiliki fungsi yang serupa, atau adakah metode yang berbeda untuk mendapatkan hasil yang saya inginkan?

Doug
sumber

Jawaban:

18

Saya akan melihat NumPy dan Scipy - ada contoh yang baik tentang interpolasi data titik dalam SciPy Cookbook menggunakan fungsi scipy.interpolate.griddata . Jelas ini mengharuskan Anda memiliki data dalam array yang numpy;

  • Menggunakan binding python GDAL Anda dapat membaca data Anda menggunakan Python gdal.Dataset.ReadAsArray()untuk raster.
  • Dengan OGR Anda akan mengulang melalui lapisan fitur dan mengekstraksi data titik dari shapefile (atau lebih baik lagi, menulis shapefile ke CSV menggunakan GEOMETRY=AS_XYZ[lihat format file OGR CSV] dan membaca csv ke Python).

Setelah Anda mendapatkan output grid Anda kemudian dapat menggunakan GDAL untuk menulis array numpy yang dihasilkan ke raster.

Terakhir, jika Anda tidak beruntung dengan pustaka interpolasi Scipy, Anda selalu bisa mencoba scipy . Gambar juga.

om_henners
sumber
Terima kasih untuk bantuannya! Saya memberikan pendekatan Scipy.interpolate.griddata berputar. Saya akan memposting kembali hasil saya.
Doug
1
Saya minta maaf untuk waktu yang lama untuk kembali ke pos ini. Jawaban di atas pada dasarnya adalah apa yang saya lakukan untuk menyelesaikan masalah saya. Saya menggunakan perpustakaan interpolasi Scipy untuk mengisi ruang-ruang nodata dan kemudian menulisnya kembali ke rasterband. Terima kasih atas bantuan kalian!
Doug
@Doug. Jangan khawatir - senang healp!
om_henners
1
Seberapa cepat solusi ini? Bisakah itu digunakan untuk grid 10k x 10k di mana hanya setiap 100x100 yang diketahui nilainya? Saya mencoba gdal_fillnodata yang sangat cepat dibandingkan dengan interpolasi tetapi tidak bekerja dengan baik untuk poin yang terlalu jarang. Saat ini saya menggunakan triangulasi dari Saga tetapi sangat lambat untuk array sedang dan gagal dengan yang besar.
Miro
12

Lihatlah API griding GDAL . Saya tidak tahu apakah itu diekspos dalam binding Python, tetapi jika tidak, Anda memanggil panggilan utilitas gdal_grid melalui modul subproses .

API grid GDAL hanya menggunakan Inverse Distance Weighting, Moving Average dan Nearest Neighbor, tidak menerapkan splines. Pilihan lain adalah menggunakan Scipy .

pengguna2856
sumber
1

Agak tua untuk utas ini tetapi saya telah menulis modul sederhana yang menggunakan algoritma KNN dari sklearn yang disebut skspatial.

https://github.com/rosskush/skspatial

Anda dapat mengimpor shapefile menggunakan geopanda dan memilih kolom dan itu akan menginterpolasi permukaan yang dapat diekspor ke raster. Ini sangat mendasar dan mungkin bukan cara terbaik untuk melakukannya, tetapi itu membuat semua python murni setidaknya.

rosskush
sumber