Конвертировать огромный XYZ CSV в GeoTIFF

11

У меня есть огромное количество данных в виде CSV , содержащие координаты UTM , как Xи Yи значение высоты в качестве Zинформации. Мне нужно преобразовать эти данные в DEM как GeoTIFF для дальнейшего анализа. В этом случае огромное количество означает 16 м. линии, с какой -то момент X, Yи в Zкаждой строке. Точки распределены равномерно, поэтому интерполяция не требуется; каждая точка просто должна быть преобразована в растровую ячейку.

Исходные данные пришли без разделителя, с фиксированной шириной столбца. Я уже понял, как преобразовать синтаксис файла, чтобы использовать разделитель вместо фиксированной ширины и исключить все пробелы, используя потоковый текстовый редактор sed . С этого момента , как правило , мой рабочий будет импортировать данные в ArcGIS, создав класс объектов , из X, Yи Zданных , а также в качестве второго шага, превращая точку шейп в GeoTIFF, используя точки в растровый инструмент. Однако файл, который у меня сейчас есть, слишком велик для этого процесса.

Вместо описанного выше рабочего процесса я искал эффективную альтернативу и обнаружил GDAL. Тем не менее, gdal_translateнаиболее близким поддерживаемым форматом, который я могу найти в списке поддерживаемых типов файлов, является сетка ASCII, но нет разделенных запятыми XYZ. Другая трудность заключается в том, что у меня есть UTM-координаты , в то время как в большинстве примеров используются координаты в десятичных градусах. Однако мне нужно оставаться в системе UTM (или, по крайней мере, мой выходной GeoTIFF должен быть в системе координат UTM).

Поэтому я ищу способ конвертировать CSV XYZ в GeoTIFF, используя GDAL , но до сих пор не смог найти примеров, касающихся именно этой проблемы. Я был бы очень рад за некоторые подсказки или даже примеры кода.

Arne
источник
Как вы думаете, почему метод GDAL будет более эффективным, чем метод Esri?
artwork21
Точный пример использования xyz-csv для tiff приведен в документации здесь: gdal.org/gdal_grid.html
Matte
Какой именно вопрос? Прямо сейчас ответ «да, вы можете использовать GDAL для преобразования». :}
bugmenot123
Вопрос в том, как применить преобразование. Комментарий Мэтта, кажется, дает решение - я попробую это.
Арне
Хорошо! Можете ли вы привести минимальный пример данных? Вы хотите получить ответ в GDAL или другие бесплатные инструменты (например, GMT) тоже подойдут?
bugmenot123

Ответы:

16

Вы можете сделать это с помощью GDAL, он напрямую поддерживает формат XYZ . Неважно, если ваши координаты UTM, gdal_translate выведет в той же системе координат.

Поэтому преобразовать в GeoTIFF так же просто, как:

gdal_translate test.xyz test.tif

Посмотрите документ GeoTIFF для параметров вывода (таких как сжатие) и документ gdal_translate для получения дополнительной информации об использовании. В частности, вы должны указать, что система координат с -a_srsпараметром.

-a_srs srs_def:

Переопределите проекцию для выходного файла. Srs_def может быть любой из обычных форм GDAL / OGR, заполнить WKT, PROJ.4, EPSG: n или файл, содержащий WKT.

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

Поддерживаются разделенные запятыми / пробелами и фиксированная ширина столбцов, с заголовком и без строки заголовка.

Поддерживаемые разделители столбцов: пробел, запятая, точка с запятой и табуляция.

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

Единственные ошибки, о которых я знаю, это:

  1. Открытие большого набора данных может быть медленным, поскольку драйвер должен сканировать весь файл, чтобы определить размер набора данных и пространственное разрешение; и
  2. Файл должен быть отсортирован правильно (по Y, затем по X).

    Ячейки с одинаковыми координатами Y должны быть расположены на последовательных линиях. Для того же значения координаты Y, строки в наборе данных должны быть организованы путем увеличения значений X. Однако значение координаты Y может увеличиваться или уменьшаться.

    $ 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...
    
user2856
источник
2
Я настоятельно рекомендую назначить CRS для вывода, чтобы прояснить, каковы координаты:-a_srs EPSG:12345
bugmenot123
1
Хороший вопрос @bugmenot
user2856