Dividere l'immagine .tif in più tessere? [chiuso]


13

Ho un'immagine di dimensioni 1 GB (.tif), con larghezza e altezza 94000x71680. Vorrei suddividere questa immagine in riquadri 20000X20000 in modo da poterli elaborare.

Come posso fare questo?


Anup, github.com/mapbox/rasterio ti darebbe array numpy (s) dei tuoi dati di input. Puoi dividerlo usando i metodi numpy o scipy e salvare facilmente ogni parte in un nuovo file. Tale soluzione si qualificherebbe? In tal caso, è necessario dire come devono essere trattati i "bit irregolari" (71680 non divisibili in modo pulito per 20000).
bugmenot123

Risposte:


23

Propongo due soluzioni: la prima con QGIS, la seconda con Python (GDAL).


Soluzione utilizzando QGIS

In QGIS è possibile creare un mosaico VRT.

Si prega di seguire questa procedura (vedere l'immagine sotto):

  1. Carica il raster nel pannello Livelli ;
  2. Fai clic destro su di esso e scegli Save As...;
  3. Controlla l' Create VRTopzione;
  4. Scegli la cartella in cui verranno salvati i tuoi output;
  5. Imposta l'estensione (se vuoi lavorare sull'intero raster, non modificare nulla);
  6. Scegliere se utilizzare la risoluzione corrente (suggerisco di lasciarla come impostazione predefinita);
  7. Imposta il numero massimo di colonne e righe (nel tuo caso, dovrebbe essere 20000 colonne e 2000 righe);
  8. Premi il OKpulsante.

inserisci qui la descrizione dell'immagine

Ad esempio, l'utilizzo dei parametri nella finestra di dialogo sopra su questo esempio di raster (i parametri che ho impostato sono scelti in modo casuale):

inserisci qui la descrizione dell'immagine

genererà 100 tessere nel percorso specificato al passaggio 4:

inserisci qui la descrizione dell'immagine

Caricandoli in QGIS, sembrano così:

inserisci qui la descrizione dell'immagine

Come @ bugmenot123 ha detto correttamente nei commenti, il risultato sembra strano solo perché lo stile di ogni immagine si adatta alla distribuzione dei valori per immagine (ma i dati sono perfettamente a posto).


Soluzione che utilizza Python (GDAL)

Un altro modo per ottenere lo stesso risultato è l'uso di GDAL ( gdal_translate ).

Con riferimento allo stesso esempio sopra descritto, è possibile utilizzare questo 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)

Ovviamente devi adattare i valori al tuo caso specifico.


2
Un breve commento sul fatto che l'esempio di come li rende QGIS sembra strano solo perché lo stile si adatta alla distribuzione di valori per immagine . I dati sono perfettamente a posto :)
bugmenot123

Grazie, prima di tutto per la tua risposta davvero utile, ma voglio ottenere lo stesso risultato usando Python? Potete aiutarmi anche in questo, perché è più manuale piuttosto che programmatico.
Anup Panwar,

@ bugmenot123 Grazie, modifico la risposta con il tuo utile commento.
mgri

@Anup Panwar, se trovo una soluzione con PyQGIS, modificherò la mia risposta! =)
mgri

@HowToInQGIS Grazie, per il resto, se vuoi un modo in Python che possa aiutare anche :)
Anup Panwar,

5

Non dividere

È gdalbuildvrt , è possibile creare tessere virtuali che utilizzeranno solo pochi byte sul disco. Quindi è possibile utilizzare la maggior parte dei software che prenderanno il tuo VRT come input per eseguire l'elaborazione.

In alternativa, preferirei cercare uno strumento in grado di lavorare con un'immagine da 1 GB anziché dividere e unire un'immagine. Ad esempio, OTB ha la maggior parte delle funzionalità per l'elaborazione di immagini standard (e talvolta avanzate) con immagini di grandi dimensioni. Puoi avvolgere OTB per Python o eseguirlo da QGIS o dalle righe di comando.


2

Utilizzando lo strumento Dividi raster , è possibile dividere un raster in riquadri in base ad alcuni metodi di divisione tra cui la dimensione di ogni riquadro o il numero di riquadri .

Vedi anche Divisione raster in ArcGIS


2

Un'altra soluzione che utilizza GDAL è lo strumento 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

Per ulteriori informazioni, consultare: http://www.gdal.org/gdal_retile.html

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.