Thursday 28 November 2019

geotiff tiff - Splitting .tif image into several tiles?




I have an image of size 1GB (.tif), with the width and height 94000x71680. I would like to chunk this image into 20000X20000 tiles so that I can process them.


How can I do this?



Answer



I propose two solutions: the first one using QGIS, the second one using Python (GDAL).




Solution using QGIS


In QGIS you may create a VRT mosaic.


Please follow this procedure (see the image below):



  1. Load the raster in the Layers Panel;


  2. Right-click on it and choose Save As...;

  3. Check the Create VRT option;

  4. Choose the folder where your outputs will be saved;

  5. Set the extent (if you want to work on the whole raster, don't modify anything);

  6. Choose if using the current resolution (I suggest to leave it as default);

  7. Set the max number of columns and rows (in your case, it should be 20000 columns and 2000 rows);

  8. Press the OK button.


enter image description here


For example, the using of the parameters in the above dialog on this sample raster (the parameters I set are chosen randomly):



enter image description here


will generate 100 tiles in the path specified at step 4:


enter image description here


Loading them in QGIS, they look like this:


enter image description here


As @bugmenot123 correctly said in the comments, the result looks weird just because the style of each image fits itself to the distribution of values per image (but the data are perfectly fine).




Solution using Python (GDAL)


Another way to obtain the same result is the using of GDAL (gdal_translate).


With reference to the same example described above, you may use this 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)


You obviously need to adapt the values to your specific case.


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...