Hi all, I'm seeing a weird behaviour when converting vectors to rasters.
I have a polygons layer with a "value" field that has 2 decimal places. Converting it to raster with gdal_rasterize, the output is different if I choose it as Float32 or Float64. Here is a sample Project: https://cld.pt/dl/download/61894ebd-ade0-4f12-8aa3-1405ab2690cc/Float_Issue_Project.zip These are the commands I use (inside QGIS or in CLI): gdal_rasterize -l polygons -a value -tr 5.0 5.0 -a_nodata 0.0 -te 61738.6841 107228.3171 63464.9242 108429.7802 -ot Float32 -of GTiff D:\Testes\Float_Issue\polygons.gpkg D:/Testes/Float_Issue/polygons_rasterize_float32.tif Info: Name polygons_rasterize_float32 Path D:\Testes\Float_Issue\polygons_rasterize_float32.tif CRS EPSG:3763 - ETRS89 / Portugal TM06 - Projected Extent 61738.6840999999985797,107229.7801999999937834 : 63463.6840999999985797,108429.7801999999937834 Unit meters Width 345 Height 240 Data type Float32 - Thirty two bit floating point GDAL Driver Description GTiff GDAL Driver Metadata GeoTIFF Dataset Description D:\Testes\Float_Issue\polygons_rasterize_float32.tif Compression Band 1 STATISTICS_MAXIMUM=18537 STATISTICS_MEAN=3782.009546874 STATISTICS_MINIMUM=0.12999999523163 STATISTICS_STDDEV=7001.5216220675 STATISTICS_VALID_PERCENT=100 More information AREA_OR_POINT=Area Dimensions X: 345 Y: 240 Bands: 1 Origin 61738.7,108430 Pixel Size 5,-5 gdal_rasterize -l polygons -a value -tr 5.0 5.0 -a_nodata 0.0 -te 61738.6841 107228.3171 63464.9242 108429.7802 -ot Float64 -of GTiff D:\Testes\Float_Issue\polygons.gpkg D:/Testes/Float_Issue/polygons_rasterize_float64.tif Info: Name polygons_rasterize_float64 Path D:\Testes\Float_Issue\polygons_rasterize_float64.tif CRS EPSG:3763 - ETRS89 / Portugal TM06 - Projected Extent 61738.6840999999985797,107229.7801999999937834 : 63463.6840999999985797,108429.7801999999937834 Unit meters Width 345 Height 240 Data type Float64 - Sixty four bit floating point GDAL Driver Description GTiff GDAL Driver Metadata GeoTIFF Dataset Description D:/Testes/Float_Issue/polygons_rasterize_float64.tif Compression Band 1 STATISTICS_MAXIMUM=18537 STATISTICS_MEAN=3782.0095468599 STATISTICS_MINIMUM=0.13 STATISTICS_STDDEV=7001.521622075 STATISTICS_VALID_PERCENT=100 More information AREA_OR_POINT=Area Dimensions X: 345 Y: 240 Bands: 1 Origin 61738.7,108430 Pixel Size 5,-5 Looking at output in Value Tool: [image: image.jpeg] So, if the conversion is to a Float64 raster, pixel values have 2 decimal places, as the original data. If the conversion is to a Float32 raster, several pixel values assume 16 decimal places. Float32: 0.2199999988079071 Float64: 0.22 Original value: 0.22 Where this becomes a serious problem is when the values are used, for instance, for a reclassification process (with Reclassify by Table). Imagine these rules: [0 - 0.22[ = 1 [0.22 - 0.5[ = 2 >= 0.5 = 3 Pixels 0.22 are reclassified as 2; Pixels 0.2199999988079071 are reclassified as 1. [image: image.jpeg] So, Float64 gives the right results and Float32 gives wrong results. But how can this be explained, if all input values can fall within both a Float32 and Float64 range of values? Float32 -3.4E38 3.4E38 Float64 -1.79E308 1.79E308 Even more strange is, if instead of gdal_rasterize I use OTB Rasterization, no matter whether I use float (Float32) or double (Float64) dtype, I always get wrong results, just like gdal_rasterize with Float32. Should we change the default gdal output to Float64? Or is this a deeper issue? Thanks. Best regards, Pedro Venâncio
_______________________________________________ QGIS-Developer mailing list [email protected] List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
