Fractionner l'image .tif en plusieurs tuiles? [fermé]

13

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?

Anup Panwar
la source
Anup, github.com/mapbox/rasterio vous donnerait des tableaux numpy de vos données d'entrée. Vous pouvez diviser cela en utilisant des méthodes numpy ou scipy et enregistrer facilement chaque partie dans un nouveau fichier. Une telle solution serait-elle admissible? Si c'est le cas, vous devez dire comment les "bits inégaux" (71680 ne sont pas clairement divisibles par 20000) doivent être traités.
bugmenot123

Réponses:

23

Je propose deux solutions: la première utilisant QGIS, la seconde utilisant Python (GDAL).


Solution utilisant QGIS

Dans QGIS, vous pouvez créer une mosaïque VRT.

Veuillez suivre cette procédure (voir l'image ci-dessous):

  1. Chargez le raster dans le panneau Calques ;
  2. Faites un clic droit dessus et choisissez Save As...;
  3. Cochez l' Create VRToption;
  4. Choisissez le dossier où vos sorties seront enregistrées;
  5. Définissez l'étendue (si vous souhaitez travailler sur l'ensemble du raster, ne modifiez rien);
  6. Choisissez si vous utilisez la résolution actuelle (je suggère de la laisser par défaut);
  7. Définissez le nombre maximum de colonnes et de lignes (dans votre cas, il doit s'agir de 20000 colonnes et 2000 lignes);
  8. Appuyez sur le OKbouton.

entrez la description de l'image ici

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):

entrez la description de l'image ici

générera 100 tuiles dans le chemin spécifié à l'étape 4:

entrez la description de l'image ici

En les chargeant dans QGIS, ils ressemblent à ceci:

entrez la description de l'image ici

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).


Solution utilisant Python (GDAL)

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.

mgri
la source
2
Juste un petit commentaire que l'exemple de la façon dont QGIS les rend semble étrange juste parce que le style s'adapte à la distribution des valeurs par image . Les données sont parfaitement correctes :)
bugmenot123
Merci, tout d'abord pour votre réponse vraiment utile, mais je veux obtenir le même résultat en utilisant python? Pouvez-vous m'aider là-dessus aussi parce que c'est plus manuel que programmatique.
Anup Panwar
@ bugmenot123 Merci, je modifie la réponse avec votre commentaire utile.
mgri
@Anup Panwar, si je trouve une solution avec PyQGIS, je modifierai ma réponse! =)
mgri
@HowToInQGIS Merci, sinon si vous voulez un moyen en python qui vous aidera aussi :)
Anup Panwar
5

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.

radouxju
la source
2

À 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

Dylansq
la source
2

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

Saleika
la source