Conformance
terrio's results compared with GDAL's (and laspy's and PDAL's for point clouds) on real-world files: the files of scripts/fetch_test_data.sh (Natural Earth, USGS 3DEP, Sentinel-2, NASA ECOSTRESS and OPERA, OpenStreetMap and more, with copies GDAL derives in other formats), and synthetic rasters for the driver round trips. Each case is identical to the reference, within tolerance (the suite says which), or differs. Regenerate this page with:
cargo build --release
python scripts/conformance.py ../terrio-data --output docs/conformance.md
Generated on 2026-10-14 with terrio 0.1.1 (9e7f7f5), GDAL 3.12.2, PROJ 9.7.1, PDAL 2.9.3, laspy 2.7.0; the coordinate transformation suites on 2026-10-21 with terrio 0.3.2, GDAL 3.12.2 and PROJ 9.8.1, with 50 reference points of each kind per EPSG CRS.
Summary
| Suite | Reference | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|---|
| Dataset summaries and pixels | GDAL (gdalinfo, ogrinfo, Python bindings) |
64 | 64 | 0 | 0 |
| Vector conversions | GDAL reading terrio's output | 23 | 23 | 0 | 0 |
| Raster drivers | GDAL writing what terrio reads, and reading what terrio writes | 487 | 487 | 0 | 0 |
| Windowed and overview reads | GDAL reading the same windows | 186 | 186 | 0 | 0 |
| Raster operations | gdal_translate, gdalwarp, gdalbuildvrt, gdal_merge.py |
49 | 42 | 7 | 0 |
| Terrain analysis and raster algebra | gdaldem, gdal_calc.py, gdal_proximity.py, gdal_sieve.py |
131 | 129 | 2 | 0 |
| Vector operations | ogr2ogr, gdal_rasterize, gdal_polygonize.py |
51 | 51 | 0 | 0 |
| Arrow and GeoArrow | GDAL's Arrow streams, pyarrow, GeoPandas | 180 | 171 | 9 | 0 |
| GeoPackage updates and spatial filters | ogr2ogr, GDAL's validate_gpkg.py |
12 | 12 | 0 | 0 |
| Point clouds | laspy (every value), PDAL (headers, PLY, E57 and EPT, COPC and EPT queries, filters, grids, reprojection) and gdal_grid (TIN and nearest-neighbour grids) | 615 | 609 | 6 | 0 |
| Coordinate transformations | GDAL 3.12 and PROJ (gdaltransform) |
19,017 | 19,002 | 13 | 2 |
| Datum shift grids, geoid models and coordinate epochs | GDAL 3.12 and PROJ, with the same grids | 19,253 | 19,223 | 28 | 2 |
| All | 40,068 | 39,999 | 65 | 4 |
Dataset summaries and pixels
Every raster and vector file of the test data: size, type, CRS, geotransform, nodata, band statistics, layers, fields, feature counts and extents as GDAL reports them (numbers within 1e-6 relative, statistics within 1e-4), and every raster pixel exactly.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| GTiff | 15 | 15 | 0 | 0 |
| GeoJSON | 7 | 7 | 0 | 0 |
| FlatGeobuf | 2 | 2 | 0 | 0 |
| GPKG | 4 | 4 | 0 | 0 |
| KML | 3 | 3 | 0 | 0 |
| GML | 1 | 1 | 0 | 0 |
| MapInfo File | 3 | 3 | 0 | 0 |
| Parquet | 2 | 2 | 0 | 0 |
| GPX | 3 | 3 | 0 | 0 |
| CSV | 1 | 1 | 0 | 0 |
| OSM | 2 | 2 | 0 | 0 |
| AAIGrid | 1 | 1 | 0 | 0 |
| ENVI | 1 | 1 | 0 | 0 |
| HFA | 1 | 1 | 0 | 0 |
| JP2 | 2 | 2 | 0 | 0 |
| Zarr | 3 | 3 | 0 | 0 |
| zip archives | 3 | 3 | 0 | 0 |
| KMZ | 1 | 1 | 0 | 0 |
| EHdr | 1 | 1 | 0 | 0 |
| ERS | 1 | 1 | 0 | 0 |
| GSBG | 1 | 1 | 0 | 0 |
| netCDF | 2 | 2 | 0 | 0 |
| RST | 1 | 1 | 0 | 0 |
| SAGA | 1 | 1 | 0 | 0 |
| TopoJSON | 2 | 2 | 0 | 0 |
Vector conversions
A file converted by terrio convert into each format, then read by GDAL: feature counts, fields, CRS, extent and a sample of geometries and attribute values must match what GDAL reads from the original, but for the differences GDAL's reading of ogr2ogr's own conversion into that format has too (KML naming the name field Name, shapefiles truncating field names, MapInfo rounding coordinates to its grid, CSV files without a CRS).
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| GeoJSON | 2 | 2 | 0 | 0 |
| FlatGeobuf | 3 | 3 | 0 | 0 |
| GPKG | 4 | 4 | 0 | 0 |
| ESRI Shapefile | 2 | 2 | 0 | 0 |
| Parquet | 2 | 2 | 0 | 0 |
| CSV | 2 | 2 | 0 | 0 |
| GML | 1 | 1 | 0 | 0 |
| KML | 3 | 3 | 0 | 0 |
| MapInfo File | 2 | 2 | 0 | 0 |
| TopoJSON | 1 | 1 | 0 | 0 |
| GPX | 1 | 1 | 0 | 0 |
Raster drivers
Synthetic rasters of every data type a format holds (several bands, NaN and finite nodata, geographic, projected and user-defined CRSs). Read: GDAL writes, terrio reads; write: terrio writes, GDAL reads. Pixels, type, CRS and nodata must match exactly, geotransforms within 1e-9.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| GTiff (read) | 14 | 14 | 0 | 0 |
| GTiff (write) | 70 | 70 | 0 | 0 |
| COG (read) | 14 | 14 | 0 | 0 |
| COG (write) | 56 | 56 | 0 | 0 |
| AAIGrid (read) | 5 | 5 | 0 | 0 |
| AAIGrid (write) | 5 | 5 | 0 | 0 |
| EHdr (read) | 10 | 10 | 0 | 0 |
| EHdr (write) | 10 | 10 | 0 | 0 |
| ENVI (read) | 12 | 12 | 0 | 0 |
| ENVI (write) | 12 | 12 | 0 | 0 |
| GSBG (read) | 1 | 1 | 0 | 0 |
| GSBG (write) | 1 | 1 | 0 | 0 |
| SAGA (read) | 7 | 7 | 0 | 0 |
| SAGA (write) | 7 | 7 | 0 | 0 |
| RST (read) | 4 | 4 | 0 | 0 |
| RST (write) | 4 | 4 | 0 | 0 |
| ERS (read) | 11 | 11 | 0 | 0 |
| ERS (write) | 11 | 11 | 0 | 0 |
| HFA (read) | 11 | 11 | 0 | 0 |
| PNG (read) | 3 | 3 | 0 | 0 |
| PNG (write) | 3 | 3 | 0 | 0 |
| JPEG (read) | 2 | 2 | 0 | 0 |
| JPEG (write) | 2 | 2 | 0 | 0 |
| JP2OpenJPEG (read) | 5 | 5 | 0 | 0 |
| JP2OpenJPEG (write) | 5 | 5 | 0 | 0 |
| XYZ (read) | 5 | 5 | 0 | 0 |
| XYZ (write) | 5 | 5 | 0 | 0 |
| Zarr (read) | 65 | 65 | 0 | 0 |
| Zarr (write) | 65 | 65 | 0 | 0 |
| netCDF (read) | 26 | 26 | 0 | 0 |
| netCDF (write) | 26 | 26 | 0 | 0 |
| GPKG (read) | 5 | 5 | 0 | 0 |
| GPKG (write) | 5 | 5 | 0 | 0 |
Windowed and overview reads
Windows of every GeoTIFF of the test data, at full resolution and from each overview, read in place by terrio convert --srcwin --overview: pixels identical, geotransforms within 1e-9. Remote: the same on public Cloud Optimized GeoTIFFs over HTTP.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| GTiff local, full resolution | 60 | 60 | 0 | 0 |
| GTiff local, overviews | 104 | 104 | 0 | 0 |
| GTiff remote, headers | 4 | 4 | 0 | 0 |
| GTiff remote, full resolution | 4 | 4 | 0 | 0 |
| GTiff remote, overviews | 14 | 14 | 0 | 0 |
Raster operations
The outputs of the same command lines on real files: size, type, CRS and geotransform must match, then pixels are compared. Identical: every pixel equal. Within tolerance: every pixel within the case's tolerance (1e-2 for interpolating resamplings).
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| translate | 14 | 14 | 0 | 0 |
| warp | 28 | 21 | 7 | 0 |
| mosaic | 5 | 5 | 0 | 0 |
| read | 2 | 2 | 0 | 0 |
Cases that are not identical:
| Format or operation | Case | Result | Details |
|---|---|---|---|
| warp | warp DEM NAD83->UTM bilinear | within tolerance | 5 pixels differ (3.957e-05 %), max difference 0.000244 |
| warp | warp DEM NAD83->UTM cubic | within tolerance | 4 pixels differ (3.166e-05 %), max difference 0.000244 |
| warp | warp DEM NAD83->UTM cubicspline | within tolerance | 4 pixels differ (3.166e-05 %), max difference 0.000244 |
| warp | warp DEM NAD83->UTM lanczos | within tolerance | 5 pixels differ (3.957e-05 %), max difference 0.000244 |
| warp | warp DEM NAD83->UTM average | within tolerance | 2 pixels differ (1.582e-05 %), max difference 0.000244 |
| warp | warp DEM NAD83->UTM rms | within tolerance | 7 pixels differ (5.538e-05 %), max difference 0.000244 |
| warp | warp DEM ->3857 tr 100 bilinear (-ovr NONE) | within tolerance | 1 pixels differ (6.187e-05 %), max difference 0.000122 |
Terrain analysis and raster algebra
The outputs of the same command lines on real DEMs and land cover: size, type, nodata and geotransform must match, then pixels are compared. Within tolerance: every pixel within the case's tolerance (float32 rounding of NumPy's SIMD functions, for example).
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| dem hillshade | 25 | 25 | 0 | 0 |
| dem slope | 14 | 14 | 0 | 0 |
| dem aspect | 10 | 10 | 0 | 0 |
| dem TRI | 7 | 7 | 0 | 0 |
| dem TPI | 6 | 6 | 0 | 0 |
| dem roughness | 6 | 6 | 0 | 0 |
| dem color-relief | 13 | 13 | 0 | 0 |
| calc landsat | 13 | 13 | 0 | 0 |
| calc usgs | 10 | 8 | 2 | 0 |
| calc srtm90 | 4 | 4 | 0 | 0 |
| calc dem | 2 | 2 | 0 | 0 |
| calc las_vegas | 1 | 1 | 0 | 0 |
| calc nlcd | 2 | 2 | 0 | 0 |
| calc mixed | 2 | 2 | 0 | 0 |
| calc extent | 2 | 2 | 0 | 0 |
| calc projwin | 1 | 1 | 0 | 0 |
| proximity nlcd | 2 | 2 | 0 | 0 |
| proximity usgs | 4 | 4 | 0 | 0 |
| proximity landsat | 1 | 1 | 0 | 0 |
| sieve nlcd | 3 | 3 | 0 | 0 |
| sieve usgs | 2 | 2 | 0 | 0 |
| sieve landsat | 1 | 1 | 0 | 0 |
Cases that are not identical:
| Format or operation | Case | Result | Details |
|---|---|---|---|
| calc usgs | calc usgs functions (NumPy SIMD float32) | within tolerance | 2797827 pixels differ (21.44 %), max difference 3.81e-06 |
| calc usgs | calc usgs arctan2 hypot (NumPy SIMD float32) | within tolerance | 2333 pixels differ (0.01788 %), max difference 0.000488 |
Vector operations
Conversions with ogr2ogr's options (where, spat, select, sql, nlt...) compared feature by feature; SQL expressions, DISTINCT, summaries and attribute joins against OGRSQL compare values, nulls, logical field types, geometry WKB and CRS, including duplicate and null join keys. Integer widths normalize to Terrio's Integer model. Rasterized pixels compare exactly; polygons compare by count, holes and validity, and by rasterizing them back.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| convert (ogr2ogr options) | 28 | 28 | 0 | 0 |
| convert --append/--overwrite | 1 | 1 | 0 | 0 |
| sql | 16 | 16 | 0 | 0 |
| rasterize | 18 | 18 | 0 | 0 |
| polygonize | 4 | 4 | 0 | 0 |
Arrow and GeoArrow
Every layer of the test data exported with Layer.to_arrow() (WKB and native GeoArrow) against GDAL's Arrow stream of the same layer, through pyarrow and GeoPandas, and imported back with terrio.from_arrow() (and by GDAL's WriteArrow): rows, geometries, attribute values and CRS. Within tolerance: geometries equal up to vertex order.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| export WKB vs GDAL | 16 | 15 | 1 | 0 |
| export CRS vs GDAL | 16 | 16 | 0 | 0 |
| export geoarrow.multipolygon (separated) vs GDAL | 6 | 5 | 1 | 0 |
| import geoarrow.multipolygon (separated) | 6 | 6 | 0 | 0 |
| export geoarrow.multipolygon (interleaved) vs GDAL | 6 | 5 | 1 | 0 |
| import geoarrow.multipolygon (interleaved) | 6 | 6 | 0 | 0 |
| GeoDataFrame.from_arrow vs GDAL | 12 | 11 | 1 | 0 |
| import GDAL stream (WKB) | 16 | 15 | 1 | 0 |
| import ogr.Layer | 16 | 15 | 1 | 0 |
| import GeoDataFrame.to_arrow(WKB) | 12 | 11 | 1 | 0 |
| import GeoDataFrame.to_arrow(geoarrow) | 12 | 11 | 1 | 0 |
| GDAL WriteArrow of terrio's table | 16 | 15 | 1 | 0 |
| export geoarrow.point (separated) vs GDAL | 5 | 5 | 0 | 0 |
| import geoarrow.point (separated) | 5 | 5 | 0 | 0 |
| export geoarrow.point (interleaved) vs GDAL | 5 | 5 | 0 | 0 |
| import geoarrow.point (interleaved) | 5 | 5 | 0 | 0 |
| export geoarrow.linestring (separated) vs GDAL | 3 | 3 | 0 | 0 |
| import geoarrow.linestring (separated) | 3 | 3 | 0 | 0 |
| export geoarrow.linestring (interleaved) vs GDAL | 3 | 3 | 0 | 0 |
| import geoarrow.linestring (interleaved) | 3 | 3 | 0 | 0 |
| export geoarrow.multilinestring (separated) vs GDAL | 2 | 2 | 0 | 0 |
| import geoarrow.multilinestring (separated) | 2 | 2 | 0 | 0 |
| export geoarrow.multilinestring (interleaved) vs GDAL | 2 | 2 | 0 | 0 |
| import geoarrow.multilinestring (interleaved) | 2 | 2 | 0 | 0 |
Cases that are not identical:
| Format or operation | Case | Result | Details |
|---|---|---|---|
| export WKB vs GDAL | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850 |
| export geoarrow.multipolygon (separated) vs GDAL | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850 |
| export geoarrow.multipolygon (interleaved) vs GDAL | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850 |
| GeoDataFrame.from_arrow vs GDAL | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850, crs same |
| import GDAL stream (WKB) | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850, crs same |
| import ogr.Layer | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850 |
| import GeoDataFrame.to_arrow(WKB) | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850, crs same |
| import GeoDataFrame.to_arrow(geoarrow) | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850, crs same |
| GDAL WriteArrow of terrio's table | liechtenstein.osm.pbf:multipolygons | within tolerance | rows 24314, geometries 24274/24314 (24314 equal up to vertex order), values 607850/607850 |
GeoPackage updates and spatial filters
--append, --overwrite and added layers compared with ogr2ogr (features, extents, counts, sequences, R-trees, integrity_check, the GeoPackage validator, rasters kept), and --spat through the R-tree compared with ogr2ogr -spat.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| append | 4 | 4 | 0 | 0 |
| add | 2 | 2 | 0 | 0 |
| --spat | 6 | 6 | 0 | 0 |
Point clouds
Every dimension of every point equal to laspy's; headers equal to laspy's and PDAL's; written files read back identically by laspy and PDAL; PLY, E57 and EPT points equal to PDAL's; COPC and EPT queries returning the same points as PDAL's; waveform samples equal to the file's packets; filters giving the same classes or points as PDAL's; grids equal to PDAL's writers.gdal. Reprojections are within 2e-7 degrees or 2 mm of PDAL's; TIN grids differ from gdal_grid's where points share an x and y.
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| read vs laspy | 56 | 56 | 0 | 0 |
| header vs laspy | 56 | 56 | 0 | 0 |
| header vs PDAL | 56 | 56 | 0 | 0 |
| write and read back (laspy) | 159 | 159 | 0 | 0 |
| write and read back (PDAL) | 141 | 141 | 0 | 0 |
| COPC queries vs PDAL | 9 | 9 | 0 | 0 |
| grid vs PDAL writers.gdal | 8 | 8 | 0 | 0 |
| reproject vs PDAL | 3 | 0 | 3 | 0 |
| PLY, E57 and EPT vs PDAL | 24 | 24 | 0 | 0 |
| EPT queries vs PDAL | 4 | 4 | 0 | 0 |
| PLY, E57 and EPT written, read back | 8 | 8 | 0 | 0 |
| waveforms | 3 | 3 | 0 | 0 |
| filters vs PDAL | 84 | 84 | 0 | 0 |
| TIN and nearest grids vs gdal_grid | 4 | 1 | 3 | 0 |
Cases that are not identical:
| Format or operation | Case | Result | Details |
|---|---|---|---|
| reproject vs PDAL | reproject test_utm16.las to EPSG:4269 | within tolerance | max |dx| 9.41e-08, |dy| 6.91e-08 |
| reproject vs PDAL | reproject las_with_several_extra_byte_bloc.laz to EPSG:4326 | within tolerance | max |dx| 9.67e-08, |dy| 8.86e-08 |
| reproject vs PDAL | reproject format6.laz to EPSG:5070 | within tolerance | max |dx| 0.000784, |dy| 0.000838 |
| TIN and nearest grids vs gdal_grid | interp linear autzen_trim.las res 6.0 vs gdal_grid -a linear:radius=0 (197x94) | within tolerance | 16 of 18518 cells differ (99.914% identical) |
| TIN and nearest grids vs gdal_grid | interp linear autzen_trim.las res 6.0 vs gdal_grid -a linear (197x94) | within tolerance | 16 of 18518 cells differ (99.914% identical) |
| TIN and nearest grids vs gdal_grid | interp nearest autzen_trim.las res 6.0 vs gdal_grid -a nearest:radius1=8:radius2=8 (197x94) | within tolerance | 1 of 18518 cells differ (99.995% identical) |
Coordinate transformations
50 reference points per EPSG geographic and projected CRS (the centre of its area of use and random points of it), transformed from WGS 84 (forward), 50 more back (inverse), and 50 between the CRS and another whose area holds them, compared with GDAL's results, neither using datum shift grids, a case per CRS (per pair of CRSs from CRS to CRS) judged by its worst point; then projections EPSG has no code for, against PROJ (crates/terrio/tests/geostationary.rs: points from nadir to near the limb, forward within 1 mm and inverse within 1e-8°, and points the satellite cannot see refused; crates/terrio-crs/tests/ellipsoidal_projections.rs: points over the globe on WGS 84 and on a sphere, forward within 1 mm and inverse within 1e-8°, and for the gnomonic points beyond the horizon refused; crates/terrio-crs/tests/proj_strings.rs: every PROJ projection with typical parameters, on WGS 84 and on a sphere, as a PROJ string and as pyproj's WKT1_GDAL and WKT2_2019, 20 points each, matching PROJ or refused). Identical: within 1 mm. Within tolerance: within 1 cm (forward, inverse) or 1 m (CRS to CRS, where the datum transformations GDAL picks can differ by area of use). Known differences: deprecated CRSs whose own datum PROJ uses, where terrio uses their replacement's (#153).
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| forward (WGS 84 to CRS) | 6,354 | 6,354 | 0 | 0 |
| inverse (CRS to WGS 84) | 6,354 | 6,354 | 0 | 0 |
| CRS to CRS | 6,295 | 6,280 | 13 | 2 |
| PROJ definitions without an EPSG code | 14 | 14 | 0 | 0 |
Cases that are not identical:
| Format or operation | Case | Result | Details |
|---|---|---|---|
| CRS to CRS | EPSG:6054 to EPSG:4287 | differs | 267.0470 m at (31784658.69, 3344856.669), the largest of 50 points |
| CRS to CRS | EPSG:29183 to EPSG:20823 | differs | 208.2056 m at (701491.5661, 7674422.233), the largest of 50 points |
| CRS to CRS | EPSG:3312 to EPSG:31171 | within tolerance | 0.0021 m at (823128.8384, 542294.9992), the largest of 50 points |
| CRS to CRS | EPSG:3768 to EPSG:3908 | within tolerance | 0.7959 m at (278809.5528, 4726919.154), the largest of 50 points |
| CRS to CRS | EPSG:4149 to EPSG:4230 | within tolerance | 0.0011 m at (6.283819626, 45.83474531), the largest of 50 points |
| CRS to CRS | EPSG:4179 to EPSG:4230 | within tolerance | 0.0020 m at (19.38060709, 42.48389042), the largest of 50 points |
| CRS to CRS | EPSG:4745 to EPSG:5663 | within tolerance | 0.0011 m at (14.31513274, 50.44966061), the largest of 50 points |
| CRS to CRS | EPSG:5681 to EPSG:5664 | within tolerance | 0.0011 m at (10.31746658, 50.21108448), the largest of 50 points |
| CRS to CRS | EPSG:9149 to EPSG:20048 | within tolerance | 0.0029 m at (676328.809, 5369453.639), the largest of 50 points |
| CRS to CRS | EPSG:9404 to EPSG:4728 | within tolerance | 0.0022 m at (778106.4743, 3084377.471), the largest of 50 points |
| CRS to CRS | EPSG:11117 to EPSG:3117 | within tolerance | 0.3107 m at (1112787.716, 1625740.3), the largest of 50 points |
| CRS to CRS | EPSG:25394 to EPSG:3124 | within tolerance | 0.0020 m at (641386.12, 908387.1589), the largest of 50 points |
| CRS to CRS | EPSG:29901 to EPSG:23029 | within tolerance | 0.0067 m at (208913.9987, 333999.2567), the largest of 50 points |
| CRS to CRS | EPSG:31277 to EPSG:4284 | within tolerance | 0.0011 m at (7403421.197, 4703646.433), the largest of 50 points |
| CRS to CRS | EPSG:31463 to EPSG:4668 | within tolerance | 0.0011 m at (3391059.234, 5261195.817), the largest of 50 points |
Datum shift grids, geoid models and coordinate epochs
The EPSG reference points again, GDAL and terrio both using the grids of scripts/proj_grids.txt (crates/terrio-crs/tests/epsg_accuracy_grids.rs); then random points through every horizontal shift grid (NTv2 and GeoTIFF, forward and inverse), geoid models (GeoTIFF and GTX), NADCON5 and geocentric translation grids, compound CRSs and time-dependent transformations with coordinate epochs (scripts/compare_crs_grids_with_gdal.py), with the largest difference of each case. Identical: within 1 mm. Within tolerance: within 1 cm, or 1 m from CRS to CRS. Known differences: deprecated CRSs whose own datum PROJ uses, where terrio uses their replacement's (#153).
| Format or operation | Cases | Identical | Within tolerance | Differs |
|---|---|---|---|---|
| forward (WGS 84 to CRS) with grids | 6,354 | 6,352 | 2 | 0 |
| inverse (CRS to WGS 84) with grids | 6,354 | 6,351 | 3 | 0 |
| CRS to CRS with grids | 6,295 | 6,270 | 23 | 2 |
| grids, geoids and epochs | 250 | 250 | 0 | 0 |
Cases that are not identical:
| Format or operation | Case | Result | Details |
|---|---|---|---|
| CRS to CRS with grids | EPSG:6054 to EPSG:4287 | differs | 267.0470 m at (31784658.69, 3344856.669), the largest of 50 points |
| CRS to CRS with grids | EPSG:29183 to EPSG:20823 | differs | 210.4146 m at (701491.9215, 7674419.3), the largest of 50 points |
| CRS to CRS with grids | EPSG:3006 to EPSG:9062 | within tolerance | 0.0082 m at (552348.3716, 6103006.669), the largest of 50 points |
| CRS to CRS with grids | EPSG:3034 to EPSG:8993 | within tolerance | 0.0066 m at (3835189.368, 4208497.145), the largest of 50 points |
| CRS to CRS with grids | EPSG:3174 to EPSG:3162 | within tolerance | 0.0259 m at (617151.5571, 667112.2006), the largest of 50 points |
| CRS to CRS with grids | EPSG:3300 to EPSG:9065 | within tolerance | 0.0024 m at (388814.7714, 6583119.914), the largest of 50 points |
| CRS to CRS with grids | EPSG:3312 to EPSG:31171 | within tolerance | 0.0021 m at (823128.8384, 542294.9992), the largest of 50 points |
| CRS to CRS with grids | EPSG:3734 to EPSG:3979 | within tolerance | 0.2233 m at (2174994.33, 230482.2301), the largest of 50 points |
| CRS to CRS with grids | EPSG:3768 to EPSG:3908 | within tolerance | 0.7959 m at (278809.5528, 4726919.154), the largest of 50 points |
| CRS to CRS with grids | EPSG:4179 to EPSG:4230 | within tolerance | 0.0020 m at (19.38060709, 42.48389042), the largest of 50 points |
| CRS to CRS with grids | EPSG:5513 to EPSG:5224 | within tolerance | 0.4927 m at (1055258.72, 504135.466), the largest of 50 points |
| CRS to CRS with grids | EPSG:5651 to EPSG:9000 | within tolerance | 0.6140 m at (31577406.5, 5679755.699), the largest of 50 points |
| CRS to CRS with grids | EPSG:5681 to EPSG:5664 | within tolerance | 0.0011 m at (10.31746658, 50.21108448), the largest of 50 points |
| forward (WGS 84 to CRS) with grids | EPSG:8997 | within tolerance | 0.0028 m at (166.0884248, -34.67636972), the largest of 50 points |
| inverse (CRS to WGS 84) with grids | EPSG:9000 | within tolerance | 0.0075 m at (168.8993947, -41.01545018), the largest of 50 points |
| CRS to CRS with grids | EPSG:9060 to EPSG:9065 | within tolerance | 0.0020 m at (20.50319716, 66.70419935), the largest of 50 points |
| inverse (CRS to WGS 84) with grids | EPSG:9062 | within tolerance | 0.0080 m at (14.12453145, 54.63356386), the largest of 50 points |
| forward (WGS 84 to CRS) with grids | EPSG:9067 | within tolerance | 0.0020 m at (23.28842349, 54.00210046), the largest of 50 points |
| inverse (CRS to WGS 84) with grids | EPSG:9067 | within tolerance | 0.0023 m at (20.22860091, 56.03457355), the largest of 50 points |
| CRS to CRS with grids | EPSG:9149 to EPSG:20048 | within tolerance | 0.0029 m at (676328.809, 5369453.639), the largest of 50 points |
| CRS to CRS with grids | EPSG:9404 to EPSG:4728 | within tolerance | 0.0022 m at (778106.4743, 3084377.471), the largest of 50 points |
| CRS to CRS with grids | EPSG:10454 to EPSG:9054 | within tolerance | 0.4007 m at (65866.80438, 150719.7607), the largest of 50 points |
| CRS to CRS with grids | EPSG:10459 to EPSG:10606 | within tolerance | 0.0977 m at (23088.82127, 586827.965), the largest of 50 points |
| CRS to CRS with grids | EPSG:11117 to EPSG:3117 | within tolerance | 0.3107 m at (1112787.716, 1625740.3), the largest of 50 points |
| CRS to CRS with grids | EPSG:20355 to EPSG:9309 | within tolerance | 0.0443 m at (756710.0855, 6824843.929), the largest of 50 points |
| CRS to CRS with grids | EPSG:25394 to EPSG:3124 | within tolerance | 0.0020 m at (641386.12, 908387.1589), the largest of 50 points |
| CRS to CRS with grids | EPSG:27593 to EPSG:7084 | within tolerance | 0.0013 m at (715820.8766, 299455.2569), the largest of 50 points |
| CRS to CRS with grids | EPSG:29901 to EPSG:23029 | within tolerance | 0.0067 m at (208913.9987, 333999.2567), the largest of 50 points |
| CRS to CRS with grids | EPSG:31277 to EPSG:4284 | within tolerance | 0.0011 m at (7403421.197, 4703646.433), the largest of 50 points |
| CRS to CRS with grids | EPSG:32055 to EPSG:3348 | within tolerance | 0.3687 m at (404966.2857, 134550.9639), the largest of 50 points |