Konversikan XYZ CSV besar ke GeoTIFF

11

Saya memiliki sejumlah besar data dalam bentuk CSV yang berisi koordinat UTM sebagai Xdan Ydan nilai ketinggian sebagai Zinformasi. Saya perlu mengubah data ini menjadi DEM sebagai GeoTIFF untuk analisis lebih lanjut. Dalam hal ini, jumlah yang sangat besar berarti 16 m. garis, dengan satu titik X, Ydan Zper baris. Poin didistribusikan secara merata, oleh karena itu interpolasi tidak diperlukan; setiap titik hanya perlu dikonversi menjadi sel raster.

Data asli datang tanpa pemisah, dengan lebar kolom tetap. Saya sudah menemukan cara mengubah sintaks file untuk menggunakan pemisah alih-alih lebar tetap dan menghilangkan semua karakter spasi, menggunakan sed editor teks stream . Dari sini, biasanya alur kerja saya akan mengimpor data ke ArcGIS dengan membuat kelas fitur dari X, Ydan Zdata dan sebagai langkah kedua, mengubah titik shapefile menjadi GeoTIFF, menggunakan alat Point to Raster . Namun, file yang saya miliki saat ini terlalu besar untuk proses ini.

Alih-alih alur kerja yang dijelaskan di atas, saya mencari alternatif yang efisien dan menemukan GDAL. Namun, dalam gdal_translate, format terdekat yang didukung yang dapat saya temukan dalam daftar tipe file yang didukung, adalah kisi ASCII tetapi tidak ada XYZ yang dipisah koma. Kesulitan lain adalah, bahwa saya memiliki koordinat UTM , sementara sebagian besar contoh tampaknya menggunakan koordinat derajat desimal. Namun, saya harus tetap berada dalam sistem UTM (atau setidaknya, GeoTIFF keluaran saya harus dalam sistem koordinat UTM).

Jadi saya mencari cara untuk mengubah CSV XYZ menjadi GeoTIFF, menggunakan GDAL , tetapi sejauh ini tidak dapat menemukan contoh yang berhubungan dengan masalah yang tepat ini. Saya akan sangat senang untuk beberapa petunjuk atau bahkan contoh kode.

Arne
sumber
Menurut Anda mengapa metode GDAL akan lebih efisien daripada metode Esri?
artwork21
Contoh persis menggunakan xyz-csv untuk tiff ada di dokumentasi di sini: gdal.org/gdal_grid.html
Matte
Apa sebenarnya pertanyaannya? Saat ini jawabannya adalah "ya, Anda dapat menggunakan GDAL untuk mengonversi". :}
bugmenot123
Pertanyaannya adalah bagaimana menerapkan konversi. Komentar Matte sepertinya memberikan solusi - saya akan coba ini.
Arne
Baik! Bisakah Anda memberikan contoh kasus data minimal? Apakah Anda ingin jawaban dalam GDAL atau alat gratis lainnya (mis. GMT) juga boleh?
bugmenot123

Jawaban:

16

Anda dapat melakukan ini menggunakan GDAL, secara langsung mendukung format XYZ . Tidak masalah jika koordinat Anda adalah UTM, gdal_translate akan ditampilkan dalam sistem koordinat yang sama.

Jadi untuk mengkonversi ke GeoTIFF semudah:

gdal_translate test.xyz test.tif

Lihatlah dokumen GeoTIFF untuk opsi keluaran (seperti kompresi) dan dokumen gdal_translate untuk info penggunaan lebih lanjut. Secara khusus, Anda harus menentukan apa sistem koordinat dengan -a_srsparameter.

-a_srs srs_def:

Ganti proyeksi untuk file output. Srs_def dapat berupa formulir GDAL / OGR yang biasa, lengkapi WKT, PROJ.4, EPSG: n atau file yang berisi WKT.

gdal_translate -a_srs EPSG:12345 test.xyz test.tif

Dipisahkan koma / spasi dan lebar kolom tetap, dengan dan tanpa baris tajuk didukung.

Pemisah kolom yang didukung adalah spasi, koma, titik koma, dan tabulasi.

$ head -n 2 test_space.xyz 
x y z
146.360047076550984 -39.0631214488636616 0.627969205379486084

$ gdalinfo test_space.xyz
Driver: XYZ/ASCII Gridded XYZ
Files: test_space.xyz
Size is 84, 66
Coordinate System is `'
Origin = (146.359922066953317,-39.062997159090934)
Pixel Size = (0.000250019195332,-0.000248579545455)
Corner Coordinates:
Upper Left  ( 146.3599221, -39.0629972) 
Lower Left  ( 146.3599221, -39.0794034) 
Upper Right ( 146.3809237, -39.0629972) 
Lower Right ( 146.3809237, -39.0794034) 
Center      ( 146.3704229, -39.0712003) 
Band 1 Block=84x1 Type=Float32, ColorInterp=Undefined
  Min=0.336 Max=0.721 

$ head -n 2 test_commas.xyz 
x, y, z
146.360047076550984, -39.0631214488636616, 0.627969205379486084

$ gdalinfo test_commas.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

$ head -n 2 test_formatted.xyz
x                       y                       z
146.3600471            -39.06312145             0.627969205

$ gdalinfo test_formatted.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

Satu-satunya gotcha yang saya ketahui adalah:

  1. Pembukaan dataset besar bisa lambat karena driver harus memindai seluruh file untuk menentukan ukuran dataset dan resolusi spasial; dan
  2. File harus diurutkan dengan benar (oleh Y, lalu X).

    Sel dengan koordinat Y yang sama harus ditempatkan pada garis yang berurutan. Untuk nilai koordinat Y yang sama, garis-garis dalam dataset harus diatur dengan meningkatkan nilai X. Namun, nilai koordinat Y dapat meningkat atau menurun.

    $ head -n 5 test.csv
    x,y,z
    146.3707979,-39.07778764,0.491866767
    146.3787985,-39.07157315,0.614820838
    146.3637974,-39.07132457,0.555555582
    146.3630473,-39.07579901,0.481217861
    
    $ gdalinfo test.csv
    ERROR 1: Ungridded dataset: At line 3, too many stepY values
    gdalinfo failed - unable to open 'test.csv'.
    
    $ tail -n +2 test.csv| sort -n -t ',' -k2 -k1 > test_sorted.xyz
    
    $ head -n 5 test_sorted.xyz 
    146.3600471,-39.07927912,0.606096148
    146.3602971,-39.07927912,0.603663027
    146.3605471,-39.07927912,0.603663027
    146.3607971,-39.07927912,0.589507282
    146.3610472,-39.07927912,0.581049323
    
    $ gdalinfo test_sorted.xyz
    Driver: XYZ/ASCII Gridded XYZ
    etc...
pengguna2856
sumber
2
Saya akan sangat menyarankan menugaskan CRS ke output untuk memperjelas apa koordinatnya:-a_srs EPSG:12345
bugmenot123
1
Poin bagus @bugmenot
user2856