¿La mejor manera de recortar un archivo ECW de trama grande?

9

Estoy tratando de recortar un ECW grande (detalles a continuación) pero el archivo ráster es demasiado grande para ser procesado por completo.

Algunos detalles de la ECW a continuación

Controlador: Ondas comprimidas ECW / ERDAS (SDK 5.0)

tamaño de archivo: 50 gb El tamaño es 450000, 565081 Tamaño de píxel: 0.15 0.15 ESPACIO DE COLOR = RGB COMPRESSION_RATE_TARGET = 9 VERSION = 2 Número de bandas: 4

El área que quiero recortar es aproximadamente un 1/5 del archivo original.

Estos son los métodos que he probado sin éxito:

  1. Usé Arcgis para guardar el ecw en tiff / otros formatos ... (rápidamente me di por vencido)

  2. Usó Qgis y su herramienta de recorte ... la creación de archivos permaneció estancada en aproximadamente un 40%.

  3. Usó gdal_translate de OSGeo4W con otras opciones que Qgis. (Intenté pensar que QUIZÁS liberar un poco de memoria sin usar Qgis sería el truco)

  4. Usé gdal_retile pensando que cortaría la imagen en pedazos y agarraría la que quería. El comando "gdal_retile -ps 10000 10000 -of ecw -tileIndex tile.shp -targetDir input.ecw Esto se bloqueó aún más rápido"

¿Alguien tiene alguna idea?

Para obtener información, ejecuto Windows 7 64bits en un i5-3470 3.2Ghz con 16gb de ram.

Azul
fuente

Respuestas:

5

Otras ideas que puedes probar:

  1. gdal_translate con el modificador -srcwin
  2. gdalwarp con -cutline y -crop_to_cutline y -wm modificadores. El último especifica la memoria para el almacenamiento en caché y puede superar los problemas que tuvo al usar Clipper en QGIS (ya que esta es esencialmente la misma función)
  3. Calculadora ráster QGIS que establece la extensión en el área que desea (más simple que clipper).
  4. SAGA-> Clip grid con polígono: quién sabe, podría ser más eficiente en memoria.
  5. Codifique una solución usando Python y Numpy / SciPy para leer solo un subconjunto del ráster en la memoria y guárdelo.

Sospecho que hacer un recorte muy simple hasta cierto punto (ya sea con la calculadora ráster o el interruptor -srcwin en gdal_translate) requerirá menos memoria que recortar con un polígono porque no tiene controles de geometría y conversiones. La opción 5 debería usar la menor cantidad de memoria ya que solo está leyendo lo que necesita. Eche un vistazo a este tutorial si necesita un "cómo" (adaptar el bit de lectura y escritura por bloque).

MappaGnosis
fuente
¡Gracias por la respuesta! Probaré SAGA y, si no funciona, intentaré con Numpy.
Azul
5

Puede cortarlo directamente con la herramienta de gdal gdal_translate si conoce las coordenadas de su Área de interés, si está georreferenciada:

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

Si no usa la -srswinbandera así:

gdal_translate -srcwin [xoff yoff xsize ysize] archivo de salida.

Otra opción es construir un ráster 'virtual' (de unos pocos kilobytes) que apunte a su conjunto de datos inicial, con gdalbuildvrt .

gdalbuildvrt -te [xmin ymin xmax ymax] infile outfile.vrt

Desafortunadamente, necesitará un archivo georreferenciado para usar gdalbuildvrt.

Después de recortar, no olvides crear pirámides para una fácil visualización. El siguiente comando construirá pirámides externas comprimidas con el algoritmo DEFLATE (sin pérdida):

gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16

Como paso final, también puede calcular las estadísticas para evitar algunos problemas estúpidos con un programa comercial en particular:

gdalinfo -stats outfile
nickves
fuente
Gracias por la respuesta nickves. He creado un ráster virtual y ejecuté <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </code> No estoy muy seguro de por qué recibí el siguiente mensaje de error ERROR 1: No se puede crear el archivo TIFF debido a la falta códec para DEFLATE. La construcción general falló.
Azul
Compruebe los errores qgis-bug: 8782 y osge4w-bug: 382 si describen su caso. Mientras tanto, intente crear las vistas generales sin ningún algoritmo de compresión, o elija otro .
nickves
parece que lo tuve trabajando en 2 pasos: gdaladdo -ro input.vrt 2 4 8 16entonces gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE input.vrt 2 4 8 16. Mi objetivo es terminar con un ECW, así que intenté gdal_translate -of ECW input.vrt output.ecw y obtuve el siguiente error:0ERROR 6: GDALDriver::Create() ... no create method implemented for this format.
Azul
@blue ECW es un formato patentado y necesita un tratamiento especial. Compruebe primero si gdal puede escribir en ECW con gdalinfo --formats. Si no ve el ECW en la lista, pruebe esas instrucciones: faunalia.pt/node/438
nickves
0

Un "clip" directo gdalwarpdebería funcionar (sé que esta es una pregunta muy antigua: 18 meses IRL es como una época geológica en años de internet).

Tengo una antena de 70 Gb (ECW, 94000x81000 píxeles a 10 cm / px), y GDAL puede recortarla arbitrariamente con un shapefile usando

gdalwarp -cutline [clipfile] -crop_to_cutline [infile] [outfile]

en la línea de comandos de Windows. (Me doy cuenta de que esta solución requiere construir un archivo de forma para el área de interés objetivo, pero ese no es el mayor desafío conocido por SIG).

Para extraer un fragmento del tamaño de un suburbio se necesitan ~ 0.4 segundos; cortar el archivo en cuartos requiere 4 segundos. Las especificaciones de mi máquina no son dramáticamente diferentes (i7-4770 @ 3.4GHz, 16GB RAM, Win7-64 Ultimate).

GT.
fuente
gdalwarp ya fue mencionado. La información sobre el rendimiento y el tamaño de imagen de ejemplo específico es una adición bienvenida, pero realmente debería ser un comentario para gis.stackexchange.com/a/74450/108 (y también sería bienvenido hacer una edición sugerida con la línea de comando con formato de código) ; es más fácil de leer)
matt wilkie