Il modo migliore per ritagliare un file ECW di grandi dimensioni?


9

Sto provando a ritagliare un ECW di grandi dimensioni (dettagli sotto) ma il file raster è troppo grande per essere elaborato interamente.

Di seguito alcuni dettagli dell'ECW

Driver: Wavelet compressi ECW / ERDAS (SDK 5.0)

dimensione del file: 50 gb La dimensione è 450000, 565081 Dimensione pixel: 0,15 0,15 COLORSPACE = RGB COMPRESSION_RATE_TARGET = 9 VERSIONE = 2 Numero di bande: 4

L'area che voglio tagliare è all'incirca un 1/5 del file originale.

Ecco i metodi che ho provato senza successo:

  1. Ho usato Arcgis per salvare l'ecw in tiff / altri formati ... (Ho rinunciato rapidamente)

  2. Ha usato Qgis e il suo strumento di taglio ... la creazione del file è rimasta bloccata a circa il 40%.

  3. Usato gdal_translate da OSGeo4W con altre opzioni oltre a Qgis. (Ho provato che pensare che FORSE liberando un po 'di memoria non usando Qgis sarebbe il trucco)

  4. Ho usato gdal_retile pensando che avrei tagliato l'immagine a pezzi e afferrato quello che volevo. Il comando "gdal_retile -ps 10000 10000 -of ecw -tileIndex tile.shp -targetDir input.ecw Si è bloccato in modo ancora più rapido"

Qualcuno ha un'idea?

Per informazioni, eseguo Windows 7 64 bit su un i5-3470 3,2 Ghz con 16 GB di RAM.

Risposte:


5

Altre idee che potresti provare:

  1. gdal_translate con l'opzione -srcwin
  2. gdalwarp con -cutline e -crop_to_cutline e -wm switch. L'ultimo specifica la memoria per la memorizzazione nella cache e potrebbe farti superare i problemi che hai avuto utilizzando Clipper in QGIS (poiché questa è essenzialmente la stessa funzione)
  3. Calcolatrice raster QGIS che imposta l'estensione nell'area desiderata (più semplice del clipper).
  4. SAGA-> Griglia clip con poligono - chissà, potrebbe essere più efficiente in termini di memoria.
  5. Codifica una soluzione utilizzando Python e Numpy / SciPy per leggere in memoria solo un sottoinsieme del raster e salvarlo.

Ho il sospetto che fare un ritaglio molto semplice (sia con la calcolatrice raster che con l'interruttore -srcwin in gdal_translate) avrà meno fame di memoria rispetto al ritaglio con un poligono perché non hai controlli di geometria e conversioni. L'opzione 5 dovrebbe usare meno memoria poiché stai solo leggendo ciò di cui hai bisogno. Dai un'occhiata a questo tutorial se hai bisogno di un 'how to' (adatta il bit alla lettura e alla scrittura per blocco).


Grazie per la risposta! Proverò SAGA e se non funziona proverò con Numpy.
Blu,

5

Puoi tagliarlo direttamente con lo strumento gdal gdal_translate se conosci le coordinate della tua area di interesse, se è georeferenziato:

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

In caso contrario, utilizzare la -srswinbandiera in questo modo:

gdal_translate -srcwin [xoff yoff xsize ysize] infile outfile.

Un'altra opzione è quella di creare un raster "virtuale" (di pochi kilobyte) che punti al set di dati iniziale, con gdalbuildvrt .

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

Sfortunatamente avrai bisogno di un file georeferenziato per usare gdalbuildvrt.

Dopo aver registrato, non dimenticare di creare piramidi per una facile visualizzazione. Il seguente comando costruirà piramidi esterne compresse con l' algoritmo DEFLATE (lossless):

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

Come ultimo passo puoi calcolare anche le statistiche per evitare alcuni stupidi problemi con un particolare programma commerciale:

gdalinfo -stats outfile

Grazie per la risposta Nick. Ho creato un raster virtuale ed eseguito <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </code> Non sono troppo sicuro del motivo per cui ho visualizzato il seguente messaggio di errore ERRORE 1: Impossibile creare il file TIFF a causa della mancanza codec per DEFLATE. Creazione della panoramica non riuscita.
Blu,

Controlla i bug qgis-bug: 8782 e osge4w-bug: 382 se descrivono il tuo caso. Nel frattempo prova a creare le panoramiche senza alcun algoritmo di compressione o scegline un altro .
Nickves,

sembra che l'ho fatto funzionare in 2 passaggi: gdaladdo -ro input.vrt 2 4 8 16quindi gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE input.vrt 2 4 8 16. Il mio obiettivo è quello di finire con un ECW, quindi ho provato gdal_translate -of ECW input.vrt output.ecw e ho avuto il seguente errore:0ERROR 6: GDALDriver::Create() ... no create method implemented for this format.
Blue

@blue ECW è un formato proprietario e necessita di un trattamento speciale. Per prima cosa controlla se gdal può scrivere in ECW con gdalinfo --formats. Se non vedi l'ECW nell'elenco, prova queste istruzioni: faunalia.pt/node/438
nickves,

0

gdalwarpDovrebbe funzionare una semplice "clip" (so che questa è una domanda antica: 18 mesi IRL è come un'epoca geologica negli anni di Internet).

Ho un'antenna da 70 Gb (ECW, 94000x81000 pixel a 10 cm / px) e GDAL può arbitrariamente agganciarla con un file di forma usando

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

dalla riga di comando di Windows. (Mi rendo conto che questa soluzione richiede la creazione di uno shapefile per l'area di interesse di destinazione, ma non è la più grande sfida nota a GIS).

Per estrarre un blocco di dimensioni di un mezzo sobborgo richiede ~ 0,4 secondi; per dividere il file in quarti richiede 4 secondi. Le specifiche della mia macchina non sono molto diverse (i7-4770 a 3,4 GHz, 16 GB di RAM, Win7-64 Ultimate).


gdalwarp era già stato menzionato. Le informazioni sulle prestazioni e sull'esempio specifico della dimensione dell'immagine sono un'aggiunta gradita, ma in realtà questo dovrebbe essere un commento a gis.stackexchange.com/a/74450/108 (e fare una modifica suggerita con la riga di comando con la formattazione del codice sarebbe anche il benvenuto ; è più facile da leggere)
matt wilkie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.