¿Dividir la imagen .tif en varios mosaicos? [cerrado]

13

Tengo una imagen de tamaño 1GB (.tif), con el ancho y la altura 94000x71680. Me gustaría fragmentar esta imagen en mosaicos 20000X20000 para poder procesarlos.

¿Cómo puedo hacer esto?

Anup Panwar
fuente
Anup, github.com/mapbox/rasterio te daría una gran variedad de tus datos de entrada. Puede dividir eso usando métodos numpy o scipy y guardar cada parte en un nuevo archivo fácilmente. ¿Calificaría tal solución? Si es así, debe decir cómo se deben tratar los "bits desiguales" (71680 no es divisible por 20000).
bugmenot123

Respuestas:

23

Propongo dos soluciones: la primera con QGIS, la segunda con Python (GDAL).


Solución usando QGIS

En QGIS puede crear un mosaico VRT.

Siga este procedimiento (vea la imagen a continuación):

  1. Cargue el ráster en el Panel de capas ;
  2. Haga clic derecho sobre él y elija Save As...;
  3. Marque la Create VRTopción;
  4. Elija la carpeta donde se guardarán sus resultados;
  5. Establezca la extensión (si desea trabajar en todo el ráster, no modifique nada);
  6. Elija si usa la resolución actual (sugiero dejarla como predeterminada);
  7. Establezca el número máximo de columnas y filas (en su caso, debe ser 20000 columnas y 2000 filas);
  8. Presione el OKbotón

ingrese la descripción de la imagen aquí

Por ejemplo, el uso de los parámetros en el cuadro de diálogo anterior en este ráster de muestra (los parámetros que configuro se eligen al azar):

ingrese la descripción de la imagen aquí

generará 100 mosaicos en la ruta especificada en el paso 4:

ingrese la descripción de la imagen aquí

Al cargarlos en QGIS, se ven así:

ingrese la descripción de la imagen aquí

Como @ bugmenot123 dijo correctamente en los comentarios, el resultado parece extraño solo porque el estilo de cada imagen se ajusta a la distribución de valores por imagen (pero los datos están perfectamente bien).


Solución usando Python (GDAL)

Otra forma de obtener el mismo resultado es el uso de GDAL ( gdal_translate ).

Con referencia al mismo ejemplo descrito anteriormente, puede usar este script:

import os, gdal

in_path = 'C:/Users/Marco/Desktop/'
input_filename = 'dtm_5.tif'

out_path = 'C:/Users/Marco/Desktop/output_folder/'
output_filename = 'tile_'

tile_size_x = 50
tile_size_y = 70

ds = gdal.Open(in_path + input_filename)
band = ds.GetRasterBand(1)
xsize = band.XSize
ysize = band.YSize

for i in range(0, xsize, tile_size_x):
    for j in range(0, ysize, tile_size_y):
        com_string = "gdal_translate -of GTIFF -srcwin " + str(i)+ ", " + str(j) + ", " + str(tile_size_x) + ", " + str(tile_size_y) + " " + str(in_path) + str(input_filename) + " " + str(out_path) + str(output_filename) + str(i) + "_" + str(j) + ".tif"
        os.system(com_string)

Obviamente, necesita adaptar los valores a su caso específico.

mgri
fuente
2
Solo un comentario rápido de que el ejemplo de cómo QGIS los hace parecer extraño solo porque el estilo se ajusta a la distribución de valores por imagen . Los datos están perfectamente bien :)
bugmenot123
Gracias, en primer lugar por su respuesta realmente útil, ¿pero quiero lograr el mismo resultado usando Python? ¿Me pueden ayudar en eso también? Porque es más manual que programático.
Anup Panwar
@ bugmenot123 Gracias, edito la respuesta con tu útil comentario.
mgri
@Anup Panwar, si encuentro una solución con PyQGIS, ¡editaré mi respuesta! =)
mgri
@HowToInQGIS Gracias, si no, si quieres un camino en Python que también ayude :)
Anup Panwar
5

No dividir

Usted gdalbuildvrt , puede crear mosaicos virtuales que solo usarán unos pocos bytes en su disco. Luego puede usar la mayoría de los softwares que tomarán sus vrt como entrada para realizar su procesamiento.

Alternativamente, prefiero buscar una herramienta que pueda funcionar con una imagen de 1 Gb que dividir y fusionar una imagen. Por ejemplo, OTB tiene la mayoría de las capacidades para el procesamiento de imágenes estándar (y a veces avanzado) con imágenes grandes. Puede ajustar OTB para Python o ejecutarlo desde QGIS o desde líneas de comando.

radouxju
fuente
2

Con la herramienta Dividir ráster , puede dividir un ráster en mosaicos según algunos métodos de división, incluido el tamaño de cada mosaico o el número de mosaicos .

Consulte también División de ráster en ArcGIS

Dylansq
fuente
2

Otra solución que usa GDAL es la herramienta gdal_retile.py :

mkdir image_tiles
gdal_retile.py -v -r bilinear -levels 1 -ps 20000 20000 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir image_tiles big_input_image.tif

Para obtener más información, consulte: http://www.gdal.org/gdal_retile.html

Saleika
fuente