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?
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It only takes a minute to sign up.Sign up to join this community
I propose two solutions: the first one using QGIS, the second one using Python (GDAL).
In QGIS you may create a VRT mosaic.
Please follow this procedure (see the image below):
For example, the using of the parameters in the above dialog on this sample raster (the parameters I set are chosen randomly):
will generate 100 tiles in the path specified at step 4:
Loading them in QGIS, they look like this:
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).
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.
You gdalbuildvrt, you can create virtual tiles that will only use a few bytes on your disk. Then you can use most softwares that will take your vrt's as input to perform your processing.
Alternatively, I would rather look for a tool that can work with a 1Gb image than split and merge an image. For instance, OTB has most of the capabilities for standard (and sometimes advanced) image processing with large images. You can wrap OTB for Python or run it from QGIS or from command lines.
Using the Split Raster tool, you can split a raster into tiles based on a few methods of division including the size of each tile or the number of tiles.
Also see Splitting Raster in ArcGIS
Another solution using GDAL is the gdal_retile.py tool:
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
For more Information see: http://www.gdal.org/gdal_retile.html