Konwertuj ogromny XYZ CSV na GeoTIFF

11

Mam ogromną ilość danych w postaci CSV zawierających współrzędne UTM jako Xi Yoraz wartość wysokości jako Zinformację. Muszę przekonwertować te dane do DEM jako GeoTIFF do dalszej analizy. W tym przypadku ogromna ilość oznacza 16 m. linie, z jednym punkcie X, Ya Zna linię. Punkty są równomiernie rozmieszczone, dlatego interpolacja nie jest potrzebna; każdy punkt wystarczy przekształcić w komórkę rastrową.

Oryginalne dane były dostarczane bez separatora, ze stałą szerokością kolumn. Już wymyśliłem, jak przekonwertować składnię pliku, aby użyć separatora zamiast stałych szerokości i wyeliminować wszystkie znaki spacji, używając edytora tekstu strumieniowego sed . Odtąd, normalnie mój workflow byłoby importować dane do ArcGIS tworząc klasę elementów z X, Yi Zdanych, jak i drugim etapie przekształcania punkt shapefile do GeoTIFF, korzystając z punktu do Raster narzędzia. Jednak plik, który mam obecnie, jest zdecydowanie za duży dla tego procesu.

Zamiast wyżej opisanego przepływu pracy szukałem wydajnej alternatywy i odkryłem GDAL. Jednak gdal_translatenajbliższym obsługiwanym formatem, jaki mogę znaleźć na liście obsługiwanych typów plików, jest siatka ASCII, ale XYZ nie jest oddzielony przecinkami. Inną trudnością jest to, że mam współrzędne UTM , podczas gdy większość przykładów wydaje się używać współrzędnych dziesiętnych. Muszę jednak pozostać w systemie UTM (a przynajmniej mój wynik GeoTIFF musi znajdować się w układzie współrzędnych UTM).

Dlatego szukam sposobu na konwersję CSV XYZ na GeoTIFF, używając GDAL , ale jak dotąd nie byłem w stanie znaleźć przykładów dotyczących tego dokładnie problemu. Byłbym bardzo szczęśliwy z powodu niektórych wskazówek, a nawet przykładów kodu.

Arne
źródło
Jak myślisz, dlaczego metoda GDAL byłaby bardziej wydajna niż metoda Esri?
artwork21
Dokładny przykład użycia xyz-csv dla tiff znajduje się w dokumentacji tutaj: gdal.org/gdal_grid.html
Matte
Jakie jest dokładnie pytanie? W tej chwili odpowiedź brzmi „tak, możesz użyć GDAL do konwersji”. :}
bugmenot123
Pytanie brzmi, jak zastosować konwersję. Komentarz Matte wydaje się stanowić rozwiązanie - spróbuję tego.
Arne,
Dobrze! Czy możesz podać minimalny przykładowy przypadek danych? Czy chcesz uzyskać odpowiedź w GDAL, czy inne bezpłatne narzędzia (np. GMT) również będą w porządku?
bugmenot123

Odpowiedzi:

16

Możesz to zrobić za pomocą GDAL, bezpośrednio obsługuje format XYZ . Nie ma znaczenia, czy twoje współrzędne są UTM, gdal_translate wyświetli w tym samym układzie współrzędnych.

Aby przekonwertować na GeoTIFF, wystarczy:

gdal_translate test.xyz test.tif

Przejrzyj dokument GeoTIFF, aby uzyskać informacje o opcjach wyjściowych (takich jak kompresja), i dokument gdal_translate, aby uzyskać więcej informacji o użyciu. W szczególności należy określić parametr układu współrzędnych za pomocą -a_srsparametru.

-a_srs srs_def:

Zastąp rzutowanie pliku wyjściowego. Srs_def może być dowolnym ze zwykłych formularzy GDAL / OGR, kompletnym WKT, PROJ.4, EPSG: n lub plikiem zawierającym WKT.

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

Obsługiwane są oddzielone przecinkami / spacjami i stałe szerokości kolumn, z wierszem nagłówka i bez niego.

Obsługiwane separatory kolumn to spacja, przecinek, średnik i tabulacje.

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

Jedyne mankamenty, o których jestem świadomy to:

  1. Otwarcie dużego zestawu danych może być powolne, ponieważ sterownik musi zeskanować cały plik, aby określić rozmiar zestawu danych i rozdzielczość przestrzenną; i
  2. Plik musi być poprawnie posortowany (według Y, a następnie X).

    Komórki o tych samych współrzędnych Y muszą być umieszczone w kolejnych liniach. W przypadku tej samej wartości współrzędnej Y linie w zestawie danych muszą być zorganizowane przez zwiększenie wartości X. Wartość współrzędnej Y może jednak wzrosnąć lub zmniejszyć.

    $ 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...
    
użytkownik2856
źródło
2
Zdecydowanie sugeruję przypisanie CRS do danych wyjściowych, aby wyjaśnić, jakie są współrzędne:-a_srs EPSG:12345
bugmenot123
1
Dobry punkt @bugmenot
user2856