Converta enormes XYZ CSV em GeoTIFF

11

I têm uma enorme quantidade de dados na forma de CSV contendo coordenadas UTM como Xe Ye um valor de elevação como Zinformação. Preciso converter esses dados em um DEM como GeoTIFF para análise posterior. Nesse caso, uma quantidade enorme significa 16 m. linhas, com um ponto em X, Ye Zpor linha. Os pontos são igualmente distribuídos, portanto, não é necessária uma interpolação; cada ponto só precisa ser convertido em uma célula raster.

Os dados originais vieram sem separador, com larguras de coluna fixas. Eu já descobri como converter a sintaxe do arquivo para usar um separador em vez de larguras fixas e eliminar todos os caracteres de espaço, usando o editor de texto stream sed . A partir daqui, normalmente meu trabalho seria para importar os dados para o ArcGIS através da criação de uma classe de recurso dos X, Ye Zde dados e, numa segunda etapa, a conversão do shapefile ponto em um GeoTIFF, usando o ponto de Raster ferramenta. No entanto, o arquivo que tenho atualmente é muito grande para esse processo.

Em vez do fluxo de trabalho descrito acima, eu estava procurando uma alternativa eficiente e descobri o GDAL. No entanto, em gdal_translate, o formato suportado mais próximo que posso encontrar na lista de tipos de arquivos suportados é a grade ASCII, mas sem XYZ separado por vírgula. Outra dificuldade é que eu tenho coordenadas UTM , enquanto a maioria dos exemplos parece usar coordenadas de graus decimais. No entanto, preciso permanecer no sistema UTM (ou pelo menos, minha saída GeoTIFF precisa estar em um sistema de coordenadas UTM).

Portanto, estou procurando uma maneira de converter o CSV XYZ em um GeoTIFF, usando GDAL , mas até agora não consegui encontrar exemplos que tratassem desse problema exato. Eu ficaria muito feliz por algumas dicas ou mesmo exemplos de código.

Arne
fonte
Por que você acha que o método GDAL seria mais eficiente que o método Esri?
artwork21
O exemplo exato de uso de um xyz-csv para um tiff está na documentação aqui: gdal.org/gdal_grid.html
Matte
Qual é exatamente a pergunta? No momento, a resposta é "sim, você pode usar o GDAL para converter". :}
bugmenot123
A questão é como aplicar a conversão. O comentário de Matte parece fornecer a solução - vou tentar isso.
Arne #
Está bem! Você pode fornecer um exemplo mínimo de caso de dados? Deseja uma resposta no GDAL ou outras ferramentas gratuitas (por exemplo, GMT) também estão ok?
bugmenot123

Respostas:

16

Você pode fazer isso usando GDAL, ele suporta diretamente o formato XYZ . Não importa se suas coordenadas são UTM, o gdal_translate será exibido no mesmo sistema de coordenadas.

Portanto, converter para GeoTIFF é tão simples quanto:

gdal_translate test.xyz test.tif

Veja o documento GeoTIFF para opções de saída (como compactação) e o documento gdal_translate para obter mais informações de uso. Em particular, você deve especificar qual é o sistema de coordenadas com o -a_srsparâmetro

-a_srs srs_def:

Substitua a projeção para o arquivo de saída. O srs_def pode ser qualquer um dos formulários GDAL / OGR usuais, WKT completo, PROJ.4, EPSG: n ou um arquivo contendo o WKT.

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

Larguras de coluna fixas e separadas por vírgula / espaço, com e sem uma linha de cabeçalho são suportadas.

Os separadores de coluna suportados são espaço, vírgula, ponto e vírgula e tabulações.

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

As únicas dicas que tenho conhecimento são:

  1. A abertura de um grande conjunto de dados pode ser lenta, pois o driver deve verificar o arquivo inteiro para determinar o tamanho e a resolução espacial do conjunto de dados; e
  2. O arquivo deve ser classificado corretamente (por Y e depois por X).

    Células com as mesmas coordenadas Y devem ser colocadas em linhas consecutivas. Para um mesmo valor de coordenada Y, as linhas no conjunto de dados devem ser organizadas aumentando os valores de X. O valor da coordenada Y pode aumentar ou diminuir no entanto.

    $ 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
fonte
2
Eu altamente sugerem a atribuição de um CRS para a saída para deixar claro o que as coordenadas são:-a_srs EPSG:12345
bugmenot123
1
Bom ponto @bugmenot
user2856