geotiff.py (1056B)
1 import numpy as np 2 from osgeo import gdal 3 4 NODATA = -9999.0 5 6 7 def write_geotiff(path, grid, array, crs_wkt): 8 """Write a north-up single-band Float32 GeoTIFF; NaN cells become NODATA.""" 9 data = np.where(np.isfinite(array), array, NODATA).astype(np.float32) 10 with gdal.ExceptionMgr(useExceptions=True): 11 try: 12 driver = gdal.GetDriverByName('GTiff') 13 dataset = driver.Create( 14 str(path), grid.nx, grid.ny, 1, gdal.GDT_Float32, 15 options=['COMPRESS=DEFLATE', 'PREDICTOR=3'], 16 ) 17 dataset.SetGeoTransform((grid.xmin, grid.cell_size, 0.0, 18 grid.ymax, 0.0, -grid.cell_size)) 19 if crs_wkt: 20 dataset.SetProjection(crs_wkt) 21 band = dataset.GetRasterBand(1) 22 band.SetNoDataValue(NODATA) 23 band.WriteArray(data) 24 band.FlushCache() 25 dataset = None 26 except RuntimeError as exc: 27 raise ValueError(f'failed to write GeoTIFF {path}: {exc}') from exc