Büyük XYZ CSV'yi GeoTIFF'ye Dönüştür


11

UTM koordinatları Xve CS olarak Ybir yükseklik değeri içeren CSV biçiminde çok miktarda veri var Z. Daha fazla analiz için bu verileri GeoTIFF olarak bir DEM dönüştürmek gerekiyor. Bu durumda, büyük miktarda 16 m anlamına gelir. çizgiler, bir nokta in ile X, Yve Zher satıra. Noktalar eşit olarak dağılmıştır, bu nedenle enterpolasyona gerek yoktur; her noktanın bir tarama hücresine dönüştürülmesi gerekir.

Orijinal veriler ayırıcı olmadan, sabit sütun genişliklerinde geldi. Ben zaten sabit metinler yerine bir ayırıcı kullanmak için dosya sözdizimi dönüştürmek ve akış metin editörü sed kullanarak tüm boşluk karakterleri ortadan kaldırmak için anladım . Buradan sonra normalde iş akışım X, Yve özelliklerinden bir özellik sınıfı oluşturarak Zve ikinci bir adım olarak, nokta şekil dosyasını Noktadan Tarama aracını kullanarak bir GeoTIFF'e dönüştürerek verileri ArcGIS'e aktarmak olacaktır . Ancak, şu anda sahip olduğum dosya bu işlem için çok büyük.

Yukarıda açıklanan iş akışı yerine etkili bir alternatif ve keşfedilmiş GDAL arıyordum. Ancak, gdal_translatedesteklenen dosya türü listesinde bulabildiğim en yakın desteklenen biçim ASCII ızgarası ancak virgülle ayrılmış XYZ yok. Başka bir zorluk, UTM koordinatlarına sahip olmam , çoğu örnekte ondalık derece koordinatları kullanılıyor gibi görünüyor. Ancak, UTM sistemi içinde kalmam gerekiyor (veya en azından çıktı GeoTIFF'imin bir UTM koordinat sisteminde olması gerekiyor).

Bu yüzden , GDAL kullanarak CSV XYZ'yi bir GeoTIFF'e dönüştürmenin bir yolunu arıyorum , ancak şu ana kadar bu sorunla ilgili örnekler bulamadı. Bazı ipuçları ve hatta kod örnekleri için çok mutlu olurum.


Neden GDAL yönteminin Esri yönteminden daha verimli olacağını düşünüyorsunuz?
artwork21

Bir tiff için xyz-csv kullanmanın kesin örneği, şu belgedeki belgeseldedir: gdal.org/gdal_grid.html
Mat

Soru tam olarak nedir? Şu anda cevap "evet, dönüştürmek için GDAL kullanabilirsiniz". :}
bugmenot123

Soru, dönüşümün nasıl uygulanacağıdır. Matte'nin yorumu çözüm sağlıyor gibi görünüyor - bunu deneyeceğim.
Arne

Tamam! Minimal bir veri örneği sağlayabilir misiniz? GDAL'de bir cevap mı istiyorsunuz yoksa diğer ücretsiz araçlar da (örneğin GMT) iyi mi?
bugmenot123

Yanıtlar:


16

Bunu GDAL kullanarak yapabilirsiniz, doğrudan XYZ formatını destekler . Koordinatlarınızın UTM olması önemli değildir, gdal_translate aynı koordinat sisteminde çıktı alır.

Yani GeoTIFF dönüştürmek kadar basit:

gdal_translate test.xyz test.tif

Bak GeoTIFF (sıkıştırma gibi) çıkış seçenekleri ve için doc gdal_translate fazla kullanım bilgi için doc. Özellikle, -a_srsparametre ile koordinat sisteminin ne olduğunu belirtmelisiniz .

-a_srs srs_def:

Çıktı dosyası için projeksiyonu geçersiz kılın. Srs_def, olağan GDAL / OGR formlarından herhangi biri, tam WKT, PROJ.4, EPSG: n veya WKT içeren bir dosya olabilir.

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

Üstbilgi satırı olan ve olmayan virgül / boşlukla ayrılmış ve sabit sütun genişlikleri desteklenir.

Desteklenen sütun ayırıcılar boşluk, virgül, noktalı virgül ve tablolardır.

$ 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...

Fark ettiğim tek şey:

  1. Sürücünün veri kümesi boyutunu ve uzamsal çözünürlüğü belirlemek için tüm dosyayı taraması gerektiğinden büyük bir veri kümesinin açılması yavaş olabilir; ve
  2. Dosyanın doğru bir şekilde sıralanması gerekir (önce Y sonra X).

    Aynı Y koordinatlarına sahip hücreler ardışık satırlara yerleştirilmelidir. Aynı Y koordinat değeri için, veri kümesindeki çizgiler X değerleri artırılarak düzenlenmelidir. Ancak Y koordinatının değeri artabilir veya azalabilir.

    $ 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...
    

2
Çok koordinatlar ne olduğunu açıklar için çıkışa bir CRS atama önermek istiyorum:-a_srs EPSG:12345
bugmenot123

1
@Bugmenot
user2856

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.