Convierte XYZ CSV enorme a GeoTIFF

11

Tengo una gran cantidad de datos en forma de CSV que contiene coordenadas UTM como Xy Yy un valor de elevación como Zinformación. Necesito convertir estos datos en un DEM como GeoTIFF para su posterior análisis. En este caso, una gran cantidad significa 16 m. líneas, con uno de cada punto X, Yy Zpor línea. Los puntos están distribuidos equitativamente, por lo tanto, no se necesita una interpolación; cada punto solo necesita convertirse en una celda ráster.

Los datos originales llegaron sin separador, con anchos de columna fijos. Ya descubrí cómo convertir la sintaxis del archivo para usar un separador en lugar de anchos fijos y eliminar todos los caracteres de espacio, usando el editor de texto de flujo sed . A partir de aquí, normalmente mi flujo de trabajo sería para importar los datos en ArcGIS mediante la creación de una clase de entidad de los X, Yy Zlos datos y como segundo paso, convirtiendo el shapefile de puntos en un GeoTIFF, utilizando el punto de la trama herramienta. Sin embargo, el archivo que tengo actualmente es demasiado grande para este proceso.

En lugar del flujo de trabajo descrito anteriormente, estaba buscando una alternativa eficiente y descubrí GDAL. Sin embargo, en gdal_translate, el formato compatible más cercano que puedo encontrar en la lista de tipos de archivos admitidos es la cuadrícula ASCII pero no XYZ separados por comas. Otra dificultad es que tengo coordenadas UTM , mientras que la mayoría de los ejemplos parecen usar coordenadas de grados decimales. Sin embargo, necesito permanecer dentro del sistema UTM (o al menos, mi salida GeoTIFF debe estar en un sistema de coordenadas UTM).

Entonces, estoy buscando una manera de convertir el CSV XYZ en un GeoTIFF, usando GDAL , pero hasta ahora no pude encontrar ejemplos que trataran este problema exacto. Estaría muy feliz por algunos consejos o incluso ejemplos de código.

Arne
fuente
¿Por qué crees que el método GDAL sería más eficiente que el método Esri?
artwork21
El ejemplo exacto de usar un xyz-csv para un tiff está en la documentación aquí: gdal.org/gdal_grid.html
Mate
Cuál es exactamente la pregunta? En este momento la respuesta es "sí, puedes usar GDAL para convertir". :}
bugmenot123
La pregunta es cómo aplicar la conversión. El comentario de Matte parece proporcionar la solución. Intentaré esto.
Arne
¡Okay! ¿Puede proporcionar un caso mínimo de datos de ejemplo? ¿Desea una respuesta en GDAL o otras herramientas gratuitas (por ejemplo, GMT) también estarían bien?
bugmenot123

Respuestas:

16

Puede hacer esto usando GDAL, es directamente compatible con el formato XYZ . No importa si sus coordenadas son UTM, gdal_translate saldrá en el mismo sistema de coordenadas.

Entonces, convertir a GeoTIFF es tan simple como:

gdal_translate test.xyz test.tif

Mire el documento GeoTIFF para ver las opciones de salida (como la compresión) y el documento gdal_translate para obtener más información sobre el uso. En particular, debe especificar cuál es el sistema de coordenadas con el -a_srsparámetro.

-a_srs srs_def:

Anule la proyección para el archivo de salida. El srs_def puede ser cualquiera de los formularios GDAL / OGR habituales, completar WKT, PROJ.4, EPSG: no un archivo que contenga el WKT.

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

Se admiten anchos de columna separados por coma / espacio y fijos, con y sin fila de encabezado.

Los separadores de columna admitidos son espacio, coma, punto y coma y tabulaciones.

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

Los únicos aspectos críticos yo sepa son:

  1. La apertura de un gran conjunto de datos puede ser lenta ya que el controlador debe escanear todo el archivo para determinar el tamaño del conjunto de datos y la resolución espacial; y
  2. El archivo tiene que estar ordenado correctamente (por Y, luego X).

    Las celdas con las mismas coordenadas Y deben colocarse en líneas consecutivas. Para un mismo valor de coordenada Y, las líneas en el conjunto de datos deben organizarse aumentando los valores de X. Sin embargo, el valor de la coordenada Y puede aumentar o disminuir.

    $ 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...
    
usuario2856
fuente
2
Sugeriría asignar un CRS a la salida para dejar en claro cuáles son las coordenadas:-a_srs EPSG:12345
bugmenot123
1
Buen punto @bugmenot
usuario2856