I wanted an overlap of tiles for my application. Solved it by extending @user2856 to include 'overlap' as a parameter.
import os
import math
from itertools import product
import rasterio as rio
from rasterio import windows
def get_tiles(ds, tile_width, tile_height, overlap):
nols, nrows = ds.meta['width'], ds.meta['height']
xstep = tile_width - overlap
ystep = tile_height - overlap
for x in range(0, nols, xstep):
if x + tile_width > nols:
x = nols - tile_width
for y in range(0, nrows, ystep):
if y + tile_height > nrows:
y = nrows - tile_height
window = windows.Window(x, y, tile_width, tile_height)
transform = windows.transform(window, ds.transform)
yield window, transform
in_path = '/content/drive/MyDrive/Raster_Dataset_Airports/Spacenet'
input_filename = 'Minsk.tif'
out_path = 'Minsk_Tiles'
output_filename = 'Minsk_{}-{}.tif'
tile_width = 512
tile_height = 512
overlap = 128
with rio.open(os.path.join(in_path, input_filename)) as src:
metadata = src.meta.copy()
for window, transform in get_tiles(src, tile_width, tile_height, overlap):
metadata['transform'] = transform
metadata['width'], metadata['height'] = window.width, window.height
out_filepath = os.path.join(out_path, output_filename.format(window.col_off, window.row_off))
with rio.open(out_filepath, 'w', **metadata) as dst:
dst.write(src.read(window=window))
Here is a verification mechanism to compare with the GDAL CLI command.
!gdal_retile.py -ps 512 512 -overlap 128 -targetDir Minsk_Tiles2 \
/content/drive/MyDrive/Raster_Dataset_Airports/Spacenet/Minks.tif
Generate tile index files for both tiles folder and view them in GIS software.
!gdaltindex gdal_gen_index.shp /content/Minsk_Tiles/*.tif
!gdaltindex rasterio_gen_index.shp /content/Minsk_Tiles2 /*.tif
import geopandas as gpd
gdf_gdal=gpd.read_file('/content/gdal_gen_index.shp')
gdf_rasterio=gpd.read_file('/content/rasterio_gen_index.shp')