tilezen / joerd

Joerd can be used to download, merge and generate tiles from digital elevation data
MIT License
319 stars 49 forks source link

TIFF: Consider Float32 as the data type #80

Open mojodna opened 8 years ago

mojodna commented 8 years ago

GeoTIFFs are currently Int16, which means that the limit on vertical resolution is 1m. Higher resolution datasets (i.e. LiDAR) effectively lose resolution when converted to Int16. (NED is distributed as Float32, so this may already be occurring.)

zerebubuth commented 8 years ago

I did a highly unscientific single test case, but I think it's fairly representative of the whole; take NED13 n32w090, which is native Float32 data type:

The reduction in file size by almost an order of magnitude is a benefit that has to be weighed against the improvement in precision allowed by Float32. Just out of interest I tried:

Of course, the files will be larger, as we're retaining more of the information from the original. Sub-meter information can be very useful, for example in flat areas to avoid quantization artefacts appearing as false ridges, and many other uses. But its presence in the file comes at a cost for users who don't need that level of precision. It's not clear to me where the balance point lies.

Side note

Although it should be noted that not all of the data in the sub-meter range is information. For example, in tile 13/1326/3123 which, in the "terrarium" format, retains sub-meter information down to 1/256th of a meter in the blue band:

image

The "starburst" pattern is clearly an artefact, perhaps from merging multiple DEMs around a reference point. So although there's precision in NED, the accuracy should be carefully evaluated. LIDAR, likewise, has the capability of being incredibly precise, but care should be taken to avoid assumptions about its accuracy.

zerebubuth commented 8 years ago

@nvkelso, what do you think about the precision / file size trade-off? We could, of course, make a separate format for Int16 and Float32 GeoTiffs?

nvkelso commented 8 years ago

What about generating the Int16 files for most zooms, but switching to Float32 at zoom 14/15+?

mojodna commented 8 years ago

I suspect that that will confuse the GDAL WMS driver, since it treats the whole thing as a single source with overviews.

flitzi commented 8 years ago

No, I tried, GDAL is fine with specifying a pixel type that is different from the data pixel type. This works:

`

https://s3.amazonaws.com/elevation-tiles-prod/geotiff/${z}/${x}/${y}.tif -20037508.34 20037508.34 20037508.34 -20037508.34 14 1 1 top PROJCS["WGS_1984_Web_Mercator", GEOGCS["GCS_WGS_1984_Major_Auxiliary_Sphere", DATUM["WGS_1984_Major_Auxiliary_Sphere", SPHEROID["WGS_1984_Major_Auxiliary_Sphere",6378137.0,0.0]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["False_Easting",0.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian",0.0], PARAMETER["latitude_of_origin",0.0], UNIT["Meter",1.0], EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"], AUTHORITY["EPSG","102113"]] 512 512 1 Float32 true

`

Regarding compression: Rounding the elevation values to one decimal for zoom 14, maybe 2 for zoom 15+ will decrease size quite a bit. I think this would be the better solution than switching to cm and int32.

mojodna commented 8 years ago

@flitzi different pixel types at varying zooms? That's fantastic.