#!/usr/bin/env python3 import os import sys import mercantile from rio_tiler.io import COGReader from rio_tiler.utils import render # --------------------------------------------------------- # USO: # python3 make_tiles_rio_tiler.py input_rgb.tif tiles_out/ # # Genera tile PNG Terrain-RGB senza alterare i pixel. # Corretto per evitare buchi tra quadranti Copernicus. # --------------------------------------------------------- ZOOM_MIN = 5 ZOOM_MAX = 14 BUFFER = 0.001 # espansione per evitare tile mancanti ai bordi def generate_tiles(input_tif, output_dir): os.makedirs(output_dir, exist_ok=True) with COGReader(input_tif) as cog: for z in range(ZOOM_MIN, ZOOM_MAX + 1): print(f"== Zoom {z} ==") # Bounds originali del TIFF bounds = cog.bounds # Espansione per evitare buchi tra quadranti minx = bounds[0] - BUFFER miny = bounds[1] - BUFFER maxx = bounds[2] + BUFFER maxy = bounds[3] + BUFFER # Tile da generare tiles = list(mercantile.tiles(minx, miny, maxx, maxy, z)) for t in tiles: out_dir_zxy = os.path.join(output_dir, str(z), str(t.x)) os.makedirs(out_dir_zxy, exist_ok=True) out_path = os.path.join(out_dir_zxy, f"{t.y}.png") # Estrazione tile tile, mask = cog.tile(t.x, t.y, z, resampling_method="nearest") # Render PNG img = render(tile, mask=mask, img_format="PNG") with open(out_path, "wb") as f: f.write(img) print(f"Tile {z}/{t.x}/{t.y} generata") print("Completato.") if __name__ == "__main__": if len(sys.argv) != 3: print("Uso: python3 make_tiles_rio_tiler.py ") sys.exit(1) INPUT_TIF = sys.argv[1] OUTPUT_DIR = sys.argv[2] if not os.path.isfile(INPUT_TIF): print(f"Errore: file non trovato: {INPUT_TIF}") sys.exit(1) generate_tiles(INPUT_TIF, OUTPUT_DIR)