J'ai une image de taille 1GB (.tif), avec la largeur et la hauteur 94000x71680. Je voudrais découper cette image en tuiles 20000X20000 afin de pouvoir les traiter.
Comment puis-je faire ceci?
J'ai une image de taille 1GB (.tif), avec la largeur et la hauteur 94000x71680. Je voudrais découper cette image en tuiles 20000X20000 afin de pouvoir les traiter.
Comment puis-je faire ceci?
Réponses:
Je propose deux solutions: la première utilisant QGIS, la seconde utilisant Python (GDAL).
Dans QGIS, vous pouvez créer une mosaïque VRT.
Veuillez suivre cette procédure (voir l'image ci-dessous):
Save As...
;Create VRT
option;OK
bouton.Par exemple, l'utilisation des paramètres de la boîte de dialogue ci-dessus sur cet exemple de raster (les paramètres que j'ai définis sont choisis au hasard):
générera 100 tuiles dans le chemin spécifié à l'étape 4:
En les chargeant dans QGIS, ils ressemblent à ceci:
Comme @ bugmenot123 l'a correctement dit dans les commentaires, le résultat semble étrange juste parce que le style de chaque image s'adapte à la distribution des valeurs par image (mais les données sont parfaitement fines).
Une autre façon d'obtenir le même résultat est l'utilisation de GDAL ( gdal_translate ).
En référence au même exemple décrit ci-dessus, vous pouvez utiliser ce 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)
Vous devez évidemment adapter les valeurs à votre cas spécifique.
Ne vous séparez pas
Vous gdalbuildvrt , vous pouvez créer des tuiles virtuelles qui n'utiliseront que quelques octets sur votre disque. Ensuite, vous pouvez utiliser la plupart des logiciels qui prendront vos vrt en entrée pour effectuer votre traitement.
Alternativement, je préfère chercher un outil qui peut fonctionner avec une image 1 Go plutôt que de diviser et de fusionner une image. Par exemple, OTB possède la plupart des capacités de traitement d'image standard (et parfois avancé) avec de grandes images. Vous pouvez encapsuler OTB pour Python ou l'exécuter à partir de QGIS ou à partir des lignes de commande.
À l'aide de l' outil Fractionner un raster , vous pouvez diviser un raster en mosaïques en fonction de quelques méthodes de division, notamment la taille de chaque mosaïque ou le nombre de mosaïques .
Voir également Fractionnement d'un raster dans ArcGIS
Une autre solution utilisant GDAL est l' outil 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
Pour plus d'informations, voir: http://www.gdal.org/gdal_retile.html