Bagaimana cara menghitung jarak ke fitur dengan gdal_proximity?

28

Saya menggunakan gdal_proximity untuk menemukan jarak ke sungai utama terdekat di AS (48 negara bagian lebih rendah). Saya telah memproyeksikan arus jaringan NHD + ke Conus Albers (epsg: 5070), sungai terpilih dengan urutan aliran> 5, dan merasterisasi, membakar sungai sebanyak 255, tidak ada sungai sebanyak 0. Ini banyak baik-baik saja, tapi sekarang saya harus mencari jarak ke sungai terdekat untuk situs dalam jarak 50 km. File input pada resolusi 30m pada skala kontinental, jadi sangat besar, tetapi konversi harus berupa perintah gdal_proximity sederhana:

gdal_proximity.bat -values 255 -distunits GEO -maxdist 50000 -nodata -999 infile.tif outfile.tif -co COMPRESS=DEFLATE -co BIGTIFF=YES -co TILED=YES

Ini tampaknya -tidak berfungsi-, tetapi menghasilkan pola geometris yang aneh dalam output (lihat gambar). Data yang ada dalam output telah diproses dengan benar. Adakah yang bisa menyarankan mengapa begitu banyak output yang hilang?

Dekat dengan sungai

Sunting: Untuk menguji apakah ini disebabkan oleh salah satu parameter opsional, saya menjalankan gdal_proximity lagi dalam konfigurasi ini:

gdal_proximity.bat H:\data\tmp\NHDplus_network_flowline_SO6plus.tif H:/data/tmp/NHDplus_network_flowline_SO6plus_proximity.tif -values 255 -maxdist 50000 -of GTiff

Yang pada dasarnya menghasilkan hasil yang sama:

Kedekatan dengan sungai, tidak ada parameter opsional

Satu-satunya pemikiran saya adalah bahwa hal itu mungkin terkait dengan ukuran raster (~ 100 gb terkompresi. Sejauh yang saya tahu tidak ada batasan untuk ukuran BigTiff, tapi mungkin ada batas untuk apa yang bisa gdal dapat menganalisis secara efektif?

R Rhodes
sumber
1
apa yang terjadi jika Anda mematikan ubin = YA? Juga, apakah berfungsi jika Anda berubah dari GEO ke PIXEL? (Outputnya mungkin tidak cocok, tetapi mungkin mempersempit masalahnya)
Steven Kay
Terima kasih atas sarannya - telah menambahkan balasan ke pertanyaan awal.
R Rhodes
Berapa resolusi infile.tif Anda?
shahryar
2
Bisakah Anda mencoba membaca data menggunakan GDAL dalam batch (baris) dan melihat apakah masalahnya adalah data itu sendiri atau QGIS tidak dapat memvisualisasikannya? Langkah pertama untuk menemukan masalah ini adalah mereduksi tingkat spasial ke AOI sampel.
RutgerH

Jawaban:

3

Saya menduga Anda menekan batas memori di suatu tempat, mungkin ketika RAM habis dan OS dibuang ke file paging. Pantau sumber daya sistem Anda selama proses. Tidak jelas bagi saya mengapa hasil Anda terjadi di petak melengkung, tetapi pastikan Anda telah memproyeksikan (menyimpan) semua data ke dalam sistem koordinat yang sama.

Mari kita lihat tipe data numerik untuk membantu algoritma ini. Jaringan aliran raster hanya perlu berisi nilai-nilai biner, sehingga kami dapat menghemat sumber daya dengan menggunakan Bytetipe data raster. Bakar nilai 1 untuk aliran dan 0 untuk latar:

gdal_rasterize -l streams -burn 1 -tr 50 50 -a_nodata 0 -te -2339101 311625 2227004 3134200 -ot Byte -of GTiff streams.shp streams.tif

Selanjutnya, kedekatan yang kami minati adalah positif dan kurang dari atau sama dengan 50.000 m. Tipe data yang sesuai adalah bilangan bulat 16-bit yang tidak ditandatangani UInt16. Selanjutnya, jika kita mengatur 'tidak ada data' ke maks 65535 kita dapat mempertahankan nilai 0 untuk sel-sel aliran.

Jika perlu, Anda juga bisa mundur ke integer 8-bit tanpa tanda UInt8dan masih memiliki presisi kedekatan ~ 200m.

gdal_proximity.bat -srcband 1 -distunits GEO -values 1 -maxdist 50000 -nodata 65535 -ot UInt16 -of GTiff streams.tif proximity.tif

* Perhatikan bahwa saya telah menggunakan ukuran sel 50m. Kedekatan gdal_proximity mengkonsumsi ~ 20GB RAM dan memakan waktu ~ 5 menit pada mesin saya. Jika RAM Anda terbatas, pisahkan raster input ke dalam ukuran yang dapat dikelola, seperti yang dicatat orang lain.

gdal_proximity hasil

CrystallineEntity
sumber