aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS50
-rw-r--r--data/projjson.schema.json11
-rw-r--r--data/sql/alias_name.sql31
-rw-r--r--data/sql/area.sql3
-rw-r--r--data/sql/compound_crs.sql7
-rw-r--r--data/sql/conversion.sql1
-rw-r--r--data/sql/customizations.sql5
-rw-r--r--data/sql/geodetic_crs.sql7
-rw-r--r--data/sql/geodetic_datum.sql3
-rw-r--r--data/sql/grid_alternatives.sql3
-rw-r--r--data/sql/grid_transformation.sql114
-rw-r--r--data/sql/helmert_transformation.sql8
-rw-r--r--data/sql/metadata.sql4
-rw-r--r--data/sql/projected_crs.sql17
-rw-r--r--data/sql/supersession.sql2
-rw-r--r--data/sql/vertical_crs.sql6
-rw-r--r--data/sql/vertical_datum.sql10
-rw-r--r--docs/docbuild/Dockerfile5
-rw-r--r--docs/source/community/rfc/index.rst1
-rw-r--r--docs/source/community/rfc/rfc-6.rst368
-rw-r--r--docs/source/conf.py2
-rw-r--r--docs/source/development/reference/datatypes.rst58
-rw-r--r--docs/source/download.rst9
-rw-r--r--docs/source/news.rst41
-rw-r--r--include/proj/datum.hpp2
-rw-r--r--include/proj/util.hpp2
-rw-r--r--schemas/v0.2/projjson.schema.json11
-rwxr-xr-xscripts/build_db.py15
-rw-r--r--src/4D_api.cpp12
-rw-r--r--src/iso19111/c_api.cpp6
-rw-r--r--src/iso19111/coordinateoperation.cpp134
-rw-r--r--src/iso19111/crs.cpp25
-rw-r--r--src/iso19111/datum.cpp4
-rw-r--r--src/projections/tmerc.cpp9
-rw-r--r--test/cli/proj_outIGNF.dist4
-rw-r--r--test/cli/testprojinfo_out.dist14
-rw-r--r--test/unit/test_c_api.cpp17
-rw-r--r--test/unit/test_crs.cpp39
-rw-r--r--test/unit/test_operation.cpp49
39 files changed, 851 insertions, 258 deletions
diff --git a/NEWS b/NEWS
index 47bc3327..56b3747a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,53 @@
+7.1.1 Release Notes
+-------------------
+
+ Updates
+ -------
+
+ o Added various Brazillian grids to the database #2277
+
+ o Added geoid file for Canary Islands to the database #2312
+
+ o Updated EPSG database to version 9.8.15 #2310
+
+ Bug fixes
+ ---------
+
+ o WKT parser: do not raise warning when parsing a WKT2:2015 TIMECRS
+ whose TIMEUNIT is at the CS level, and not inside #2281
+
+ o Parse '+proj=something_not_latlong +vunits=' without +geoidgrids as a
+ Projected3D CRS and not a compound CRS with a unknown datum #2289
+
+ o C API: Avoid crashing due to missing SANITIZE_CTX() in entry points #2293
+
+ o CMake build: Check "target_clones" before use #2297
+
+ o PROJ string export of +proj=krovak +czech: make sure we export +czech… #2301
+
+ o Helmert 2D: do not require a useless +convention= parameter #2305
+
+ o Fix a few spelling errors ("vgridshit" vs. "vgridshift") #2307
+
+ o Fix ability to identify EPSG:2154 as a candidate for 'RGF93_Lambert_93' #2316
+
+ o WKT importer: tune for Oracle WKT and 'Lambert Conformal Conic' #2322
+
+ o Revert compiler generated Fused Multiply Addition optimized routines #2328
+
+ THANKS TO
+ ---------
+
+ Jeff McKenna
+ Kai Pastor
+ Javier Jimenez Shaw
+ Kristian Evers
+ Even Rouault
+
+
+
+
+
7.1.0 Release Notes
-------------------
diff --git a/data/projjson.schema.json b/data/projjson.schema.json
index 0a4015ce..bdb97bd5 100644
--- a/data/projjson.schema.json
+++ b/data/projjson.schema.json
@@ -1,7 +1,7 @@
{
"$id": "https://proj.org/schemas/v0.2/projjson.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
- "description": "Schema for PROJJSON",
+ "description": "Schema for PROJJSON (v0.2.1)",
"$comment": "This file exists both in data/ and in schemas/vXXX/. Keep both in sync. And if changing the value of $id, change PROJJSON_CURRENT_VERSION accordingly in io.cpp",
"oneOf": [
@@ -756,7 +756,7 @@
"$schema" : { "type": "string" },
"type": { "type": "string", "enum": ["PrimeMeridian"] },
"name": { "type": "string" },
- "longitude": { "$ref": "#/definitions/value_and_unit" },
+ "longitude": { "$ref": "#/definitions/value_in_degree_or_value_and_unit" },
"id": { "$ref": "#/definitions/id" },
"ids": { "$ref": "#/definitions/ids" }
},
@@ -912,6 +912,13 @@
"additionalProperties": false
},
+ "value_in_degree_or_value_and_unit": {
+ "oneOf": [
+ { "type": "number" },
+ { "$ref": "#/definitions/value_and_unit" }
+ ]
+ },
+
"value_in_metre_or_value_and_unit": {
"oneOf": [
{ "type": "number" },
diff --git a/data/sql/alias_name.sql b/data/sql/alias_name.sql
index 7b5dd59d..524c478e 100644
--- a/data/sql/alias_name.sql
+++ b/data/sql/alias_name.sql
@@ -507,6 +507,17 @@ INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1284','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1285','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1243','SIRGAS-Chile 2010','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1287','EVRF2019mean','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1289','GBK19-IRF','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1291','ATRF2014','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1270','MSL NL','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1290','LAT NL','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1292','AVWS','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1080','Lowest Astronomic Tide','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1082','Highest Astronomic Tide','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1293','SRGI2013','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1293','Indonesian Geospatial Reference System 2013','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1293','Jaring Kontrol Geodesi (JKG)','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1294','INAGEOID2020','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1042','Red Geodesica Nacional 1992','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1046','Morro do Papagaio','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1046','Island of Principe datum','EPSG');
@@ -1618,7 +1629,6 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6859','NAD83(2011) / OCR
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6870','KRGJSH-2010','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6862','NAD83(2011) / OCRS_SAN (m)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6862','NAD83(2011) / Oregon Sweet Home-Sisters zone (m)','EPSG');
-INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4289','Stelsel van de Rijksdriehoeksmeting','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6863','NAD83(2011) / OCRS_SAN (ft)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3019','RT90 7.5 gon V 0:-15','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6798','NAD83(2011) / OCRS_BBU (m)','EPSG');
@@ -6046,10 +6056,11 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2081','Quini-Huao / Arge
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9254','MMS / Argentina zone 2','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9254','MMS / Gauss-Kruger zone 2','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9284','Pampa del Castillo / Gauss-Kruger zone 1','EPSG');
+INSERT INTO "alias_name" VALUES('projected_crs','EPSG','28992','Stelsel van de Rijksdriehoeksmeting','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9284','Pampa del Castillo / Argentina zone 1','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9285','Pampa del Castillo / Gauss-Kruger zone 3','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9285','Pampa del Castillo / Argentina zone 3','EPSG');
-INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4289','RD-Bessel','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4289','RD Bessel','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4776','New Beijing / 3GK zone 40','EPSG');
INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9306','ETRS89 / HS2P1+14 Snake + HS2-VRF height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4777','New Beijing / 3GK zone 41','EPSG');
@@ -6057,6 +6068,7 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9300','ETRS89 / HS2P1+14
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5753','NGNC height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9311','US National Atlas EA','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9354','WGS 84 / IBCSO PS','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5709','Hoogte boven Normaal Amsterdams Peil','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9394','REDNAP height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31289','MGI (Ferro) / M31','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31290','MGI (Ferro) / M34','EPSG');
@@ -6074,7 +6086,18 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5195','SI_TRIE / NOH','EP
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5195','MK_TRIE / NOH','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4826','WGS 84 / Cape Verde New','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9390','EVRF2019mean_AMST / NH','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4479','732','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4479','CGCS 2000 - XYZ','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4480','733','EPSG');
INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9450','ETRS89 + Belfast Lough height','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4480','CGCS 2000 - LatLonEht','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4490','734','EPSG');
+INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4490','CGCS 2000 - LatLon','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5737','735','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5737','National Height Datum 1985 - NHt','EPSG');
+INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9456','ETRS89 / GBK19 SnakeGrid','EPSG');
+INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9457','ETRS89 / GBK19 SnakeGrid + Newlyn height','EPSG');
+INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9473','GDA2020 / Aus Albers','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4647','ETRS89 / UTM zone 32N','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4824','Morro do Papagaio','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4824','Island of Principe datum','EPSG');
@@ -6545,7 +6568,7 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5868','Mean High Water he
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5869','Mean Higher High Water height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5870','Mean High Water Spring Tides height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5871','Higher High Water Large Tide height','EPSG');
-INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5872','Highest Astronomic Tide height','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5872','Highest Astronomical Tide height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5829','sea level height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5865','Mean Low Water Spring Tides depth','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5867','Mean Low Water depth','EPSG');
@@ -6554,7 +6577,7 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5866','Mean Lower Low Wat
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5831','sea level depth','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5863','Indian Spring Low Water depth','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5863','Indian Tidal Plane depth','EPSG');
-INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5861','Lowest Astronomic Tide depth','EPSG');
+INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5861','Lowest Astronomical Tide depth','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5862','Lower Low Water Large Tide depth','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5874','High Tide height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5873','Low Tide depth','EPSG');
diff --git a/data/sql/area.sql b/data/sql/area.sql
index aa45c749..c046ee46 100644
--- a/data/sql/area.sql
+++ b/data/sql/area.sql
@@ -3367,7 +3367,7 @@ INSERT INTO "area" VALUES('EPSG','4387','Kyrgyzstan - 73°01''E to 76°01''E','K
INSERT INTO "area" VALUES('EPSG','4388','Kyrgyzstan - 76°01''E to 79°01''E','Kyrgyzstan - between 76°01''E and 79°01''E.',40.35,43.0,76.01,79.02,0);
INSERT INTO "area" VALUES('EPSG','4389','Kyrgyzstan - east of 79°01''E','Kyrgyzstan - east of 79°01''E.',41.66,42.8,79.01,80.29,0);
INSERT INTO "area" VALUES('EPSG','4390','UK - Britain and UKCS 49°45''N to 61°N, 9°W to 2°E','United Kingdom (UK) - offshore to boundary of UKCS within 49°45''N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore.',49.75,61.01,-9.0,2.01,0);
-INSERT INTO "area" VALUES('EPSG','4391','UK - offshore 49°46''N to 61°01''N, 7°33''W to 3°33''E','United Kingdom (UK) - offshore between 2km from shore and boundary of UKCS within 49°46''N to 61°01''N and 7°33''W to 3°33''E.',49.75,61.14,-9.2,2.88,0);
+INSERT INTO "area" VALUES('EPSG','4391','UK - offshore 49°45''N to 61°N, 9°W to 2°E','United Kingdom (UK) - offshore between 2km from shore and boundary of UKCS within 49°45''N to 61°N and 9°W to 2°E.',49.75,61.01,-9.0,2.01,0);
INSERT INTO "area" VALUES('EPSG','4392','India - northeast','India - Arunachal Pradesh, Assam, Manipur, Meghalaya, Mizoram, Nagaland and Tripura.',21.94,29.47,89.69,97.42,0);
INSERT INTO "area" VALUES('EPSG','4393','To be specified','Description of the extent of the CRS.',-90.0,90.0,-180.0,180.0,0);
INSERT INTO "area" VALUES('EPSG','4394','India - Andhra Pradesh and Telangana','India - Andhra Pradesh; Telangana; Yanam area of Pudacherry territory.',12.61,19.92,76.75,84.81,0);
@@ -3581,5 +3581,6 @@ INSERT INTO "area" VALUES('EPSG','4602','Spain - Balearic Islands - Mallorca','S
INSERT INTO "area" VALUES('EPSG','4603','Spain - Balearic Islands - Menorca','Spain - Balearic Islands - Menorca onshore.',39.75,40.15,3.73,4.39,0);
INSERT INTO "area" VALUES('EPSG','4604','Spain - Balearic Islands - Ibiza and Formentera','Spain - Balearic Islands - Ibiza and Formentera - onshore.',38.59,39.17,1.12,1.68,0);
INSERT INTO "area" VALUES('EPSG','4605','Spain - mainland onshore and Ceuta','Spain - mainland and Ceuta - onshore.',35.82,43.82,-9.37,3.39,0);
+INSERT INTO "area" VALUES('EPSG','4607','UK - Glasgow to Kilmarnock','UK - on or related to the rail route from Glasgow via Barrhead to Kilmarnock and the branch to East Kilbride.',55.55,55.95,-4.65,-4.05,0);
INSERT INTO "area" VALUES('EPSG','4608','Europe - EVRF2019','Europe - onshore - Andorra; Austria; Belarus; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Czechia; Denmark; Estonia; Finland; France - mainland; Germany; Gibraltar, Hungary; Italy - mainland and Sicily; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; North Macedonia; Norway; Poland; Portugal - mainland; Romania; Russia – west of approximately 60°E; San Marino; Slovakia; Slovenia; Spain - mainland; Sweden; Switzerland; United Kingdom (UK) - Great Britain mainland; Ukraine; Vatican City State.',35.95,77.07,-9.56,69.15,0);
INSERT INTO "area" VALUES('EPSG','4609','Europe - ETRF EVRF2019','Europe - onshore - Andorra; Austria; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Czechia; Denmark; Estonia; Finland; France - mainland; Germany; Gibraltar, Hungary; Italy - mainland and Sicily; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; North Macedonia; Norway; Poland; Portugal - mainland; Romania; San Marino; Slovakia; Slovenia; Spain - mainland; Sweden; Switzerland; United Kingdom (UK) - Great Britain mainland; Vatican City State.',35.95,71.21,-9.56,31.59,0);
diff --git a/data/sql/compound_crs.sql b/data/sql/compound_crs.sql
index f0df559a..e0ad4c83 100644
--- a/data/sql/compound_crs.sql
+++ b/data/sql/compound_crs.sql
@@ -277,6 +277,9 @@ INSERT INTO "compound_crs" VALUES('EPSG','8813','NAD83 / Missouri East + NAVD88
INSERT INTO "compound_crs" VALUES('EPSG','8814','NAD83 / Missouri Central + NAVD88 height',NULL,NULL,'EPSG','26997','EPSG','5703','EPSG','2218',0);
INSERT INTO "compound_crs" VALUES('EPSG','8815','NAD83 / Missouri West + NAVD88 height',NULL,NULL,'EPSG','26998','EPSG','5703','EPSG','2220',0);
INSERT INTO "compound_crs" VALUES('EPSG','8912','CR-SIRGAS / CRTM05 + DACR52 height',NULL,NULL,'EPSG','8908','EPSG','8911','EPSG','3232',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9286','ETRS89 + NAP height',NULL,NULL,'EPSG','4258','EPSG','5709','EPSG','1172',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9289','ETRS89 + LAT NL depth',NULL,NULL,'EPSG','4258','EPSG','9287','EPSG','1630',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9290','ETRS89 + MSL NL depth',NULL,NULL,'EPSG','4258','EPSG','9288','EPSG','1630',0);
INSERT INTO "compound_crs" VALUES('EPSG','9306','HS2 Survey Grid + HS2-VRF height',NULL,NULL,'EPSG','9300','EPSG','9303','EPSG','4582',0);
INSERT INTO "compound_crs" VALUES('EPSG','9368','TPEN11 Grid + ODN height',NULL,NULL,'EPSG','9367','EPSG','5701','EPSG','4583',0);
INSERT INTO "compound_crs" VALUES('EPSG','9374','MML07 Grid + ODN height',NULL,NULL,'EPSG','9373','EPSG','5701','EPSG','4588',0);
@@ -292,3 +295,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','9429','ETRS89 + Douglas height',NULL,N
INSERT INTO "compound_crs" VALUES('EPSG','9430','ETRS89 + St. Marys height',NULL,NULL,'EPSG','4258','EPSG','5749','EPSG','2802',0);
INSERT INTO "compound_crs" VALUES('EPSG','9449','ETRS89 + Malin Head height',NULL,NULL,'EPSG','4258','EPSG','5731','EPSG','1305',0);
INSERT INTO "compound_crs" VALUES('EPSG','9450','ETRS89 + Belfast height',NULL,NULL,'EPSG','4258','EPSG','5732','EPSG','2530',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9457','GBK19 Grid + ODN height',NULL,NULL,'EPSG','9456','EPSG','5701','EPSG','4607',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9462','GDA2020 + AVWS height',NULL,NULL,'EPSG','7844','EPSG','9458','EPSG','4177',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9463','GDA2020 + AHD height',NULL,NULL,'EPSG','7844','EPSG','5711','EPSG','4493',0);
+INSERT INTO "compound_crs" VALUES('EPSG','9464','GDA94 + AHD height',NULL,NULL,'EPSG','4283','EPSG','5711','EPSG','4493',0);
diff --git a/data/sql/conversion.sql b/data/sql/conversion.sql
index bf658cc6..5fbeb3e7 100644
--- a/data/sql/conversion.sql
+++ b/data/sql/conversion.sql
@@ -865,6 +865,7 @@ INSERT INTO "conversion" VALUES('EPSG','9366','TPEN11-TM','In conjunction with t
INSERT INTO "conversion" VALUES('EPSG','9370','MML07-TM','In conjunction with transformation ETRS89 to MML07-IRF (1) (code 9369), emulates the MML07 Snake projection.','Engineering survey and topographic mapping for railway applications.','EPSG','4588','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',52.27,'EPSG','9110','EPSG','8802','Longitude of natural origin',-0.51,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',49350.157,'EPSG','9001','EPSG','8807','False northing',108398.212,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "conversion" VALUES('EPSG','9376','Colombia Transverse Mercator','Adopted by resolution IGAC 471/May 14, 2020. Supports the Spatial Data Infrastructure for Land Administration (IDE-AT) and its GIS applications. Used to fulfill all the requirements of the activities required for the Multipurpose Cadastre.','Cadastre.','EPSG','1070','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',4.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-73.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9992,'EPSG','9201','EPSG','8806','False easting',5000000.0,'EPSG','9001','EPSG','8807','False northing',2000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "conversion" VALUES('EPSG','9385','AbInvA96_2020-TM','In conjunction with transformation ETRS89 to AbInvA96_2020-IRF (1) (code 9386), emulates the AbInvA96_2020 Snake projection.','Highway engineering.','EPSG','4589','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',57.24,'EPSG','9110','EPSG','8802','Longitude of natural origin',-3.12,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',155828.702,'EPSG','9001','EPSG','8807','False northing',115225.707,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
+INSERT INTO "conversion" VALUES('EPSG','9455','GBK19-TM','In conjunction with transformation ETRS89 to GBK19-IRF (1) (code 9454), emulates the TPEN11 Snake projection.','Engineering survey and topographic mapping for railway applications.','EPSG','4607','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',55.45,'EPSG','9110','EPSG','8802','Longitude of natural origin',-4.21,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',93720.394,'EPSG','9001','EPSG','8807','False northing',113870.493,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "conversion" VALUES('EPSG','10101','Alabama CS27 East zone','','Used for large and medium scale topographic mapping and engineering survey.','EPSG','2154','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-85.5,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.99996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "conversion" VALUES('EPSG','10102','Alabama CS27 West zone','','Used for large and medium scale topographic mapping and engineering survey.','EPSG','2155','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-87.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.999933333,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "conversion" VALUES('EPSG','10131','SPCS83 Alabama East zone (meters)','','Used for large and medium scale topographic mapping and engineering survey.','EPSG','2154','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-85.5,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.99996,'EPSG','9201','EPSG','8806','False easting',200000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
diff --git a/data/sql/customizations.sql b/data/sql/customizations.sql
index fde530da..0a299367 100644
--- a/data/sql/customizations.sql
+++ b/data/sql/customizations.sql
@@ -20,10 +20,15 @@ INSERT INTO grid_alternatives(original_grid_name,
'https://cdn.proj.org/au_ga_AUSGeoid98.tif', 1, 1, NULL FROM grid_transformation WHERE
grid_name LIKE '%DAT.htm' AND name LIKE 'GDA94 to AHD height%';
+-- OGC CRS84, CRS27 and CRS83 longitude/latitude ordered CRS
INSERT INTO "geodetic_crs" VALUES('OGC','CRS84','WGS 84 (CRS84)',NULL,NULL,'geographic 2D','EPSG','6424','EPSG','6326','EPSG','1262',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('OGC','CRS27','NAD27 (CRS27)',NULL,NULL,'geographic 2D','EPSG','6424','EPSG','6267','EPSG','1349',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('OGC','CRS83','NAD83 (CRS83)',NULL,NULL,'geographic 2D','EPSG','6424','EPSG','6269','EPSG','1350',NULL,0);
INSERT INTO "other_transformation" VALUES('PROJ','CRS84_TO_EPSG_4326','OGC:CRS84 to WGS 84',NULL,NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS84','EPSG','4326','EPSG','1262',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('PROJ','CRS27_TO_EPSG_4267','OGC:CRS27 to NAD27',NULL,NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS27','EPSG','4267','EPSG','1262',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('PROJ','CRS83_TO_EPSG_4269','OGC:CRS83 to NAD83',NULL,NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS83','EPSG','4269','EPSG','1262',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
-- Temporary entry for NZGD2000 deformation model
INSERT INTO other_transformation VALUES(
diff --git a/data/sql/geodetic_crs.sql b/data/sql/geodetic_crs.sql
index 41e46003..87c6deb2 100644
--- a/data/sql/geodetic_crs.sql
+++ b/data/sql/geodetic_crs.sql
@@ -1035,6 +1035,9 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','9292','ONGD17',NULL,NULL,'geocentric',
INSERT INTO "geodetic_crs" VALUES('EPSG','9293','ONGD17',NULL,NULL,'geographic 3D','EPSG','6423','EPSG','1263','EPSG','1183',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9294','ONGD17',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1263','EPSG','1183',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9299','HS2-IRF',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1264','EPSG','4582',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9307','ATRF2014',NULL,NULL,'geocentric','EPSG','6500','EPSG','1291','EPSG','4177',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9308','ATRF2014',NULL,NULL,'geographic 3D','EPSG','6423','EPSG','1291','EPSG','4177',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9309','ATRF2014',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1291','EPSG','4177',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9331','KSA-GRF17',NULL,NULL,'geocentric','EPSG','6500','EPSG','1268','EPSG','1206',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9332','KSA-GRF17',NULL,NULL,'geographic 3D','EPSG','6423','EPSG','1268','EPSG','1206',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9333','KSA-GRF17',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1268','EPSG','1206',NULL,0);
@@ -1045,3 +1048,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','9379','IGb14',NULL,NULL,'geographic 3D
INSERT INTO "geodetic_crs" VALUES('EPSG','9380','IGb14',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1191','EPSG','1262',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9384','AbInvA96_2020-IRF',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1273','EPSG','4589',NULL,0);
INSERT INTO "geodetic_crs" VALUES('EPSG','9403','PN68',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1286','EPSG','3873',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9453','GBK19-IRF',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1289','EPSG','4607',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9468','SRGI2013',NULL,NULL,'geocentric','EPSG','6500','EPSG','1293','EPSG','1122',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9469','SRGI2013',NULL,NULL,'geographic 3D','EPSG','6423','EPSG','1293','EPSG','1122',NULL,0);
+INSERT INTO "geodetic_crs" VALUES('EPSG','9470','SRGI2013',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','1293','EPSG','1122',NULL,0);
diff --git a/data/sql/geodetic_datum.sql b/data/sql/geodetic_datum.sql
index 848217d6..059e3350 100644
--- a/data/sql/geodetic_datum.sql
+++ b/data/sql/geodetic_datum.sql
@@ -159,6 +159,9 @@ INSERT INTO "geodetic_datum" VALUES('EPSG','1271','MML07 Intermediate Reference
INSERT INTO "geodetic_datum" VALUES('EPSG','1272','IGb14',NULL,NULL,'EPSG','7019','EPSG','8901','EPSG','1262','2010-01-01',0);
INSERT INTO "geodetic_datum" VALUES('EPSG','1273','AbInvA96_2020 Intermediate Reference Frame',NULL,NULL,'EPSG','7019','EPSG','8901','EPSG','4589',NULL,0);
INSERT INTO "geodetic_datum" VALUES('EPSG','1286','Pico de las Nieves 1968',NULL,NULL,'EPSG','7022','EPSG','8901','EPSG','3873',NULL,0);
+INSERT INTO "geodetic_datum" VALUES('EPSG','1289','GBK19 Intermediate Reference Frame',NULL,NULL,'EPSG','7019','EPSG','8901','EPSG','4607',NULL,0);
+INSERT INTO "geodetic_datum" VALUES('EPSG','1291','Australian Terrestrial Reference Frame 2014',NULL,NULL,'EPSG','7019','EPSG','8901','EPSG','4177','2020-01-01',0);
+INSERT INTO "geodetic_datum" VALUES('EPSG','1293','Sistem Referensi Geospasial Indonesia 2013',NULL,NULL,'EPSG','7030','EPSG','8901','EPSG','1122','2013-10-11',0);
INSERT INTO "geodetic_datum" VALUES('EPSG','6001','Not specified (based on Airy 1830 ellipsoid)',NULL,NULL,'EPSG','7001','EPSG','8901','EPSG','1263',NULL,0);
INSERT INTO "geodetic_datum" VALUES('EPSG','6002','Not specified (based on Airy Modified 1849 ellipsoid)',NULL,NULL,'EPSG','7002','EPSG','8901','EPSG','1263',NULL,0);
INSERT INTO "geodetic_datum" VALUES('EPSG','6003','Not specified (based on Australian National Spheroid)',NULL,NULL,'EPSG','7003','EPSG','8901','EPSG','1263',NULL,0);
diff --git a/data/sql/grid_alternatives.sql b/data/sql/grid_alternatives.sql
index 88b2860c..99a75ba5 100644
--- a/data/sql/grid_alternatives.sql
+++ b/data/sql/grid_alternatives.sql
@@ -121,9 +121,10 @@ VALUES
('GDA94_GDA2020_conformal_christmas_island.gsb','au_icsm_GDA94_GDA2020_conformal_christmas_island.tif','GDA94_GDA2020_conformal_christmas_island.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/au_icsm_GDA94_GDA2020_conformal_christmas_island.tif',1,1,NULL),
('GDA94_GDA2020_conformal_cocos_island.gsb','au_icsm_GDA94_GDA2020_conformal_cocos_island.tif','GDA94_GDA2020_conformal_cocos_island.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/au_icsm_GDA94_GDA2020_conformal_cocos_island.tif',1,1,NULL),
-- source file contains undulation in first band, and deflection in 2nd and 3d band
+('AUSGeoid09_V1.01.gsb','au_ga_AUSGeoid09_V1.01.tif','AUSGeoid09_V1.01.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AUSGeoid09_V1.01.tif',1,1,NULL),
('AUSGeoid09_GDA94_V1.01_DOV_windows.gsb','au_ga_AUSGeoid09_V1.01.tif','AUSGeoid09_V1.01.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AUSGeoid09_V1.01.tif',1,1,NULL),
-- source file contains undulation in first band, and deflection in 2nd and 3d band
-('AUSGeoid2020_windows_binary.gsb','au_ga_AUSGeoid2020_20180201.tif','AUSGeoid2020_20180201.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AUSGeoid2020_20180201.tif',1,1,NULL),
+('AUSGeoid2020_20180201.gsb','au_ga_AUSGeoid2020_20180201.tif','AUSGeoid2020_20180201.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AUSGeoid2020_20180201.tif',1,1,NULL),
-- Netherlands / RDNAP (non-free grids). See https://salsa.debian.org/debian-gis-team/proj-rdnap/raw/master/debian/copyright
('naptrans2008.gtx','','naptrans2008.gtx','GTX','geoid_like',0,NULL,'https://salsa.debian.org/debian-gis-team/proj-rdnap/raw/upstream/2008/naptrans2008.gtx',1,0,NULL),
('rdtrans2008.gsb','','rdtrans2008.gsb','NTv2','hgridshift',0,NULL,'https://salsa.debian.org/debian-gis-team/proj-rdnap/raw/upstream/2008/rdtrans2008.gsb',1,0,NULL),
diff --git a/data/sql/grid_transformation.sql b/data/sql/grid_transformation.sql
index 19f8417f..47b0ff80 100644
--- a/data/sql/grid_transformation.sql
+++ b/data/sql/grid_transformation.sql
@@ -183,8 +183,8 @@ INSERT INTO "grid_transformation" VALUES('EPSG','5542','SAD69 to WGS 84 (15)','P
INSERT INTO "grid_transformation" VALUES('EPSG','5543','SAD69(96) to WGS 84 (1)','Parameters from SAD69(96) to SIRGAS 2000 (1) (tfm code 5529) assuming that SIRGAS 2000 and WGS 84 are equal within the accuracy of the transformation.','Accuracy 1m. Should be used for post-1996 data based on the classical geodetic network.','EPSG','9615','NTv2','EPSG','5527','EPSG','4326','EPSG','3887',1.0,'EPSG','8656','Latitude and longitude difference file','SAD96_003.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Bra',0);
INSERT INTO "grid_transformation" VALUES('EPSG','5594','FEH2010 to FCSVR10 height (1)','','Derivation of gravity-related heights from GPS observations.','EPSG','1030','Geographic3D to GravityRelatedHeight (NZgeoid)','EPSG','5592','EPSG','5597','EPSG','3890',0.1,'EPSG','8666','Geoid (height correction) model file','fehmarn_geoid10.gri',NULL,NULL,NULL,NULL,NULL,NULL,'FEM-Dnk-Deu Feh',1);
INSERT INTO "grid_transformation" VALUES('EPSG','5626','FEH2010 to FCSVR10 height (1)','','Derivation of gravity-related heights from GPS observations.','EPSG','1047','Geographic3D to GravityRelatedHeight (Gravsoft)','EPSG','5592','EPSG','5597','EPSG','3890',0.1,'EPSG','8666','Geoid (height correction) model file','fehmarn_geoid10.gri',NULL,NULL,NULL,NULL,NULL,NULL,'FEM-Dnk-Deu Feh',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','5656','GDA94 to AHD height (49)','Replaces AusGeoid98 model. Uses AusGeoid09 model which uses bi-cubic interpolation; bi-linear interpolation of the grid file will give results agreeing to within 1cm 99.97% of the time. May be used for transformations from WGS 84 to AHD.','Derivation of gravity-related heights from GPS observations.','EPSG','1048','Geographic3D to GravityRelatedHeight (Ausgeoid v2)','EPSG','4939','EPSG','5711','EPSG','1281',0.03,'EPSG','8666','Geoid (height correction) model file','AUSGeoid09_GDA94_V1.01_DOV_windows.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus09 mainland',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','5657','GDA94 to AHD (Tasmania) height (2)','Replaces AusGeoid98 model. Uses AusGeoid09 model which uses bi-cubic interpolation; bi-linear interpolation of the grid file will give results agreeing to within 1cm 99.97% of the time. May be used for transformations from WGS 84 to AHD (Tasmania).','Derivation of gravity-related heights from GPS observations.','EPSG','1048','Geographic3D to GravityRelatedHeight (Ausgeoid v2)','EPSG','4939','EPSG','5712','EPSG','2947',0.03,'EPSG','8666','Geoid (height correction) model file','AUSGeoid09_GDA94_V1.01_DOV_windows.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus09 Tas',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','5656','GDA94 to AHD height (49)','File name previously called AUSGeoid09_GDA94_V1.01_DOV_windows.gsb. Replaces AUSGeoid98 model. Uses AUSGeoid09 model which uses bi-cubic interpolation; bi-linear interpolation of the grid file will give results agreeing to within 1cm 99.97% of the time.','Derivation of gravity-related heights from GPS observations.','EPSG','1048','Geographic3D to GravityRelatedHeight (AUSGeoid v2)','EPSG','4939','EPSG','5711','EPSG','1281',0.15,'EPSG','8666','Geoid (height correction) model file','AUSGeoid09_V1.01.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus09 mainland',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','5657','GDA94 to AHD (Tasmania) height (2)','Replaces AusGeoid98 model. Uses AusGeoid09 model which uses bi-cubic interpolation; bi-linear interpolation of the grid file will give results agreeing to within 1cm 99.97% of the time. May be used for transformations from WGS 84 to AHD (Tasmania).','Derivation of gravity-related heights from GPS observations.','EPSG','1048','Geographic3D to GravityRelatedHeight (AUSGeoid v2)','EPSG','4939','EPSG','5712','EPSG','2947',0.03,'EPSG','8666','Geoid (height correction) model file','AUSGeoid09_GDA94_V1.01_DOV_windows.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus09 Tas',0);
INSERT INTO "grid_transformation" VALUES('EPSG','5661','ED50 to ETRS89 (14)','When included in concatenation from and to projected CRSs, gives same results as ED50 / UTM zone 31N to ETRS89 / UTM zone 31N (1) - see CRS code 5166.','For applications to an accuracy of 0.05 m (map scales not larger than 1:1000).','EPSG','9615','NTv2','EPSG','4230','EPSG','4258','EPSG','3732',0.05,'EPSG','8656','Latitude and longitude difference file','100800401.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ICC-Esp Cat',0);
INSERT INTO "grid_transformation" VALUES('EPSG','5891','MGI to ETRS89 (5)','Not to be used for cadastral purposes as it does not comply with the rules for control network tie-in as per Paragraph 3 of the Land Survey Regulations (Vermessungsverordnung) 2010.','For applications to an accuracy of 1 decimetre: GIS, topographic mapping, engineering survey. (See remarks for cadastral survey).','EPSG','9615','NTv2','EPSG','4312','EPSG','4258','EPSG','1037',0.15,'EPSG','8656','Latitude and longitude difference file','AT_GIS_GRID.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut NTv2',0);
INSERT INTO "grid_transformation" VALUES('EPSG','6138','CIGD11 to GCVD54 height (ft) (1)','Care: source CRS heights are in metres, transformation file parameter values and target CRS heights are in feet.','Derivation of gravity-related heights from GPS observations.','EPSG','1050','Geographic3D to GravityRelatedHeight (CI)','EPSG','6134','EPSG','6130','EPSG','3185',0.03,'EPSG','8666','Geoid (height correction) model file','GCGM0811.TXT',NULL,NULL,NULL,NULL,NULL,NULL,'LSD-Cym',0);
@@ -260,7 +260,7 @@ INSERT INTO "grid_transformation" VALUES('EPSG','8444','GDA94 to GDA2020 (4)','S
INSERT INTO "grid_transformation" VALUES('EPSG','8445','GDA94 to GDA2020 (5)','See GDA94 to GDA2020 (1) (code 8048) for transformation using Helmert method which gives identical results.','Spatial referencing.','EPSG','9615','NTv2','EPSG','4283','EPSG','7844','EPSG','1069',0.05,'EPSG','8656','Latitude and longitude difference file','GDA94_GDA2020_conformal_cocos_island.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ICSM-Cck Conf',0);
INSERT INTO "grid_transformation" VALUES('EPSG','8446','GDA94 to GDA2020 (3)','Gives identical results to Helmert transformation GDA94 to GDA2020 (1) (code 8048). See GDA94 to GDA2020 (2) (code 8447) for alternative with local distortion modelling included. GDA2020 Technical Manual and fact sheet T1 give guidance on which to use.','Conformal transformation of GDA94 coordinates that have been derived through GNSS CORS.','EPSG','9615','NTv2','EPSG','4283','EPSG','7844','EPSG','2575',0.05,'EPSG','8656','Latitude and longitude difference file','GDA94_GDA2020_conformal.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ICSM-Aus NTv2 Conf',0);
INSERT INTO "grid_transformation" VALUES('EPSG','8447','GDA94 to GDA2020 (2)','See GDA94 to GDA2020 (1) or (3) (codes 8048 and 8446) for alternative conformal-only transformation without local distortion modelling. GDA2020 Technical Manual and fact sheet T1 give guidance on which to use.','Transformation of GDA94 coordinates when localised distortion needs to be taken into account, e.g. if GDA94 coordinates were derived survey control monuments.','EPSG','9615','NTv2','EPSG','4283','EPSG','7844','EPSG','2575',0.05,'EPSG','8656','Latitude and longitude difference file','GDA94_GDA2020_conformal_and_distortion.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ICSM-Aus Conf and Dist',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','8451','GDA2020 to AHD height (1)','Uncertainties given in accompanying file AUSGeoid2020_windows_binary_uncertainty.gsb','Derivation of gravity-related heights from GNSS observations.','EPSG','1048','Geographic3D to GravityRelatedHeight (Ausgeoid v2)','EPSG','7843','EPSG','5711','EPSG','4493',0.03,'EPSG','8666','Geoid (height correction) model file','AUSGeoid2020_windows_binary.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus 2020',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','8451','GDA2020 to AHD height (1)','File name previously called AUSGeoid2020_windows_binary.gsb. Uncertainties given in accompanying file AUSGeoid2020_20180201_error.gsb. For reversible alternative to this transformation see GDA2020 to GDA2020 + AHD height (1) (code 9466).','Derivation of gravity-related heights from GNSS observations.','EPSG','1048','Geographic3D to GravityRelatedHeight (AUSGeoid v2)','EPSG','7843','EPSG','5711','EPSG','4493',0.15,'EPSG','8666','Geoid (height correction) model file','AUSGeoid2020_20180201.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus 2020',0);
INSERT INTO "grid_transformation" VALUES('EPSG','8546','St. George Island to NAD83 (2)','Uses NADCON5 method which expects longitudes positive east in range 0-360°; EPSG source and target CRSs have longitudes positive east in range -180° to +180°.','Spatial referencing.','EPSG','1074','NADCON5 (2D)','EPSG','4138','EPSG','4269','EPSG','1331',0.15,'EPSG','8657','Latitude difference file','nadcon5.sg1952.nad83_1986.stgeorge.lat.trn.20160901.b','EPSG','8658','Longitude difference file','nadcon5.sg1952.nad83_1986.stgeorge.lon.trn.20160901.b',NULL,NULL,'NGS-Usa AK StG Nadcon5',0);
INSERT INTO "grid_transformation" VALUES('EPSG','8547','St. Lawrence Island to NAD83 (2)','Uses NADCON5 method which expects longitudes positive east in range 0-360°; EPSG source and target CRSs have longitudes positive east in range -180° to +180°.','Spatial referencing.','EPSG','1074','NADCON5 (2D)','EPSG','4136','EPSG','4269','EPSG','1332',0.5,'EPSG','8657','Latitude difference file','nadcon5.sl1952.nad83_1986.stlawrence.lat.trn.20160901.b','EPSG','8658','Longitude difference file','nadcon5.sl1952.nad83_1986.stlawrence.lon.trn.20160901.b',NULL,NULL,'NGS-Usa AK StL Nadcon5',0);
INSERT INTO "grid_transformation" VALUES('EPSG','8548','St. Paul Island to NAD83 (2)','Uses NADCON5 method which expects longitudes positive east in range 0-360°; EPSG source and target CRSs have longitudes positive east in range -180° to +180°.','Spatial referencing.','EPSG','1074','NADCON5 (2D)','EPSG','4137','EPSG','4269','EPSG','1333',0.5,'EPSG','8657','Latitude difference file','nadcon5.sp1952.nad83_1986.stpaul.lat.trn.20160901.b','EPSG','8658','Longitude difference file','nadcon5.sp1952.nad83_1986.stpaul.lon.trn.20160901.b',NULL,NULL,'NGS-Usa AK StP Nadcon5',0);
@@ -347,10 +347,11 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9276','ETRS89 to EVRF2000 Austr
INSERT INTO "grid_transformation" VALUES('EPSG','9277','MGI to EVRF2000 Austria height (1)','Austrian Geoid 2008 (Bessel ellipsoid). Accuracy 5cm (1 sigma). The transformation is implemented in BEV-Transformator.','Derivation of gravity-related heights from GNSS observations.','EPSG','1081','Geographic3D to GravityRelatedHeight (BEV AT)','EPSG','9267','EPSG','9274','EPSG','1037',0.05,'EPSG','8666','Geoid (height correction) model file','GEOID_BESSEL_Oesterreich.csv',NULL,NULL,NULL,NULL,'EPSG','4312','BEV-Aut',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9278','ETRS89 to GHA height (1)','This transformation gives same result as concatenation of ETRS89 to EVRF2000 Austria height and EVRF2000 Austria height to GHA height transformations, CTs code 9276 and 9275. Accuracy 5cm (1 sigma). The transformation is implemented in BEV-Transformator.','Derivation of gravity-related heights from GNSS observations.','EPSG','1081','Geographic3D to GravityRelatedHeight (BEV AT)','EPSG','4937','EPSG','5778','EPSG','1037',0.05,'EPSG','8666','Geoid (height correction) model file','GV_Hoehengrid_plus_Geoid_V3.csv',NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9280','ITRF2005 to SA LLD height (1)','Hybrid geoid referenced to ITRF2005@2010.02. Accuracy 7cm at 1 sigma.','Derivation of gravity-related heights from GNSS observations.','EPSG','1082','Geographic3D to GravityRelatedHeight (SA 2010)','EPSG','7910','EPSG','9279','EPSG','3309',0.07,'EPSG','8666','Geoid (height correction) model file','SAGEOID2010.dat',NULL,NULL,NULL,NULL,NULL,NULL,'NGI-Zaf',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','9282','Amersfoort to ETRS89 (9)','Consistent to within 1mm with official RNAPTRANS(TM)2018 at ground level onshore and at MSL offshore. The horizontal deviation using this NTv2 grid is approximately 1mm per 50m height difference from ground level or MSL.','Approximation of horizontal component of official 3D RDNAPTRANS(TM) transformation, which since 1st October 2000 has defined Amersfoort geodetic datum.','EPSG','9615','NTv2','EPSG','4289','EPSG','4258','EPSG','1275',0.001,'EPSG','8656','Latitude and longitude difference file','rdtrans2018.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NSGI-Nld 2018',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','9283','ETRS89 to NAP height (2)','Vertical component of official RDNAPTRANS(TM)2018 procedure. Replaces previous versions of RDNAPTRANS.','Derivation of gravity-related heights from GPS observations.','EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)','EPSG','4937','EPSG','5709','EPSG','1275',0.001,'EPSG','8666','Geoid (height correction) model file','nlgeo2018.gtx',NULL,NULL,NULL,NULL,NULL,NULL,'NSGI-Nld 2018',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9282','Amersfoort to ETRS89 (9)','Replaces Amersfoort to ETRS89 (7) (tfm code 7000). Horizontal component of official transformation RDNAPTRANS(TM)2018.','Geodesy, engineering survey.','EPSG','9615','NTv2','EPSG','4289','EPSG','4258','EPSG','1275',0.001,'EPSG','8656','Latitude and longitude difference file','rdtrans2018.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NSGI-Nld 2018',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9283','ETRS89 to NAP height (2)','Vertical component of official transformation RDNAPTRANS(TM)2018. Replaces earlier versions of RDNAPTRANS(TM).','Derivation of gravity-related heights from GNSS (GPS) observations.','EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)','EPSG','4937','EPSG','5709','EPSG','1172',0.01,'EPSG','8666','Geoid (height correction) model file','nlgeo2018.gtx',NULL,NULL,NULL,NULL,NULL,NULL,'NSGI-Nld 2018',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9302','HS2-IRF to ETRS89 (1)','In conjunction with the HS2-TM projection (code 9301), emulates zero-distortion HS2P1+14 Snake projection. For use with OSNet v2009 CORS. Supersedes HS2TN02 used with OSNet v2001. Derived at 350000 locations, RMS 0.15 mm; this is considered errorless.','Engineering survey for HS2 project phases 1 and 2a.','EPSG','9615','NTv2','EPSG','9299','EPSG','4258','EPSG','4582',0.0,'EPSG','8656','Latitude and longitude difference file','HS2TN15_NTv2.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'HS2-Gbr OSNet2009',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9304','ETRS89 to HS2-VRF height (1)','Defines HS2-VRF using OSNet v2009. Full grid also available in a single file in each of Leica, Topcon and Trimble formats.','Derivation of gravity-related heights from GNSS observations.','EPSG','9661','Geographic3D to GravityRelatedHeight (EGM)','EPSG','4937','EPSG','9303','EPSG','4582',0.001,'EPSG','8666','Geoid (height correction) model file','HS2GM15W.grd',NULL,NULL,NULL,NULL,NULL,NULL,'HS2-Gbr HS2GM15 W',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9305','SRGI2013 to INAGeoid2020 height (1)','Defines INAGeoid2020 reference surface and as such Operation Accuracy is considered to be errorless. Internal accuracy is between 0.05 and 0.24 metres on the large islands of Indonesia.','Derivation of gravity-related heights from GPS observations.','EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)','EPSG','9469','EPSG','9471','EPSG','1122',0.0,'EPSG','8666','Geoid (height correction) model file','INAGEOID20.gtx',NULL,NULL,NULL,NULL,NULL,NULL,'BIG-Idn INAGeoid20',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9310','DHDN to ETRS89 (10)','Replaces SeTa2009 from 2018-01-15. Derived using the 2016 implementation of ETRS89 / DREF91 and DHHN2016. Coincident with the transformation of cadastral data from DHDN to ETRS89 used by LVGL at a level of 1-2 mm.','Cadastre, engineering survey, topographic mapping (large scale).','EPSG','9615','NTv2','EPSG','4314','EPSG','4258','EPSG','4584',0.01,'EPSG','8656','Latitude and longitude difference file','SeTa2016.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'LVGL-Deu SL 2016',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9312','NZVD2016 height to Auckland 1946 height (2)','Derived at 260 control points. Mean offset 0.292m, standard deviation 0.029m, maximum difference from mean 0.075m. Supersedes NZVD2016 height to Auckland 1946 height (1) (code 7860) after change of grid file format.','Transformation between national and local height systems.','EPSG','1084','Vertical Offset by Grid Interpolation (gtx)','EPSG','7839','EPSG','5759','EPSG','3764',0.02,'EPSG','8732','Vertical offset file','auckht1946-nzvd2016.gtx',NULL,NULL,NULL,NULL,'EPSG','4167','LINZ-NZ AUCK gtx',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9313','NZVD2016 height to Bluff 1955 height (2)','Derived at 71 control points. Mean offset 0.273m, standard deviation 0.034m, maximum difference from mean 0.079m. Supersedes NZVD2016 height to Bluff 1955 height (1) (code 7861) after change of grid file format.','Transformation between national and local height systems.','EPSG','1084','Vertical Offset by Grid Interpolation (gtx)','EPSG','7839','EPSG','5760','EPSG','3801',0.02,'EPSG','8732','Vertical offset file','blufht1955-nzvd2016.gtx',NULL,NULL,NULL,NULL,'EPSG','4167','LINZ-NZ BLUF gtx',0);
@@ -407,6 +408,11 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9442','SVS2010 height to EVRF20
INSERT INTO "grid_transformation" VALUES('EPSG','9443','LHN95 height to EVRF2019 height (1)','Determined at 553 points, SD 0.075m. Offset: mean -0.204m, minimum -0.330m, maximum -0.130m.','Vertical datum change.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9389','EPSG','1286',0.15,'EPSG','8732','Vertical offset file','ch_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9444','LHN95 height to EVRF2019 mean-tide height (1)','Determined at 553 points, SD 0.073m. Offset: mean -0.233m, minimum -0.353m, maximum -0.044m.','Vertical datum change.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9390','EPSG','1286',0.146,'EPSG','8732','Vertical offset file','ch_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9445','ODN height to EVRF2019 height (1)','Determined at 35 points, SD 0.011m. Offset: mean -0.181m, minimum -0.202m, maximum -0.161m.','Vertical datum change.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5701','EPSG','9389','EPSG','2792',0.022,'EPSG','8732','Vertical offset file','gb_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Gbr 2019z',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9454','ETRS89 to GBK19-IRF (1)','In conjunction with the GBK19-TM map projection (code 9455) applied to GBK19-IRF (code 9453), emulates the GBK19 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009 CORS) defines GBK19-IRF hence is errorless.','Engineering survey and topographic mapping for railway applications.','EPSG','9615','NTv2','EPSG','4258','EPSG','9453','EPSG','4607',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-GBK19-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr GBK19 OSNet2009',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9461','GDA2020 to AVWS height (1)','AGQG is used to realise AVWS. Uncertainties (4-8 cm across mainland Australia) given in accompanying file AGQG_uncertainty_20191107.gsb. For reversible alternative to this transformation see GDA2020 to GDA2020 + AVWS height (1) (code 9465).','Geodesy, hydrography, transfer of accurate heights over distances greater than 10km.','EPSG','1048','Geographic3D to GravityRelatedHeight (AUSGeoid v2)','EPSG','7843','EPSG','9458','EPSG','4177',0.1,'EPSG','8666','Geoid (height correction) model file','AGQG_20191107.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus AGQG 20191107',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9465','GDA2020 to GDA2020 + AVWS height (1)','Reversible alternative to GDA2020 to AVWS height (1) (code 9461). AGQG is used to realise AVWS. Uncertainties (4-8 cm across mainland Australia) given in accompanying file AGQG_uncertainty_20191107.gsb.','Derivation of gravity-related heights from GNSS observations.','EPSG','1083','Geog3D to Geog2D+Vertical (AUSGeoid v2)','EPSG','7843','EPSG','9462','EPSG','4177',0.1,'EPSG','8666','Geoid (height correction) model file','AGQG_20191107.gsb',NULL,NULL,NULL,NULL,'EPSG','7844','GA-Aus AGQG 20191107',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9466','GDA2020 to GDA2020 + AHD height (1)','Reversible alternative to GDA2020 to AHD height (1) (code 8451). Uncertainties given in accompanying file AUSGeoid2020_20180201_error.gsb','Derivation of gravity-related heights from GNSS observations.','EPSG','1083','Geog3D to Geog2D+Vertical (AUSGeoid v2)','EPSG','7843','EPSG','9463','EPSG','4493',0.15,'EPSG','8666','Geoid (height correction) model file','AUSGeoid2020_20180201.gsb',NULL,NULL,NULL,NULL,'EPSG','7844','GA-Aus 2020',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','9467','GDA94 to GDA94 + AHD height (1)','Reversible alternative to GDA94 to AHD height (1) (code 5656). Uses AUSGeoid09 model which uses bi-cubic interpolation; bi-linear interpolation of the grid file will give results agreeing to within 1cm 99.97% of the time.','Derivation of gravity-related heights from GPS observations.','EPSG','1083','Geog3D to Geog2D+Vertical (AUSGeoid v2)','EPSG','4939','EPSG','9464','EPSG','4493',0.15,'EPSG','8666','Geoid (height correction) model file','AUSGeoid09_V1.01.gsb',NULL,NULL,NULL,NULL,'EPSG','4283','GA-Aus09',0);
INSERT INTO "grid_transformation" VALUES('EPSG','10000','RGF93 to NGF-IGN69 height (1)','May be used for transformations from WGS 84 to NGF-IGN69. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','Derivation of gravity-related heights from GPS observations.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4965','EPSG','5720','EPSG','1326',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0);
INSERT INTO "grid_transformation" VALUES('EPSG','10001','ETRS89 to NGF-IGN69 height (1)','Parameter values taken from RGF93 to NGF-IGN69 (1) (code 10000) assuming that RGF93 is equivalent to ETRS89 within the accuracy of the transformation. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','Derivation of gravity-related heights from GPS observations.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4937','EPSG','5720','EPSG','1326',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0);
INSERT INTO "grid_transformation" VALUES('EPSG','10002','RGF93 to NGF-IGN78 height (1)','May be used for transformations from WGS 84 to NGF-IGN78. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','Derivation of gravity-related heights from GPS observations.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4965','EPSG','5721','EPSG','1327',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a_corse.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra Cor',0);
@@ -442,55 +448,55 @@ INSERT INTO "grid_transformation" VALUES('EPSG','10031','ETRS89 to St. Kilda hei
INSERT INTO "grid_transformation" VALUES('EPSG','10032','ETRS89 to St. Marys height (1)','May be used for transformations from WGS 84 to St. Marys.','Derivation of gravity-related heights from GPS observations.','EPSG','9663','Geographic3D to GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','5749','EPSG','2802',0.0,'EPSG','8666','Geoid (height correction) model file','OSTN02_OSGM02_GB.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-UK Scilly',0);
INSERT INTO "grid_transformation" VALUES('EPSG','10033','ETRS89 to Stornoway height (1)','May be used for transformations from WGS 84 to Stornoway.','Derivation of gravity-related heights from GPS observations.','EPSG','9663','Geographic3D to GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','5746','EPSG','2799',0.05,'EPSG','8666','Geoid (height correction) model file','OSTN02_OSGM02_GB.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-UK Heb',0);
INSERT INTO "grid_transformation" VALUES('EPSG','10034','ETRS89 to Sule Skerry height (1)','May be used for transformations from WGS 84 to Sule Skerry.','Derivation of gravity-related heights from GPS observations.','EPSG','9663','Geographic3D to GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','5744','EPSG','2797',0.05,'EPSG','8666','Geoid (height correction) model file','OSTN02_OSGM02_GB.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-UK Sule',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10035','GDA94 to AHD height (1)','May be used for transformations from WGS 84 to AHD.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2899',0.4,'EPSG','8666','Geoid (height correction) model file','SC52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SC52',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10036','GDA94 to AHD height (2)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2900',0.4,'EPSG','8666','Geoid (height correction) model file','SC53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SC53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10037','GDA94 to AHD height (3)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2901',0.4,'EPSG','8666','Geoid (height correction) model file','SC54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SC54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10038','GDA94 to AHD height (4)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2902',0.4,'EPSG','8666','Geoid (height correction) model file','SD51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD51',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10039','GDA94 to AHD height (5)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2903',0.4,'EPSG','8666','Geoid (height correction) model file','SD52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD52',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10040','GDA94 to AHD height (6)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2904',0.4,'EPSG','8666','Geoid (height correction) model file','SD53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10041','GDA94 to AHD height (7)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2905',0.4,'EPSG','8666','Geoid (height correction) model file','SD54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10042','GDA94 to AHD height (8)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2906',0.4,'EPSG','8666','Geoid (height correction) model file','SD55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10043','GDA94 to AHD height (9)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2907',0.4,'EPSG','8666','Geoid (height correction) model file','SE50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE50',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10044','GDA94 to AHD height (10)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2908',0.4,'EPSG','8666','Geoid (height correction) model file','SE51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE51',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10045','GDA94 to AHD height (11)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2909',0.4,'EPSG','8666','Geoid (height correction) model file','SE52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE52',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10046','GDA94 to AHD height (12)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2910',0.4,'EPSG','8666','Geoid (height correction) model file','SE53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10047','GDA94 to AHD height (13)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2911',0.4,'EPSG','8666','Geoid (height correction) model file','SE54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10048','GDA94 to AHD height (14)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2912',0.4,'EPSG','8666','Geoid (height correction) model file','SE55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10049','GDA94 to AHD height (15)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2913',0.4,'EPSG','8666','Geoid (height correction) model file','SF49_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF49',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10050','GDA94 to AHD height (16)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2914',0.4,'EPSG','8666','Geoid (height correction) model file','SF50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF50',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10051','GDA94 to AHD height (17)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2915',0.4,'EPSG','8666','Geoid (height correction) model file','SF51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF51',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10052','GDA94 to AHD height (18)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2916',0.4,'EPSG','8666','Geoid (height correction) model file','SF52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF52',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10053','GDA94 to AHD height (19)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2917',0.4,'EPSG','8666','Geoid (height correction) model file','SF53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10054','GDA94 to AHD height (20)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2918',0.4,'EPSG','8666','Geoid (height correction) model file','SF54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10055','GDA94 to AHD height (21)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2919',0.4,'EPSG','8666','Geoid (height correction) model file','SF55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10056','GDA94 to AHD height (22)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2920',0.4,'EPSG','8666','Geoid (height correction) model file','SF56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF56',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10057','GDA94 to AHD height (23)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2921',0.4,'EPSG','8666','Geoid (height correction) model file','SG49_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG49',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10058','GDA94 to AHD height (24)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2922',0.4,'EPSG','8666','Geoid (height correction) model file','SG50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG50',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10059','GDA94 to AHD height (25)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2923',0.4,'EPSG','8666','Geoid (height correction) model file','SG51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG51',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10060','GDA94 to AHD height (26)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2924',0.4,'EPSG','8666','Geoid (height correction) model file','SG52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG52',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10061','GDA94 to AHD height (27)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2925',0.4,'EPSG','8666','Geoid (height correction) model file','SG53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10062','GDA94 to AHD height (28)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2926',0.4,'EPSG','8666','Geoid (height correction) model file','SG54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10063','GDA94 to AHD height (29)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2927',0.4,'EPSG','8666','Geoid (height correction) model file','SG55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10064','GDA94 to AHD height (30)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2928',0.4,'EPSG','8666','Geoid (height correction) model file','SG56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG56',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10065','GDA94 to AHD height (31)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2929',0.4,'EPSG','8666','Geoid (height correction) model file','SH49_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH49',1);
-INSERT INTO "grid_transformation" VALUES('EPSG','10066','GDA94 to AHD height (32)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2930',0.4,'EPSG','8666','Geoid (height correction) model file','SH50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH50',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10067','GDA94 to AHD height (33)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2931',0.4,'EPSG','8666','Geoid (height correction) model file','SH51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH51',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10068','GDA94 to AHD height (34)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2932',0.4,'EPSG','8666','Geoid (height correction) model file','SH52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH52',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10069','GDA94 to AHD height (35)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2933',0.4,'EPSG','8666','Geoid (height correction) model file','SH53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10070','GDA94 to AHD height (36)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2934',0.4,'EPSG','8666','Geoid (height correction) model file','SH54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10071','GDA94 to AHD height (37)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2935',0.4,'EPSG','8666','Geoid (height correction) model file','SH55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10072','GDA94 to AHD height (38)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2936',0.4,'EPSG','8666','Geoid (height correction) model file','SH56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH56',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10073','GDA94 to AHD height (39)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2937',0.4,'EPSG','8666','Geoid (height correction) model file','SI50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI50',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10074','GDA94 to AHD height (40)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2938',0.4,'EPSG','8666','Geoid (height correction) model file','SI51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI51',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10075','GDA94 to AHD height (41)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2939',0.4,'EPSG','8666','Geoid (height correction) model file','SI53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10076','GDA94 to AHD height (42)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2940',0.4,'EPSG','8666','Geoid (height correction) model file','SI54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10077','GDA94 to AHD height (43)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2941',0.4,'EPSG','8666','Geoid (height correction) model file','SI55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10078','GDA94 to AHD height (44)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2942',0.4,'EPSG','8666','Geoid (height correction) model file','SI56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI56',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10079','GDA94 to AHD height (45)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2943',0.4,'EPSG','8666','Geoid (height correction) model file','SJ53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ53',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10080','GDA94 to AHD height (46)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2944',0.4,'EPSG','8666','Geoid (height correction) model file','SJ54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ54',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10081','GDA94 to AHD height (47)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2945',0.4,'EPSG','8666','Geoid (height correction) model file','SJ55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ55',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10082','GDA94 to AHD height (48)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5711','EPSG','2946',0.4,'EPSG','8666','Geoid (height correction) model file','SJ56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ56',0);
-INSERT INTO "grid_transformation" VALUES('EPSG','10083','GDA94 to AHD (Tasmania) height (1)','May be used for transformations from WGS 84 to AHD (Tasmania). Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (Ausgeoid98)','EPSG','4939','EPSG','5712','EPSG','2947',0.4,'EPSG','8666','Geoid (height correction) model file','SK55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SK55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10035','GDA94 to AHD height (1)','May be used for transformations from WGS 84 to AHD.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2899',0.4,'EPSG','8666','Geoid (height correction) model file','SC52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SC52',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10036','GDA94 to AHD height (2)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2900',0.4,'EPSG','8666','Geoid (height correction) model file','SC53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SC53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10037','GDA94 to AHD height (3)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2901',0.4,'EPSG','8666','Geoid (height correction) model file','SC54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SC54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10038','GDA94 to AHD height (4)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2902',0.4,'EPSG','8666','Geoid (height correction) model file','SD51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD51',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10039','GDA94 to AHD height (5)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2903',0.4,'EPSG','8666','Geoid (height correction) model file','SD52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD52',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10040','GDA94 to AHD height (6)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2904',0.4,'EPSG','8666','Geoid (height correction) model file','SD53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10041','GDA94 to AHD height (7)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2905',0.4,'EPSG','8666','Geoid (height correction) model file','SD54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10042','GDA94 to AHD height (8)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2906',0.4,'EPSG','8666','Geoid (height correction) model file','SD55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SD55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10043','GDA94 to AHD height (9)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2907',0.4,'EPSG','8666','Geoid (height correction) model file','SE50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE50',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10044','GDA94 to AHD height (10)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2908',0.4,'EPSG','8666','Geoid (height correction) model file','SE51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE51',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10045','GDA94 to AHD height (11)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2909',0.4,'EPSG','8666','Geoid (height correction) model file','SE52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE52',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10046','GDA94 to AHD height (12)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2910',0.4,'EPSG','8666','Geoid (height correction) model file','SE53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10047','GDA94 to AHD height (13)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2911',0.4,'EPSG','8666','Geoid (height correction) model file','SE54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10048','GDA94 to AHD height (14)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2912',0.4,'EPSG','8666','Geoid (height correction) model file','SE55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SE55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10049','GDA94 to AHD height (15)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2913',0.4,'EPSG','8666','Geoid (height correction) model file','SF49_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF49',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10050','GDA94 to AHD height (16)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2914',0.4,'EPSG','8666','Geoid (height correction) model file','SF50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF50',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10051','GDA94 to AHD height (17)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2915',0.4,'EPSG','8666','Geoid (height correction) model file','SF51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF51',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10052','GDA94 to AHD height (18)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2916',0.4,'EPSG','8666','Geoid (height correction) model file','SF52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF52',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10053','GDA94 to AHD height (19)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2917',0.4,'EPSG','8666','Geoid (height correction) model file','SF53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10054','GDA94 to AHD height (20)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2918',0.4,'EPSG','8666','Geoid (height correction) model file','SF54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10055','GDA94 to AHD height (21)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2919',0.4,'EPSG','8666','Geoid (height correction) model file','SF55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10056','GDA94 to AHD height (22)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2920',0.4,'EPSG','8666','Geoid (height correction) model file','SF56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SF56',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10057','GDA94 to AHD height (23)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2921',0.4,'EPSG','8666','Geoid (height correction) model file','SG49_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG49',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10058','GDA94 to AHD height (24)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2922',0.4,'EPSG','8666','Geoid (height correction) model file','SG50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG50',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10059','GDA94 to AHD height (25)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2923',0.4,'EPSG','8666','Geoid (height correction) model file','SG51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG51',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10060','GDA94 to AHD height (26)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2924',0.4,'EPSG','8666','Geoid (height correction) model file','SG52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG52',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10061','GDA94 to AHD height (27)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2925',0.4,'EPSG','8666','Geoid (height correction) model file','SG53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10062','GDA94 to AHD height (28)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2926',0.4,'EPSG','8666','Geoid (height correction) model file','SG54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10063','GDA94 to AHD height (29)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2927',0.4,'EPSG','8666','Geoid (height correction) model file','SG55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10064','GDA94 to AHD height (30)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2928',0.4,'EPSG','8666','Geoid (height correction) model file','SG56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SG56',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10065','GDA94 to AHD height (31)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2929',0.4,'EPSG','8666','Geoid (height correction) model file','SH49_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH49',1);
+INSERT INTO "grid_transformation" VALUES('EPSG','10066','GDA94 to AHD height (32)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2930',0.4,'EPSG','8666','Geoid (height correction) model file','SH50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH50',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10067','GDA94 to AHD height (33)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2931',0.4,'EPSG','8666','Geoid (height correction) model file','SH51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH51',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10068','GDA94 to AHD height (34)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2932',0.4,'EPSG','8666','Geoid (height correction) model file','SH52_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH52',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10069','GDA94 to AHD height (35)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2933',0.4,'EPSG','8666','Geoid (height correction) model file','SH53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10070','GDA94 to AHD height (36)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2934',0.4,'EPSG','8666','Geoid (height correction) model file','SH54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10071','GDA94 to AHD height (37)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2935',0.4,'EPSG','8666','Geoid (height correction) model file','SH55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10072','GDA94 to AHD height (38)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2936',0.4,'EPSG','8666','Geoid (height correction) model file','SH56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SH56',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10073','GDA94 to AHD height (39)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2937',0.4,'EPSG','8666','Geoid (height correction) model file','SI50_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI50',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10074','GDA94 to AHD height (40)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2938',0.4,'EPSG','8666','Geoid (height correction) model file','SI51_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI51',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10075','GDA94 to AHD height (41)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2939',0.4,'EPSG','8666','Geoid (height correction) model file','SI53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10076','GDA94 to AHD height (42)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2940',0.4,'EPSG','8666','Geoid (height correction) model file','SI54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10077','GDA94 to AHD height (43)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2941',0.4,'EPSG','8666','Geoid (height correction) model file','SI55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10078','GDA94 to AHD height (44)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2942',0.4,'EPSG','8666','Geoid (height correction) model file','SI56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SI56',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10079','GDA94 to AHD height (45)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2943',0.4,'EPSG','8666','Geoid (height correction) model file','SJ53_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ53',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10080','GDA94 to AHD height (46)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2944',0.4,'EPSG','8666','Geoid (height correction) model file','SJ54_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ54',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10081','GDA94 to AHD height (47)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2945',0.4,'EPSG','8666','Geoid (height correction) model file','SJ55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ55',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10082','GDA94 to AHD height (48)','May be used for transformations from WGS 84 to AHD. Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5711','EPSG','2946',0.4,'EPSG','8666','Geoid (height correction) model file','SJ56_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SJ56',0);
+INSERT INTO "grid_transformation" VALUES('EPSG','10083','GDA94 to AHD (Tasmania) height (1)','May be used for transformations from WGS 84 to AHD (Tasmania). Uses AusGeoid98 model.','Derivation of gravity-related heights from GPS observations.','EPSG','9662','Geographic3D to GravityRelatedHeight (AUSGeoid98)','EPSG','4939','EPSG','5712','EPSG','2947',0.4,'EPSG','8666','Geoid (height correction) model file','SK55_DAT.htm',NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus SK55',0);
INSERT INTO "grid_transformation" VALUES('EPSG','10084','WGS 84 to EGM96 height (1)','Replaces WGS 84 to EGM84 height (1) (tfm code 15781). Replaced by WGS 84 to EGM2008 height (1) and (2) (tfm codes 3858-59). An executable using spherical harmonics is also available.','Derivation of gravity-related heights from GPS observations.','EPSG','9661','Geographic3D to GravityRelatedHeight (EGM)','EPSG','4979','EPSG','5773','EPSG','1262',1.0,'EPSG','8666','Geoid (height correction) model file','WW15MGH.GRD',NULL,NULL,NULL,NULL,NULL,NULL,'NGA-World',0);
INSERT INTO "grid_transformation" VALUES('EPSG','15486','CH1903 to CH1903+ (1)','For improved accuracy (0.01m) use CHENyx06 interpolation programme FINELTRA. File CHENyx06 replaced by CHENyx06a; there is a small area at the border of the data where some more real data has been introduced. swisstopo consider the change insignificant.','Approximation using NTv2 method of results of FINELTRA programme to an accuracy of 0.01m except at boundary of the Geneva and Vaud cantons, in city of Geneva and in the main valleys of Valais canton where differences are up to 20 cm.','EPSG','9615','NTv2','EPSG','4149','EPSG','4150','EPSG','1286',0.2,'EPSG','8656','Latitude and longitude difference file','CHENyx06a.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che',0);
INSERT INTO "grid_transformation" VALUES('EPSG','15488','RRAF 1991 to IGN 1988 MG height (1)','May be used for transformations from WGS 84 to IGN 1988 MG. Accuracy at each 0.025 deg x 0.025 degree grid node is given within the geoid model file.','Derivation of gravity-related heights from GPS observations. Accuracy 0.2m within onshore area.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4973','EPSG','5617','EPSG','2894',0.2,'EPSG','8666','Geoid (height correction) model file','ggg00_mg.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Glp MG',1);
diff --git a/data/sql/helmert_transformation.sql b/data/sql/helmert_transformation.sql
index a5705c06..63b0ecf0 100644
--- a/data/sql/helmert_transformation.sql
+++ b/data/sql/helmert_transformation.sql
@@ -993,7 +993,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','7951','ITRF2008 to ETRF2000
INSERT INTO "helmert_transformation" VALUES('EPSG','7960','PZ-90.11 to ITRF2008 (1)','','Geodesy.','EPSG','1066','Time-specific Coordinate Frame rotation (geocen)','EPSG','7679','EPSG','5332','EPSG','1262',0.004,-0.003,-0.001,0.0,'EPSG','9001',0.019,-0.042,0.002,'EPSG','1031',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'MTD-Rus',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','7961','WGS 84 (G1150) to PZ-90.02 (1)','','Geodesy.','EPSG','1066','Time-specific Coordinate Frame rotation (geocen)','EPSG','7660','EPSG','7677','EPSG','1262',0.17,0.36,-0.08,-0.18,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2002.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'MTD-Rus',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','8048','GDA94 to GDA2020 (1)','Scale difference in ppb where 1/billion = 1E-9. See CT codes 8444-46 for NTv2 method giving equivalent results for Christmas Island, Cocos Islands and Australia respectively. See CT code 8447 for alternative including distortion model for Australia only.','Conformal transformation of GDA94 coordinates that have been derived through GNSS CORS.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4283','EPSG','7844','EPSG','4177',0.01,61.55,-10.87,-40.19,'EPSG','1025',-39.4924,-32.7221,-32.8979,'EPSG','1031',-9.994,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ICSM-Aus',0);
-INSERT INTO "helmert_transformation" VALUES('EPSG','8049','ITRF2014 to GDA2020 (1)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. Derived at 109 stations of the Australian Reginal GNSS network (ARGN).','Geodesy. RMS residuals 26mm north, 12mm east and 179mm vertical, maximum residuals 49mm north, 24mm east and 464mm vertical.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','7789','EPSG','7842','EPSG','4177',0.001,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',1.50379,1.18346,1.20716,'EPSG','1032',0.0,'EPSG','1030',2020.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'GA-Aus',0);
+INSERT INTO "helmert_transformation" VALUES('EPSG','8049','ITRF2014 to GDA2020 (1)','Derived at 109 stations of the Australian Regional GNSS network (ARGN). RMS residuals 26mm N, 12mm E and 179mm up, maximum residuals 49mm N, 24mm E and 464mm up. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m.','Geodesy.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','7789','EPSG','7842','EPSG','4177',0.03,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',1.50379,1.18346,1.20716,'EPSG','1032',0.0,'EPSG','1030',2020.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'GA-Aus',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','8069','ITRF88 to ITRF2014 (1)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. Derived by IERS from previously published information.','Geodesy','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4910','EPSG','7789','EPSG','1262',0.01,-25.4,0.5,154.8,'EPSG','1025',-0.1,0.0,-0.26,'EPSG','1031',-11.29,'EPSG','1028',-0.1,0.5,3.3,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','8070','ITRF89 to ITRF2014 (1)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. Derived by IERS from previously published information.','Geodesy','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4911','EPSG','7789','EPSG','1262',0.01,-30.4,-35.5,130.8,'EPSG','1025',0.0,0.0,-0.26,'EPSG','1031',-8.19,'EPSG','1028',-0.1,0.5,3.3,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','8071','ITRF90 to ITRF2014 (1)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. Derived by IERS from previously published information.','Geodesy','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4912','EPSG','7789','EPSG','1262',0.01,-25.4,-11.5,92.8,'EPSG','1025',0.0,0.0,-0.26,'EPSG','1031',-4.79,'EPSG','1028',-0.1,0.5,3.3,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0);
@@ -1177,7 +1177,8 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','9261','MMN to WGS 84 (1)',''
INSERT INTO "helmert_transformation" VALUES('EPSG','9262','MMS to WGS 84 (1)','','Oil and gas exploration and production.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','9253','EPSG','4326','EPSG','2357',2.5,-78.1,101.6,133.3,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'YPF-Arg MMS',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9263','Hito XVIII 1963 to WGS 84 (3)','','Oil and gas exploration and production.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4254','EPSG','4326','EPSG','2357',2.5,18.2,190.7,100.9,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'YPF-Arg TdF Hito',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9264','POSGAR 2007 to WGS 84 (2)','Derived as average at all points common between the POSGAR 94 and POSGAR 2007 networks. POSGAR 94 was adjusted to the WGS 84 coordinates of 20 stations in March to May 1994. Accuracy 0.1m in 1994 + 1.5cm per year.','Oil and gas exploration and production.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5340','EPSG','4326','EPSG','1033',0.5,-0.41,0.46,-0.35,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'YPF-Arg',0);
-INSERT INTO "helmert_transformation" VALUES('EPSG','9281','Amersfoort to ETRS89 (8)','Derived using ETRF2014. In RDNAPTRANS2018 software used assuming an ETRS89 ellipsoidal height of 43m and with an additional correction grid (corrections of up to 0.25m). Replaces Amersfoort to ETRS89 (5) and (6) (tfm codes 4830 and 4831).','Accuracy 0.25m','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4289','EPSG','4258','EPSG','1275',0.25,565.7381,50.4018,465.2904,'EPSG','9001',1.91514,-1.60363,9.09546,'EPSG','9109',4.07244,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IOGP-Nld 2018',0);
+INSERT INTO "helmert_transformation" VALUES('EPSG','9281','Amersfoort to ETRS89 (8)','Replaces Amersfoort to ETRS89 (5) and (6) (tfm codes 4830 and 4831). Derived using ETRF2000. In official transformation used with an ellipsoidal height of 0m in Amersfoort or 43m in ETRS89 and with an additional correction grid (up to 0.25m).','Horizontal accuracy 0.25m','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4289','EPSG','4258','EPSG','1275',0.25,565.7381,50.4018,465.2904,'EPSG','9001',1.91514,-1.60363,9.09546,'EPSG','9109',4.07244,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IOGP-Nld 2018',0);
+INSERT INTO "helmert_transformation" VALUES('EPSG','9291','ISN2016 to WGS 84 (1)','For many purposes ISN2016 can be considered to be coincident with WGS 84.','Approximation assuming equality between plate-fixed static and earth-fixed dynamic CRSs.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','8086','EPSG','4326','EPSG','1120',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'LMI-Isl',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9298','ONGD17 to WGS 84 (1)','','Geodesy.','EPSG','1032','Coordinate Frame rotation (geocentric domain)','EPSG','9292','EPSG','4978','EPSG','1183',0.1,1.16835,-1.42001,-2.24431,'EPSG','9001',0.00822,0.05508,-0.01818,'EPSG','9104',0.23388,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NSA-Omn',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9334','ITRF2014 to KSA-GRF17 (1)','Arabian plate rotations derived from obs. at 41 sites with at least 2.5 years of continuous observations. May be approximated by position vector CT with rX=8.393", rY=-0.749", rZ=10.276" valid at 2017.00 and degrading by approximately 2.5cm per year.','Geodesy.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','9331','EPSG','1206',0.001,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',-1.199,0.107,-1.468,'EPSG','1032',0.0,'EPSG','1030',2017.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'GCS-Sau',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9339','PSAD56 to SIRGAS-Chile 2010 (1)','Also used as a transformation from PSAD56 to other realizations of SIRGAS-Chile and to WGS 84 - see code 6971.','Small and medium scale cartographic mapping.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4248','EPSG','8949','EPSG','4231',5.0,-302.0,272.0,-360.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGM-Chl A',0);
@@ -1197,6 +1198,9 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','9362','Ain el Abd to KSA-GRF
INSERT INTO "helmert_transformation" VALUES('EPSG','9381','ITRF2014 to IGb14 (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. IGb14 is aligned with IGS14 which by definition aligned with ITRF2014.','Geodesy','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','7789','EPSG','9378','EPSG','1262',0.0,0.0,0.0,0.0,'EPSG','1033',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IGS-Wld',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9382','IGS14 to IGb14 (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. IGS14 and IGb14 are both by definition aligned with ITRF2014.','Geodesy','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8227','EPSG','9378','EPSG','1262',0.0,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IGS-Wld',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9383','KSA-GRF17 to WGS 84 (1)','Derived from ITRF2014 to KSA-GRF17 (1) (CT code 9334). Valid at 2017.00 and degrading by approximately 2.5cm per year.','Spatial Referencing.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','9333','EPSG','4326','EPSG','1206',1.0,0.0,0.0,0.0,'EPSG','9001',-8.393,0.749,-10.276,'EPSG','1031',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GCS-Sau',0);
+INSERT INTO "helmert_transformation" VALUES('EPSG','9459','ATRF2014 to GDA2020 (1)','Describes movement of ATRF2014 relative to GDA2020 due to Australian tectonic plate motion. Derived at 109 stations of the Australian Regional GNSS network (ARGN). Scale difference (dS) in ppb and dS rate in ppb/yr where 1/billion = 1E-9 or nm/m.','Location-based services, Intelligent Transport Services, navigation, positioning.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','9307','EPSG','7842','EPSG','4177',0.03,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',1.50379,1.18346,1.20716,'EPSG','1032',0.0,'EPSG','1030',2020.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'GA-Aus',0);
+INSERT INTO "helmert_transformation" VALUES('EPSG','9460','ITRF2014 to ATRF2014 (1)','ATRF2014 is a regional densification of ITRF2014 for the Australian region.','Geodesy, location based services, intelligent transport services.','EPSG','1032','Coordinate Frame rotation (geocentric domain)','EPSG','7789','EPSG','9307','EPSG','4177',0.01,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','9104',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GA-Aus',0);
+INSERT INTO "helmert_transformation" VALUES('EPSG','9472','DGN95 to SRGI2013 (1)','Derived at 533 stations. Mean residual 0.218m. Note: information source gives rotations given in radians.','Spatial referencing.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4755','EPSG','9470','EPSG','1122',0.2,-0.2773,0.0534,0.4819,'EPSG','9001',0.0935,-0.0286,0.00969,'EPSG','9109',-0.028,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SRGI-Idn',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','10085','Trinidad 1903 to WGS 84 (2)','Parameter values provided to EOG by Trinidad Ministry of Energy and Energy Industries. Used by EOG offshore Trinidad (including Pelican, Kiskadee and Ibis fields) since 1996.','Oil exploration.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4302','EPSG','4326','EPSG','1339',3.0,-61.0,285.2,471.6,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EOG-Tto Trin',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','10086','JAD69 to WGS 72 (1)','Derived in 1977 through Transit observations at 2 stations by US DMA.','For military mapping.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4242','EPSG','4322','EPSG','3342',15.0,48.0,208.0,382.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SD-Jam',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','10089','Aratu to WGS 84 (5)','Used by ExxonMobil for block BMS1. See WGS 84 (13) (tfm code 5051) which Petrobras now recommends for the area.','Oil exploration.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4208','EPSG','4326','EPSG','2962',7.0,-163.466,317.396,-147.538,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EXM-Bra Santos',0);
diff --git a/data/sql/metadata.sql b/data/sql/metadata.sql
index d7db9e5e..bfd1991e 100644
--- a/data/sql/metadata.sql
+++ b/data/sql/metadata.sql
@@ -1,2 +1,2 @@
-INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v9.8.15');
-INSERT INTO "metadata" VALUES('EPSG.DATE', '2020-08-02');
+INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v9.9');
+INSERT INTO "metadata" VALUES('EPSG.DATE', '2020-09-09');
diff --git a/data/sql/projected_crs.sql b/data/sql/projected_crs.sql
index 17fa82dd..34e57691 100644
--- a/data/sql/projected_crs.sql
+++ b/data/sql/projected_crs.sql
@@ -3631,6 +3631,23 @@ INSERT INTO "projected_crs" VALUES('EPSG','9404','PN68 / UTM zone 27N',NULL,NULL
INSERT INTO "projected_crs" VALUES('EPSG','9405','PN68 / UTM zone 28N',NULL,NULL,'EPSG','4400','EPSG','9403','EPSG','16028','EPSG','4600',NULL,0);
INSERT INTO "projected_crs" VALUES('EPSG','9406','PN84 / UTM zone 27N',NULL,NULL,'EPSG','4400','EPSG','4728','EPSG','16027','EPSG','4599',NULL,0);
INSERT INTO "projected_crs" VALUES('EPSG','9407','PN84 / UTM zone 28N',NULL,NULL,'EPSG','4400','EPSG','4728','EPSG','16028','EPSG','4601',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9456','GBK19 Grid',NULL,NULL,'EPSG','4400','EPSG','9453','EPSG','9455','EPSG','4607',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9473','GDA2020 / Australian Albers',NULL,NULL,'EPSG','4400','EPSG','7844','EPSG','17365','EPSG','2575',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9476','SRGI2013 / UTM zone 46N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16046','EPSG','1647',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9477','SRGI2013 / UTM zone 47N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16047','EPSG','1649',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9478','SRGI2013 / UTM zone 48N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16048','EPSG','1651',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9479','SRGI2013 / UTM zone 49N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16049','EPSG','1653',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9480','SRGI2013 / UTM zone 50N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16050','EPSG','1655',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9481','SRGI2013 / UTM zone 51N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16051','EPSG','1657',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9482','SRGI2013 / UTM zone 52N',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16052','EPSG','1659',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9487','SRGI2013 / UTM zone 47S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16147','EPSG','1650',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9488','SRGI2013 / UTM zone 48S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16148','EPSG','1652',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9489','SRGI2013 / UTM zone 49S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16149','EPSG','1654',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9490','SRGI2013 / UTM zone 50S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16150','EPSG','1656',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9491','SRGI2013 / UTM zone 51S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16151','EPSG','1658',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9492','SRGI2013 / UTM zone 52S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16152','EPSG','1660',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9493','SRGI2013 / UTM zone 53S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16153','EPSG','1662',NULL,0);
+INSERT INTO "projected_crs" VALUES('EPSG','9494','SRGI2013 / UTM zone 54S',NULL,NULL,'EPSG','4400','EPSG','9470','EPSG','16154','EPSG','1663',NULL,0);
INSERT INTO "projected_crs" VALUES('EPSG','20004','Pulkovo 1995 / Gauss-Kruger zone 4',NULL,NULL,'EPSG','4530','EPSG','4200','EPSG','16204','EPSG','1763',NULL,0);
INSERT INTO "projected_crs" VALUES('EPSG','20005','Pulkovo 1995 / Gauss-Kruger zone 5',NULL,NULL,'EPSG','4530','EPSG','4200','EPSG','16205','EPSG','1764',NULL,0);
INSERT INTO "projected_crs" VALUES('EPSG','20006','Pulkovo 1995 / Gauss-Kruger zone 6',NULL,NULL,'EPSG','4530','EPSG','4200','EPSG','16206','EPSG','1765',NULL,0);
diff --git a/data/sql/supersession.sql b/data/sql/supersession.sql
index c11a013f..1234c6cf 100644
--- a/data/sql/supersession.sql
+++ b/data/sql/supersession.sql
@@ -200,6 +200,8 @@ INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9137','grid_tran
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','6326','grid_transformation','EPSG','9229','EPSG',1);
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','7646','grid_transformation','EPSG','9230','EPSG',1);
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','7647','grid_transformation','EPSG','9231','EPSG',1);
+INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','15739','helmert_transformation','EPSG','4830','EPSG',1);
+INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','15740','helmert_transformation','EPSG','4831','EPSG',1);
INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','4831','helmert_transformation','EPSG','9281','EPSG',1);
INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','4830','helmert_transformation','EPSG','9281','EPSG',1);
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','7000','grid_transformation','EPSG','9282','EPSG',1);
diff --git a/data/sql/vertical_crs.sql b/data/sql/vertical_crs.sql
index 3ea57b72..208304e6 100644
--- a/data/sql/vertical_crs.sql
+++ b/data/sql/vertical_crs.sql
@@ -40,7 +40,7 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5703','NAVD88 height',NULL,NULL,'EPSG'
INSERT INTO "vertical_crs" VALUES('EPSG','5704','Yellow Sea',NULL,NULL,'EPSG','6499','EPSG','5104','EPSG','1067',1);
INSERT INTO "vertical_crs" VALUES('EPSG','5705','Baltic 1977 height',NULL,NULL,'EPSG','6499','EPSG','5105','EPSG','2423',0);
INSERT INTO "vertical_crs" VALUES('EPSG','5706','Caspian depth',NULL,NULL,'EPSG','6498','EPSG','5106','EPSG','1291',0);
-INSERT INTO "vertical_crs" VALUES('EPSG','5709','NAP height',NULL,NULL,'EPSG','6499','EPSG','5109','EPSG','1275',0);
+INSERT INTO "vertical_crs" VALUES('EPSG','5709','NAP height',NULL,NULL,'EPSG','6499','EPSG','5109','EPSG','1172',0);
INSERT INTO "vertical_crs" VALUES('EPSG','5710','Ostend height',NULL,NULL,'EPSG','6499','EPSG','5110','EPSG','1347',0);
INSERT INTO "vertical_crs" VALUES('EPSG','5711','AHD height',NULL,NULL,'EPSG','6499','EPSG','5111','EPSG','4493',0);
INSERT INTO "vertical_crs" VALUES('EPSG','5712','AHD (Tasmania) height',NULL,NULL,'EPSG','6499','EPSG','5112','EPSG','2947',0);
@@ -221,6 +221,8 @@ INSERT INTO "vertical_crs" VALUES('EPSG','9245','CGVD2013(CGG2013a) height',NULL
INSERT INTO "vertical_crs" VALUES('EPSG','9255','SRVN16 height',NULL,NULL,'EPSG','6499','EPSG','1260','EPSG','4573',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9274','EVRF2000 Austria height',NULL,NULL,'EPSG','6499','EPSG','1261','EPSG','1037',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9279','SA LLD height',NULL,NULL,'EPSG','6499','EPSG','1262','EPSG','3309',0);
+INSERT INTO "vertical_crs" VALUES('EPSG','9287','LAT NL depth',NULL,NULL,'EPSG','6498','EPSG','1290','EPSG','1630',0);
+INSERT INTO "vertical_crs" VALUES('EPSG','9288','MSL NL depth',NULL,NULL,'EPSG','6498','EPSG','1270','EPSG','1630',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9303','HS2-VRF height',NULL,NULL,'EPSG','6499','EPSG','1265','EPSG','4582',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9335','KSA-VRF14 height',NULL,NULL,'EPSG','6499','EPSG','1269','EPSG','3303',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9351','NGNC08 height',NULL,NULL,'EPSG','6499','EPSG','1255','EPSG','3430',0);
@@ -237,3 +239,5 @@ INSERT INTO "vertical_crs" VALUES('EPSG','9399','La Gomera height',NULL,NULL,'EP
INSERT INTO "vertical_crs" VALUES('EPSG','9400','La Palma height',NULL,NULL,'EPSG','6499','EPSG','1283','EPSG','4596',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9401','El Hierro height',NULL,NULL,'EPSG','6499','EPSG','1284','EPSG','4597',0);
INSERT INTO "vertical_crs" VALUES('EPSG','9402','Ceuta 2 height',NULL,NULL,'EPSG','6499','EPSG','1285','EPSG','4590',0);
+INSERT INTO "vertical_crs" VALUES('EPSG','9458','AVWS height',NULL,NULL,'EPSG','6499','EPSG','1292','EPSG','4177',0);
+INSERT INTO "vertical_crs" VALUES('EPSG','9471','INAGeoid2020 height',NULL,NULL,'EPSG','6499','EPSG','1294','EPSG','1122',0);
diff --git a/data/sql/vertical_datum.sql b/data/sql/vertical_datum.sql
index 219beebe..cf8d0dcc 100644
--- a/data/sql/vertical_datum.sql
+++ b/data/sql/vertical_datum.sql
@@ -11,8 +11,8 @@ INSERT INTO "vertical_datum" VALUES('EPSG','1051','Genoa',NULL,NULL,'EPSG','3736
INSERT INTO "vertical_datum" VALUES('EPSG','1054','Sri Lanka Vertical Datum',NULL,NULL,'EPSG','3310','1932-01-01',0);
INSERT INTO "vertical_datum" VALUES('EPSG','1059','Faroe Islands Vertical Reference 2009',NULL,NULL,'EPSG','3248','2009-01-01',0);
INSERT INTO "vertical_datum" VALUES('EPSG','1079','Fehmarnbelt Vertical Reference 2010',NULL,NULL,'EPSG','3890','2010-01-01',0);
-INSERT INTO "vertical_datum" VALUES('EPSG','1080','Lowest Astronomic Tide',NULL,NULL,'EPSG','1262',NULL,0);
-INSERT INTO "vertical_datum" VALUES('EPSG','1082','Highest Astronomic Tide',NULL,NULL,'EPSG','1262',NULL,0);
+INSERT INTO "vertical_datum" VALUES('EPSG','1080','Lowest Astronomical Tide',NULL,NULL,'EPSG','1262',NULL,0);
+INSERT INTO "vertical_datum" VALUES('EPSG','1082','Highest Astronomical Tide',NULL,NULL,'EPSG','1262',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1083','Lower Low Water Large Tide',NULL,NULL,'EPSG','1262',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1084','Higher High Water Large Tide',NULL,NULL,'EPSG','1262',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1085','Indian Spring Low Water',NULL,NULL,'EPSG','1262',NULL,0);
@@ -87,6 +87,7 @@ INSERT INTO "vertical_datum" VALUES('EPSG','1262','South Africa Land Levelling D
INSERT INTO "vertical_datum" VALUES('EPSG','1265','HS2 Vertical Reference Frame',NULL,NULL,'EPSG','4582',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1267','Wiener Null',NULL,NULL,'EPSG','4585',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1269','Kingdom of Saudi Arabia Vertical Reference Frame Jeddah 2014',NULL,NULL,'EPSG','3303','2014-10-01',0);
+INSERT INTO "vertical_datum" VALUES('EPSG','1270','Mean Sea Level Netherlands',NULL,NULL,'EPSG','1630',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1274','European Vertical Reference Frame 2019',NULL,NULL,'EPSG','4608','2000-01-01',0);
INSERT INTO "vertical_datum" VALUES('EPSG','1275','Mallorca',NULL,NULL,'EPSG','4602',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1276','Menorca',NULL,NULL,'EPSG','4603',NULL,0);
@@ -100,6 +101,9 @@ INSERT INTO "vertical_datum" VALUES('EPSG','1283','La Palma',NULL,NULL,'EPSG','4
INSERT INTO "vertical_datum" VALUES('EPSG','1284','El Hierro',NULL,NULL,'EPSG','4597',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1285','Ceuta 2',NULL,NULL,'EPSG','4590',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','1287','European Vertical Reference Frame 2019 mean tide',NULL,NULL,'EPSG','4608','2000-01-01',0);
+INSERT INTO "vertical_datum" VALUES('EPSG','1290','Lowest Astronomical Tide Netherlands',NULL,NULL,'EPSG','1630',NULL,0);
+INSERT INTO "vertical_datum" VALUES('EPSG','1292','Australian Vertical Working Surface',NULL,NULL,'EPSG','4177','2020-07-14',0);
+INSERT INTO "vertical_datum" VALUES('EPSG','1294','Indonesian Geoid 2020',NULL,NULL,'EPSG','1122',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','5100','Mean Sea Level',NULL,NULL,'EPSG','1262',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','5101','Ordnance Datum Newlyn',NULL,NULL,'EPSG','2792',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','5102','National Geodetic Vertical Datum 1929',NULL,NULL,'EPSG','1323','1929-01-01',0);
@@ -108,7 +112,7 @@ INSERT INTO "vertical_datum" VALUES('EPSG','5104','Yellow Sea 1956',NULL,NULL,'E
INSERT INTO "vertical_datum" VALUES('EPSG','5105','Baltic 1977',NULL,NULL,'EPSG','2423','1977-01-01',0);
INSERT INTO "vertical_datum" VALUES('EPSG','5106','Caspian Sea',NULL,NULL,'EPSG','1291',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','5107','Nivellement general de la France',NULL,NULL,'EPSG','1326',NULL,1);
-INSERT INTO "vertical_datum" VALUES('EPSG','5109','Normaal Amsterdams Peil',NULL,NULL,'EPSG','1275',NULL,0);
+INSERT INTO "vertical_datum" VALUES('EPSG','5109','Normaal Amsterdams Peil',NULL,NULL,'EPSG','1172',NULL,0);
INSERT INTO "vertical_datum" VALUES('EPSG','5110','Ostend',NULL,NULL,'EPSG','1347','1981-01-01',0);
INSERT INTO "vertical_datum" VALUES('EPSG','5111','Australian Height Datum',NULL,NULL,'EPSG','4493','1971-05-05',0);
INSERT INTO "vertical_datum" VALUES('EPSG','5112','Australian Height Datum (Tasmania)',NULL,NULL,'EPSG','2947','1972-01-01',0);
diff --git a/docs/docbuild/Dockerfile b/docs/docbuild/Dockerfile
index 953c1f7e..4f726930 100644
--- a/docs/docbuild/Dockerfile
+++ b/docs/docbuild/Dockerfile
@@ -4,10 +4,11 @@ RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
python3-dev python3-pip g++ doxygen dvipng latexmk \
cmake libjpeg8-dev zlib1g-dev texlive-latex-base \
texlive-latex-extra git latex-cjk-all texlive-lang-all \
- graphviz python3-matplotlib wget unzip
+ graphviz python3-matplotlib wget unzip enchant
RUN pip3 install Sphinx breathe \
sphinx_bootstrap_theme awscli sphinxcontrib-bibtex \
- sphinx_rtd_theme recommonmark sphinx-markdown-tables
+ sphinx_rtd_theme recommonmark sphinx-markdown-tables \
+ sphinxcontrib-spelling
diff --git a/docs/source/community/rfc/index.rst b/docs/source/community/rfc/index.rst
index ced162e2..bb8b1455 100644
--- a/docs/source/community/rfc/index.rst
+++ b/docs/source/community/rfc/index.rst
@@ -16,3 +16,4 @@ the project.
rfc-3
rfc-4
rfc-5
+ rfc-6
diff --git a/docs/source/community/rfc/rfc-6.rst b/docs/source/community/rfc/rfc-6.rst
new file mode 100644
index 00000000..a4437962
--- /dev/null
+++ b/docs/source/community/rfc/rfc-6.rst
@@ -0,0 +1,368 @@
+.. _rfc6:
+
+====================================================================
+PROJ RFC 6: Triangulation-based transformations
+====================================================================
+
+:Author: Even Rouault
+:Contact: even.rouault@spatialys.com
+:Status: Adopted
+:Implementation target: PROJ 7.2
+:Last Updated: 2020-09-02
+
+Summary
+-------------------------------------------------------------------------------
+
+This RFC adds a new transformation method, ``tinshift`` (TIN stands for
+Triangulated Irregular Network)
+
+The motivation for this work is to be able to handle the official transformations
+created by National Land Survey of Finland, for:
+
+- horizontal transformation between the KKJ and ETRS89 horizontal datums
+- vertical transformations between N43 and N60 heights, and N60 and N2000 heights.
+
+Such transformations are somehow related to traditional grid-based transformations,
+except that the correction values are hold by the vertices of the triangulation,
+instead of being at nodes of a grid.
+
+Triangulation are in a number of cases the initial product of a geodesic adjustment,
+with grids being a derived product. The Swiss grids have for example
+derived products of an original triangulation.
+
+Grid-based transformations remain very convenient to use because accessing
+correction values is really easy and efficient, so triangulation-based transformations
+are not meant as replacing them, but more about it being a complement, that is
+sometimes necessary to be able to replicate the results of a officially vetted
+transformation to a millimetric or better precision (speaking here about reproducibility
+of numeric results, rather than the physical accuracy of the transformation that
+might rather be centimetric). It is always possible to approach the result of
+the triangulation with a grid, but that may require to adopt a small grid step,
+and thus generate a grid that can be much larger than the original triangulation.
+
+Details
+-------------------------------------------------------------------------------
+
+Transformation
+++++++++++++++
+
+A new transformation method, ``tinshift``, is added. It takes one mandatory
+argument, ``file``, that points to a JSON file, which contains the triangulation
+and associated metadata. Input and output coordinates must be geographic or projected.
+Depending on the content
+of the JSON file, horizontal, vertical or both components of the coordinates may
+be transformed.
+
+The transformation is used like:
+
+::
+
+ $ echo 3210000.0000 6700000.0000 0 2020 | cct +proj=tinshift +file=./triangulation_kkj.json
+
+ 209948.3217 6697187.0009 0.0000 2020
+
+The transformation is invertible, with the same computational complexity than
+the forward transformation.
+
+Algorithm
++++++++++
+
+Internally, ``tinshift`` ingest the whole file into memory. It is considered that
+triangulation should be small enough for that. The above mentioned KKJ to ETRS89
+triangulation fits into 65 KB of JSON, for 1449 triangles and 767 vertices.
+
+When a point is transformed, one must find the triangle into which it falls into.
+Instead of iterating over all triangles, we build a in-memory quadtree to speed-up
+the identification of candidates triangles. On the above mentioned KKJ -> ETRS89
+triangulation, this speeds up the whole transformation by a factor of 10. The
+quadtree structure is a very good compromise between the performance gain it brings
+and the simplicity of its implementation (we have ported the implementation coming
+from GDAL, inherit from the one used for shapefile .spx spatial indices).
+
+To determine if a point falls into a triangle, one computes its 3
+`barycentric coordinates <https://en.wikipedia.org/wiki/Barycentric_coordinate_system#Conversion_between_barycentric_and_Cartesian_coordinates>`_
+from its projected coordinates, :math:`\lambda_i` for :math:`i=1,2,3`.
+They are real values (in the [0,1] range for a point inside the triangle),
+giving the weight of each of the 3 vertices of the triangles.
+
+Once those weights are known, interpolating the target horizontal
+coordinate is a matter of doing the linear combination of those weights with
+the target horizontal coordinates at the 3 vertices of the triangle (:math:`Xt_i` and :math:`Yt_i`):
+
+.. math::
+
+ X_{target} = Xt_1 * \lambda_1 + Xt_2 * \lambda_2 + Xt_3 * \lambda_3
+
+ Y_{target} = Yt_1 * \lambda_1 + Yt_2 * \lambda_2 + Yt_3 * \lambda_3
+
+This interpolation is exact at the vertices of the triangulation, and has linear properties
+inside each triangle. It is completely equivalent to other formulations of
+triangular interpolation, such as
+
+.. math::
+
+ X_{target} = A + X_{source} * B + Y_{source} * C
+
+ Y_{target} = D + X_{source} * E + Y_{source} * F
+
+where the A, B, C, D, E, F constants (for a given triangle) are found by solving
+the 2 systems of 3 linear equations, constraint by the source and target coordinate pairs
+of the 3 vertices of the triangle:
+
+.. math::
+
+ Xt_i = A + Xs_i * B + Ys_i * C
+
+ Yt_i = D + Xs_i * E + Ys_i * F
+
+
+.. note::
+
+ From experiments, the interpolation using barycentric coordinates is slightly
+ more numerically robust when interpolating projected coordinates of amplitude of the
+ order of 1e5 / 1e6, due to computations involving differences of coordinates.
+ Whereas the formulation with the A, B, C, D, E, F tends to have big values for
+ the A and D constants, and values clause to 0 for C and E, and close to 1 for
+ B and F. However, the difference between the two approaches is negligible for
+ practical purposes (below micrometre precision)
+
+Similarly for a vertical coordinate transformation, where :math:`Zoff_i` is the vertical
+offset at each vertex of the triangle:
+
+.. math::
+
+ Z_{target} = Z_{source} + Zoff_1 * \lambda_1 + Zoff_2 * \lambda_2 + Zoff_3 * \lambda_3
+
+Constraints on the triangulation
+++++++++++++++++++++++++++++++++
+
+No check is done on the consistence of the triangulation. It is highly
+recommended that triangles do not overlap each other (when considering the
+source coordinates or the forward transformation, or the target coordinates for
+the inverse transformation), otherwise which triangle will be selected is
+unspecified. Besides that, the triangulation does not need to have particular
+properties (like being a Delaunay triangulation)
+
+File format
++++++++++++
+
+To the best of our knowledge, there are no established file formats to convey
+geodetic transformations as triangulations. Potential similar formats to store TINs
+are `ITF <http://vterrain.org/Implementation/Formats/ITF.html>`_ or
+`XMS <https://www.xmswiki.com/wiki/TIN_Files>`_.
+Both of them would need to be extended in order to handle datum shift information,
+since they are both intended for mostly DEM use.
+
+We thus propose a text-based format, using JSON as a serialization. Using a text-based
+format could potentially be thought as a limitation performance-wise compared to
+binary formats, but for the size of triangulations considered (a few thousands triangles / vertices),
+there is no issue. Loading such file is a matter of 20 milliseconds or so. For reference,
+loading a triangulation of about 115 000 triangles and 71 000 vertices takes 450 ms.
+
+Using JSON provides generic formatting and parsing rules, and convenience to
+create it from Python script for examples. This could also be easily generated "at hand"
+by non-JSON aware writers.
+
+For generic metadata, we reuse closely what has been used for the
+`Deformation model master file <https://github.com/linz/deformation-model-format>`_
+
+Below a minimal example, from the KKJ to ETRS89 transformation, with just a
+single triangle:
+
+.. code-block:: json
+
+ {
+ "file_type": "triangulation_file",
+ "format_version": "1.0",
+ "name": "Name",
+ "version": "Version",
+ "publication_date": "2018-07-01T00:00:00Z",
+ "license": "Creative Commons Attribution 4.0 International",
+ "description": "Test triangulation",
+ "authority": {
+ "name": "Authority name",
+ "url": "http://example.com",
+ "address": "Adress",
+ "email": "test@example.com"
+ },
+ "links": [
+ {
+ "href": "https://example.com/about.html",
+ "rel": "about",
+ "type": "text/html",
+ "title": "About"
+ },
+ {
+ "href": "https://example.com/download",
+ "rel": "source",
+ "type": "application/zip",
+ "title": "Authoritative source"
+ },
+ {
+ "href": "https://creativecommons.org/licenses/by/4.0/",
+ "rel": "license",
+ "type": "text/html",
+ "title": "Creative Commons Attribution 4.0 International license"
+ },
+ {
+ "href": "https://example.com/metadata.xml",
+ "rel": "metadata",
+ "type": "application/xml",
+ "title": " ISO 19115 XML encoded metadata regarding the triangulation"
+ }
+ ],
+ "input_crs": "EPSG:2393",
+ "target_crs": "EPSG:3067",
+ "transformed_components": [ "horizontal" ],
+ "vertices_columns": [ "source_x", "source_y", "target_x", "target_y" ],
+ "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ],
+ "vertices": [ [3244102.707, 6693710.937, 244037.137, 6690900.686],
+ [3205290.722, 6715311.822, 205240.895, 6712492.577],
+ [3218328.492, 6649538.429, 218273.648, 6646745.973] ],
+ "triangles": [ [0, 1, 2] ]
+ }
+
+So after the generic metadata, we define the input and output CRS (informative
+only), and that the transformation affects horizontal components of
+coordinates. We name the columns of the ``vertices`` and ``triangles`` arrays.
+We defined the source and target coordinates of each vertex, and define a
+triangle by referring to the index of its vertices in the ``vertices`` array.
+
+More formally, the specific items for the triangulation file are:
+
+input_crs
+ String identifying the CRS of source coordinates
+ in the vertices. Typically ``EPSG:XXXX``. If the transformation is for vertical
+ component, this should be the code for a compound CRS (can be EPSG:XXXX+YYYY
+ where XXXX is the code of the horizontal CRS and YYYY the code of the vertical CRS).
+ For example, for the KKJ->ETRS89 transformation, this is EPSG:2393
+ (``KKJ / Finland Uniform Coordinate System``). The input coordinates are assumed
+ to be passed in the "normalized for visualisation" / "GIS friendly" order,
+ that is longitude, latitude for geographic coordinates and
+ easting, northing for projected coordinates.
+
+
+output_crs
+ String identifying the CRS of target coordinates in the vertices.
+ Typically ``EPSG:XXXX``. If the transformation is for vertical component,
+ this should be the code for a compound CRS (can be EPSG:XXXX+YYYY where
+ XXXX is the code of the horizontal CRS and YYYY the code of the vertical CRS).
+ For example, for the KKJ->ETRS89 transformation, this is EPSG:3067
+ (\"ETRS89 / TM35FIN(E,N)\"). The output coordinates will be returned in
+ the "normalized for visualisation" / "GIS friendly" order,
+ that is longitude, latitude for geographic coordinates and
+ easting, northing for projected coordinates.
+
+
+transformed_components
+ Array which may contain one or two strings: "horizontal" when horizontal
+ components of the coordinates are transformed and/or "vertical" when the
+ vertical component is transformed.
+
+
+vertices_columns
+ Specify the name of the columns of the rows in the ``vertices``
+ array. There must be exactly as many elements in ``vertices_columns`` as in a
+ row of ``vertices``. The following names have a special meaning: ``source_x``,
+ ``source_y``, ``target_x``, ``target_y``, ``source_z``, ``target_z`` and
+ ``offset_z``. ``source_x`` and ``source_y`` are compulsory.
+ ``source_x`` is for the source longitude (in degree) or easting.
+ ``source_y`` is for the source latitude (in degree) or northing.
+ ``target_x`` and ``target_y`` are compulsory when ``horizontal`` is specified
+ in ``transformed_components``. (``source_z`` and ``target_z``) or
+ ``offset_z`` are compulsory when ``vertical`` is specified in ``transformed_components``
+
+
+triangles_columns
+ Specify the name of the columns of the rows in the
+ ``triangles`` array. There must be exactly as many elements in ``triangles_columns``
+ as in a row of ``triangles``. The following names have a special meaning:
+ ``idx_vertex1``, ``idx_vertex2``, ``idx_vertex3``. They are compulsory.
+
+
+vertices
+ An array whose items are themselves arrays with as many columns as
+ described in ``vertices_columns``.
+
+
+triangles
+ An array whose items are themselves arrays with as many columns as
+ described in ``triangles_columns``.
+ The value of the ``idx_vertexN`` columns must be indices
+ (between 0 and len(``vertices``-1) of items of the ``vertices`` array.
+
+Code impacts
+++++++++++++
+
+The following new files are added in src/transformations:
+
+- tinshift.cpp: PROJ specific code for defining the new operation. Takes care
+ of the input and output coordinate conversions (between input_crs and triangulation_source_crs,
+ and triangulation_target_crs and output_crs), when needed.
+- tinshift.hpp: Header-based implementation. This file contains the API.
+- tinshift_exceptions.hpp: Exceptions that can be raised during file parsing
+- tinshift_impl.hpp: Implementation of file loading, triangle search and interpolation.
+
+This is the approach that has been followed for the deformation model implementation,
+and which makes it easier to do unit test.
+
+src/quadtree.hpp contains a quadtree implementation.
+
+Performance indications
++++++++++++++++++++++++
+
+Tested on Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz, transforming 4 million points
+
+For the KKJ to ETRS89 transformation (1449 triangles and 767 vertices),
+4.4 million points / sec can be transformed.
+
+For comparison, the Helmert-based KKJ to ETRS89 transformation operates at
+1.6 million points / sec.
+
+A triangulation with about 115 000 triangles and 71 000 vertices
+operates at 2.2 million points / sec
+(throughput on more points would be better since the initial loading of the
+triangulation is non-negligible here)
+
+Backward compatibility
+-------------------------------------------------------------------------------
+
+New functionality fully backward compatible.
+
+Testing
+-------------------------------------------------------------------------------
+
+The PROJ test suite will be enhanced to test the new transformation, with a
+new .gie file, and a C++ unit test to test at a lower level.
+
+Documentation
+-------------------------------------------------------------------------------
+
+- The tinshift method will be documented.
+- The JSON format will be documented under https://proj.org/specifications/
+- A JSON schema will also be provided.
+
+Proposed implementation
+-------------------------------------------------------------------------------
+
+An initial implementation is available at https://github.com/rouault/PROJ/tree/tinshift
+
+References
+-------------------------------------------------------------------------------
+
+`Finnish coordinate transformation (automated translation to English) <https://translate.google.fr/translate?sl=auto&tl=en&u=https%3A%2F%2Fwww.maanmittauslaitos.fi%2Fkartat-ja-paikkatieto%2Fasiantuntevalle-kayttajalle%2Fkoordinaattimuunnokset>`_
+
+Adoption status
+-------------------------------------------------------------------------------
+
+The RFC was adopted on 2020-09-02 with +1's from the following PSC members
+
+* Kristian Evers
+* Charles Karney
+* Thomas Knudsen
+* Even Rouault
+
+Funding
+-------------------------------------------------------------------------------
+
+This work is funded by `National Land Survey of Finland <https://www.maanmittauslaitos.fi/en>`_
diff --git a/docs/source/conf.py b/docs/source/conf.py
index e9c88e19..deb2a53a 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -69,7 +69,7 @@ copyright = u'1983-{0}'.format(now.year)
# |version| and |release|, also used in various other places throughout the
# built documents.
version = '7.2.0'
-data_version = '1.1'
+data_version = '1.2'
# use same |release| as |version|
release = version
diff --git a/docs/source/development/reference/datatypes.rst b/docs/source/development/reference/datatypes.rst
index 9a1ce4d6..8e0141df 100644
--- a/docs/source/development/reference/datatypes.rst
+++ b/docs/source/development/reference/datatypes.rst
@@ -314,6 +314,48 @@ Ancillary types for geodetic computations
Third rotation angle, kappa.
+.. c:type:: PJ_ENU
+
+ East, north and up components.
+
+ .. code-block:: c
+
+ typedef struct { double e, n, u; } PJ_ENU;
+
+ .. c:member:: double PJ_ENU.e
+
+ East component.
+
+ .. c:member:: double PJ_ENU.n
+
+ North component.
+
+ .. c:member:: double PJ_ENU.u
+
+ Up component.
+
+
+.. c:type:: PJ_GEOD
+
+ Geodesic length, forward and reverse azimuths.
+
+ .. code-block:: C
+
+ typedef struct { double s, a1, a2; } PJ_GEOD;
+
+ .. c:member:: double PJ_GEOD.s
+
+ Geodesic length.
+
+ .. c:member:: double PJ_GEOD.a1
+
+ Forward azimuth.
+
+ .. c:member:: double PJ_GEOD.a2
+
+ Reverse azimuth.
+
+
Complex coordinate types
--------------------------------------------------------------------------------
@@ -331,6 +373,9 @@ Complex coordinate types
PJ_XYZT xyzt;
PJ_UVWT uvwt;
PJ_LPZT lpzt;
+ PJ_GEOD geod;
+ PJ_OPK opk;
+ PJ_ENU enu;
PJ_XYZ xyz;
PJ_UVW uvw;
PJ_LPZ lpz;
@@ -355,6 +400,18 @@ Complex coordinate types
Longitude, latitude, vertical and time components.
+ .. c:member:: PJ_GEOD PJ_COORD.geod
+
+ Geodesic length, forward and reverse azimuths.
+
+ .. c:member:: PJ_OPK PJ_COORD.opk
+
+ Rotations, for instance three euler angles.
+
+ .. c:member:: PJ_ENU PJ_COORD.enu
+
+ East, north and up components.
+
.. c:member:: PJ_XYZ PJ_COORD.xyz
3-dimensional cartesian coordinate.
@@ -840,5 +897,6 @@ C API for ISO-19111 functionality
.. doxygengroup:: iso19111_types
:project: doxygen_api
:content-only:
+ :members:
diff --git a/docs/source/download.rst b/docs/source/download.rst
index 982f5980..12d9d913 100644
--- a/docs/source/download.rst
+++ b/docs/source/download.rst
@@ -13,9 +13,12 @@ distribution of the source code and various resource file archives. See
Current Release
--------------------------------------------------------------------------------
-* **2020-07-01** `proj-7.1.0.tar.gz`_ (`md5`_)
+* **2020-09-01** `proj-7.1.1.tar.gz`_ (`md5`_)
+* **2020-07-01** `proj-7.1.0.tar.gz`_
* **2020-05-01** `proj-6.3.2.tar.gz`_
+* **2020-09-01** `proj-data-1.2.tar.gz`_
* **2020-05-01** `proj-data-1.1.tar.gz`_
+* **2020-03-01** `proj-data-1.0.tar.gz`_
* **2018-09-15** `proj-datumgrid-1.8.zip`_
* **2020-03-01** `proj-datumgrid-europe-1.6.zip`_
* **2020-03-01** `proj-datumgrid-north-america-1.4.zip`_
@@ -68,8 +71,9 @@ Past Releases
* **2018-03-01** `proj-datumgrid-oceania-1.1.zip`_
* **2018-03-01** `proj-datumgrid-oceania-1.0.zip`_
+.. _`proj-7.1.1.tar.gz`: https://download.osgeo.org/proj/proj-7.1.1.tar.gz
+.. _`md5`: https://download.osgeo.org/proj/proj-7.1.1.tar.gz.md5
.. _`proj-7.1.0.tar.gz`: https://download.osgeo.org/proj/proj-7.1.0.tar.gz
-.. _`md5`: https://download.osgeo.org/proj/proj-7.1.0.tar.gz.md5
.. _`proj-7.0.1.tar.gz`: https://download.osgeo.org/proj/proj-7.0.1.tar.gz
.. _`proj-7.0.0.tar.gz`: https://download.osgeo.org/proj/proj-7.0.0.tar.gz
.. _`proj-6.3.2.tar.gz`: https://download.osgeo.org/proj/proj-6.3.2.tar.gz
@@ -87,6 +91,7 @@ Past Releases
.. _`proj-4.9.1.tar.gz`: https://download.osgeo.org/proj/proj-4.9.1.tar.gz
.. _`proj-4.9.2.tar.gz`: https://download.osgeo.org/proj/proj-4.9.2.tar.gz
.. _`proj-4.9.3.tar.gz`: https://download.osgeo.org/proj/proj-4.9.3.tar.gz
+.. _`proj-data-1.2.tar.gz`: https://download.osgeo.org/proj/proj-data-1.2.tar.gz
.. _`proj-data-1.1.tar.gz`: https://download.osgeo.org/proj/proj-data-1.1.tar.gz
.. _`proj-data-1.0.tar.gz`: https://download.osgeo.org/proj/proj-data-1.0.tar.gz
.. _`proj-datumgrid-1.6.zip`: https://download.osgeo.org/proj/proj-datumgrid-1.6.zip
diff --git a/docs/source/news.rst b/docs/source/news.rst
index 99d41187..21e3f748 100644
--- a/docs/source/news.rst
+++ b/docs/source/news.rst
@@ -3,6 +3,47 @@
News
###############################################################################
+7.1.1 Release Notes
+++++++++++++++++++++++++++++++++++++++++
+*September 1st 2020*
+
+
+Updates
+-------
+
+* Added various Brazillian grids to the database (`#2277 <https://github.com/OSGeo/issues/2277>`_)
+
+* Added geoid file for Canary Islands to the database (`#2312 <https://github.com/OSGeo/issues/2312>`_)
+
+* Updated EPSG database to version 9.8.15 (`#2310 <https://github.com/OSGeo/issues/2310>`_)
+
+Bug fixes
+---------
+
+* WKT parser: do not raise warning when parsing a WKT2:2015 TIMECRS
+ whose TIMEUNIT is at the CS level, and not inside (`#2281 <https://github.com/OSGeo/issues/2281>`_)
+
+* Parse '+proj=something_not_latlong +vunits=' without +geoidgrids as a
+ Projected3D CRS and not a compound CRS with a unknown datum (`#2289 <https://github.com/OSGeo/issues/2289>`_)
+
+* C API: Avoid crashing due to missing SANITIZE_CTX() in entry points (`#2293 <https://github.com/OSGeo/issues/2293>`_)
+
+* CMake build: Check "target_clones" before use (`#2297 <https://github.com/OSGeo/issues/2297>`_)
+
+* PROJ string export of +proj=krovak +czech: make sure we export +czech… (`#2301 <https://github.com/OSGeo/issues/2301>`_)
+
+* Helmert 2D: do not require a useless +convention= parameter (`#2305 <https://github.com/OSGeo/issues/2305>`_)
+
+* Fix a few spelling errors ("vgridshit" vs. "vgridshift") (`#2307 <https://github.com/OSGeo/issues/2307>`_)
+
+* Fix ability to identify EPSG:2154 as a candidate for 'RGF93_Lambert_93' (`#2316 <https://github.com/OSGeo/issues/2316>`_)
+
+* WKT importer: tune for Oracle WKT and 'Lambert Conformal Conic' (`#2322 <https://github.com/OSGeo/issues/2322>`_)
+
+* Revert compiler generated Fused Multiply Addition optimized routines (`#2328 <https://github.com/OSGeo/issues/2328>`_)
+
+
+
7.1.0 Release Notes
++++++++++++++++++++++++++++++++++++++++
*July 1st 2020*
diff --git a/include/proj/datum.hpp b/include/proj/datum.hpp
index 3fc5f5d8..f1d45c6b 100644
--- a/include/proj/datum.hpp
+++ b/include/proj/datum.hpp
@@ -541,7 +541,7 @@ class PROJ_GCC_DLL RealizationMethod : public util::CodeList {
PROJ_FRIEND_OPTIONAL(RealizationMethod);
PROJ_DLL explicit RealizationMethod(
const std::string &nameIn = std::string());
- PROJ_DLL RealizationMethod(const RealizationMethod &other);
+ PROJ_DLL RealizationMethod(const RealizationMethod &other) = default;
PROJ_DLL RealizationMethod &operator=(const RealizationMethod &other);
};
diff --git a/include/proj/util.hpp b/include/proj/util.hpp
index 84c93366..3d85e579 100644
--- a/include/proj/util.hpp
+++ b/include/proj/util.hpp
@@ -692,7 +692,7 @@ class CodeList {
//! @endcond
protected:
explicit CodeList(const std::string &nameIn) : name_(nameIn) {}
- CodeList(const CodeList &other) = default;
+ CodeList(const CodeList &) = default;
CodeList &operator=(const CodeList &other);
private:
diff --git a/schemas/v0.2/projjson.schema.json b/schemas/v0.2/projjson.schema.json
index 0a4015ce..bdb97bd5 100644
--- a/schemas/v0.2/projjson.schema.json
+++ b/schemas/v0.2/projjson.schema.json
@@ -1,7 +1,7 @@
{
"$id": "https://proj.org/schemas/v0.2/projjson.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
- "description": "Schema for PROJJSON",
+ "description": "Schema for PROJJSON (v0.2.1)",
"$comment": "This file exists both in data/ and in schemas/vXXX/. Keep both in sync. And if changing the value of $id, change PROJJSON_CURRENT_VERSION accordingly in io.cpp",
"oneOf": [
@@ -756,7 +756,7 @@
"$schema" : { "type": "string" },
"type": { "type": "string", "enum": ["PrimeMeridian"] },
"name": { "type": "string" },
- "longitude": { "$ref": "#/definitions/value_and_unit" },
+ "longitude": { "$ref": "#/definitions/value_in_degree_or_value_and_unit" },
"id": { "$ref": "#/definitions/id" },
"ids": { "$ref": "#/definitions/ids" }
},
@@ -912,6 +912,13 @@
"additionalProperties": false
},
+ "value_in_degree_or_value_and_unit": {
+ "oneOf": [
+ { "type": "number" },
+ { "$ref": "#/definitions/value_and_unit" }
+ ]
+ },
+
"value_in_metre_or_value_and_unit": {
"oneOf": [
{ "type": "number" },
diff --git a/scripts/build_db.py b/scripts/build_db.py
index 709914d8..97d68f34 100755
--- a/scripts/build_db.py
+++ b/scripts/build_db.py
@@ -398,19 +398,19 @@ def fill_grid_transformation(proj_db_cursor):
# 1071: Vertical Offset by Grid Interpolation (NZLVD)
# 1080: Vertical Offset by Grid Interpolation (BEV AT)
# 1081: Geographic3D to GravityRelatedHeight (BEV AT)
+ # 1083: Geog3D to Geog2D+Vertical (AUSGeoid v2)
# 1084: Vertical Offset by Grid Interpolation (gtx)
- elif method_code in (1071, 1080, 1081, 1084) and n_params == 2:
+ # 1085: Vertical Offset by Grid Interpolation (asc)
+ elif method_code in (1071, 1080, 1081, 1083, 1084, 1085) and n_params == 2:
assert param_code[1] == 1048, (code, method_code, param_code[1])
interpolation_crs_auth_name = EPSG_AUTHORITY
interpolation_crs_code = str(int(param_value[1])) # needed to avoid codes like XXXX.0
- elif method_name == 'Geocentric translation by Grid Interpolation (IGN)':
- assert param_code[1] == 1048, (code, method_code, param_code[1])
- interpolation_crs_auth_name = EPSG_AUTHORITY
- interpolation_crs_code = str(int(param_value[1])) # needed to avoid codes like XXXX.0
- elif method_code == 1085: # Vertical Offset by Grid Interpolation (asc)
+ # 1087: Geocentric translation by Grid Interpolation (IGN)
+ elif method_code in (1087, ) and n_params == 3:
assert param_code[1] == 1048, (code, method_code, param_code[1])
interpolation_crs_auth_name = EPSG_AUTHORITY
interpolation_crs_code = str(int(param_value[1])) # needed to avoid codes like XXXX.0
+ # ignoring parameter 2 Standard CT code
else:
assert n_params == 1, (code, method_code)
@@ -888,6 +888,9 @@ for line in proj_db_conn.iterdump():
# f.write(("--- Non imported: " + str(row) + '\n').encode('UTF-8'))
del files
+# Content already in proj_db_table_defs.sql
+os.unlink(os.path.join(sql_dir_name, 'celestial_body') + '.sql')
+
proj_db_conn = None
epsg_db_conn = None
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index 8f427412..75fa6d04 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -291,6 +291,15 @@ similarly, but prefers the 2D resp. 3D interfaces if available.
if( iBest < 0 ) {
break;
}
+ if( iRetry > 0 ) {
+ const int oldErrno = proj_errno_reset(P);
+ if (proj_log_level(P->ctx, PJ_LOG_TELL) >= PJ_LOG_DEBUG) {
+ pj_log(P->ctx, PJ_LOG_DEBUG, proj_errno_string(oldErrno));
+ }
+ pj_log(P->ctx, PJ_LOG_DEBUG,
+ "Did not result in valid result. "
+ "Attempting a retry with another operation.");
+ }
const auto& alt = P->alternativeCoordinateOperations[iBest];
if( P->iCurCoordOp != iBest ) {
@@ -309,9 +318,6 @@ similarly, but prefers the 2D resp. 3D interfaces if available.
if( res.xyzt.x != HUGE_VAL ) {
return res;
}
- pj_log(P->ctx, PJ_LOG_DEBUG,
- "Did not result in valid result. "
- "Attempting a retry with another operation.");
if( iRetry == N_MAX_RETRY ) {
break;
}
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp
index 55219004..21a07729 100644
--- a/src/iso19111/c_api.cpp
+++ b/src/iso19111/c_api.cpp
@@ -2497,9 +2497,9 @@ void proj_get_crs_list_parameters_destroy(PROJ_CRS_LIST_PARAMETERS *params) {
* entry is NULL. This array should be freed with proj_crs_info_list_destroy()
*
* When no filter parameters are set, this is functionnaly equivalent to
- * proj_get_crs_info_list_from_database(), instantiating a PJ* object for each
- * of the proj_create_from_database() and retrieving information with the
- * various getters. However this function will be much faster.
+ * proj_get_codes_from_database(), instantiating a PJ* object for each
+ * of the codes with proj_create_from_database() and retrieving information
+ * with the various getters. However this function will be much faster.
*
* @param ctx PROJ context, or NULL for default context
* @param auth_name Authority name, used to restrict the search.
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index 327af7a1..65ef2b77 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -8726,6 +8726,7 @@ isGeographic3DToGravityRelatedHeight(const OperationMethodNNPtr &method,
"1072", // Geographic3D to GravityRelatedHeight (OSGM15-Ire)
"1073", // Geographic3D to GravityRelatedHeight (IGN2009)
"1081", // Geographic3D to GravityRelatedHeight (BEV AT)
+ "1083", // Geog3D to Geog2D+Vertical (AUSGeoid v2)
"9661", // Geographic3D to GravityRelatedHeight (EGM)
"9662", // Geographic3D to GravityRelatedHeight (Ausgeoid98)
"9663", // Geographic3D to GravityRelatedHeight (OSGM-GB)
@@ -11379,8 +11380,31 @@ struct SortFunction {
return false;
}
- // Arbitrary final criterion
- return a_name < b_name;
+ // Arbitrary final criterion. We actually return the greater element
+ // first, so that "Amersfoort to WGS 84 (4)" is presented before
+ // "Amersfoort to WGS 84 (3)", which is probably a better guess.
+
+ // Except for French NTF (Paris) to NTF, where the (1) conversion
+ // should be preferred because in the remarks of (2), it is mentionned
+ // OGP prefers value from IGN Paris (code 1467)...
+ if (a_name.find("NTF (Paris) to NTF (1)") != std::string::npos &&
+ b_name.find("NTF (Paris) to NTF (2)") != std::string::npos) {
+ return true;
+ }
+ if (a_name.find("NTF (Paris) to NTF (2)") != std::string::npos &&
+ b_name.find("NTF (Paris) to NTF (1)") != std::string::npos) {
+ return false;
+ }
+ if (a_name.find("NTF (Paris) to RGF93 (1)") != std::string::npos &&
+ b_name.find("NTF (Paris) to RGF93 (2)") != std::string::npos) {
+ return true;
+ }
+ if (a_name.find("NTF (Paris) to RGF93 (2)") != std::string::npos &&
+ b_name.find("NTF (Paris) to RGF93 (1)") != std::string::npos) {
+ return false;
+ }
+
+ return a_name > b_name;
}
bool operator()(const CoordinateOperationNNPtr &a,
@@ -11406,6 +11430,23 @@ static size_t getStepCount(const CoordinateOperationNNPtr &op) {
// ---------------------------------------------------------------------------
+// Return number of steps that are transformations (and not conversions)
+static size_t getTransformationStepCount(const CoordinateOperationNNPtr &op) {
+ auto concat = dynamic_cast<const ConcatenatedOperation *>(op.get());
+ size_t stepCount = 1;
+ if (concat) {
+ stepCount = 0;
+ for (const auto &subOp : concat->operations()) {
+ if (dynamic_cast<const Conversion *>(subOp.get()) == nullptr) {
+ stepCount++;
+ }
+ }
+ }
+ return stepCount;
+}
+
+// ---------------------------------------------------------------------------
+
static bool isNullTransformation(const std::string &name) {
if (name.find(" + ") != std::string::npos)
return false;
@@ -11441,8 +11482,7 @@ struct FilterResults {
// results
// ...
removeSyntheticNullTransforms();
- if (context->getDiscardSuperseded())
- removeUninterestingOps();
+ removeUninterestingOps();
removeDuplicateOps();
removeSyntheticNullTransforms();
return *this;
@@ -11757,50 +11797,23 @@ struct FilterResults {
void removeUninterestingOps() {
// Eliminate operations that bring nothing, ie for a given area of use,
- // do not keep operations that have greater accuracy. Actually we must
- // be a bit more subtle than that, and take into account grid
- // availability
+ // do not keep operations that have similar or worse accuracy, but
+ // involve more (non conversion) steps
std::vector<CoordinateOperationNNPtr> resTemp;
metadata::ExtentPtr lastExtent;
double lastAccuracy = -1;
- bool lastHasGrids = false;
- bool lastGridsAvailable = true;
- std::set<std::set<std::string>> setOfSetOfGrids;
size_t lastStepCount = 0;
CoordinateOperationPtr lastOp;
bool first = true;
- const auto gridAvailabilityUse = context->getGridAvailabilityUse();
for (const auto &op : res) {
const auto curAccuracy = getAccuracy(op);
bool dummy = false;
const auto curExtent = getExtent(op, true, dummy);
- bool curHasGrids = false;
- bool curGridsAvailable = true;
- std::set<std::string> curSetOfGrids;
-
- const auto curStepCount = getStepCount(op);
-
- if (context->getAuthorityFactory()) {
- const auto gridsNeeded = op->gridsNeeded(
- context->getAuthorityFactory()->databaseContext(),
- gridAvailabilityUse ==
- CoordinateOperationContext::GridAvailabilityUse::
- KNOWN_AVAILABLE);
- for (const auto &gridDesc : gridsNeeded) {
- curHasGrids = true;
- curSetOfGrids.insert(gridDesc.shortName);
- if (!gridDesc.available) {
- curGridsAvailable = false;
- }
- }
- }
+ const auto curStepCount = getTransformationStepCount(op);
if (first) {
resTemp.emplace_back(op);
-
- lastHasGrids = curHasGrids;
- lastGridsAvailable = curGridsAvailable;
first = false;
} else {
if (lastOp->_isEquivalentTo(op.get())) {
@@ -11811,66 +11824,19 @@ struct FilterResults {
(curExtent && lastExtent &&
curExtent->contains(NN_NO_CHECK(lastExtent)) &&
lastExtent->contains(NN_NO_CHECK(curExtent))));
- if (((curAccuracy > lastAccuracy && lastAccuracy >= 0) ||
+ if (((curAccuracy >= lastAccuracy && lastAccuracy >= 0) ||
(curAccuracy < 0 && lastAccuracy >= 0)) &&
- sameExtent) {
- // If that set of grids has always been used for that
- // extent,
- // no need to add them again
- if (setOfSetOfGrids.find(curSetOfGrids) !=
- setOfSetOfGrids.end()) {
- continue;
- }
-
- const bool sameNameOrEmptyName =
- ((!curExtent && !lastExtent) ||
- (curExtent && lastExtent &&
- !curExtent->description()->empty() &&
- *(curExtent->description()) ==
- *(lastExtent->description())));
-
- // If we have already found a operation without grids for
- // that extent, no need to add any lower accuracy operation
- if (!lastHasGrids && sameNameOrEmptyName) {
- continue;
- }
- // If we had only operations involving grids, but one
- // past operation had available grids, no need to add
- // the new one.
- if (curHasGrids && curGridsAvailable &&
- lastGridsAvailable) {
- continue;
- }
- } else if (curAccuracy == lastAccuracy && sameExtent) {
- if (curStepCount > lastStepCount) {
- continue;
- }
+ sameExtent && curStepCount > lastStepCount) {
+ continue;
}
resTemp.emplace_back(op);
-
- if (sameExtent) {
- if (!curHasGrids) {
- lastHasGrids = false;
- }
- if (curGridsAvailable) {
- lastGridsAvailable = true;
- }
- } else {
- setOfSetOfGrids.clear();
-
- lastHasGrids = curHasGrids;
- lastGridsAvailable = curGridsAvailable;
- }
}
lastOp = op.as_nullable();
lastStepCount = curStepCount;
lastExtent = curExtent;
lastAccuracy = curAccuracy;
- if (!curSetOfGrids.empty()) {
- setOfSetOfGrids.insert(curSetOfGrids);
- }
}
res = std::move(resTemp);
}
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp
index 88420c8a..e96b3cc9 100644
--- a/src/iso19111/crs.cpp
+++ b/src/iso19111/crs.cpp
@@ -378,7 +378,8 @@ VerticalCRSPtr CRS::extractVerticalCRS() const {
* a +towgs84 parameter or a WKT1:GDAL string with a TOWGS node.
*
* This method will fetch the GeographicCRS of this CRS and find a
- * transformation to EPSG:4326 using the domain of the validity of the main CRS.
+ * transformation to EPSG:4326 using the domain of the validity of the main CRS,
+ * and there's only one Helmert transformation.
*
* @return a CRS.
*/
@@ -456,6 +457,7 @@ CRSNNPtr CRS::createBoundCRSToWGS84IfPossible(
auto list =
operation::CoordinateOperationFactory::create()
->createOperations(NN_NO_CHECK(geodCRS), hubCRS, ctxt);
+ CRSPtr candidateBoundCRS;
for (const auto &op : list) {
auto transf =
util::nn_dynamic_pointer_cast<operation::Transformation>(
@@ -466,8 +468,13 @@ CRSNNPtr CRS::createBoundCRSToWGS84IfPossible(
} catch (const std::exception &) {
continue;
}
- return util::nn_static_pointer_cast<CRS>(BoundCRS::create(
- thisAsCRS, hubCRS, NN_NO_CHECK(transf)));
+ if (candidateBoundCRS) {
+ candidateBoundCRS = nullptr;
+ break;
+ }
+ candidateBoundCRS =
+ BoundCRS::create(thisAsCRS, hubCRS, NN_NO_CHECK(transf))
+ .as_nullable();
} else {
auto concatenated =
dynamic_cast<const operation::ConcatenatedOperation *>(
@@ -499,15 +506,23 @@ CRSNNPtr CRS::createBoundCRSToWGS84IfPossible(
} catch (const std::exception &) {
continue;
}
- return util::nn_static_pointer_cast<CRS>(
+ if (candidateBoundCRS) {
+ candidateBoundCRS = nullptr;
+ break;
+ }
+ candidateBoundCRS =
BoundCRS::create(thisAsCRS, hubCRS,
- NN_NO_CHECK(transf)));
+ NN_NO_CHECK(transf))
+ .as_nullable();
}
}
}
}
}
}
+ if (candidateBoundCRS) {
+ return NN_NO_CHECK(candidateBoundCRS);
+ }
} catch (const std::exception &) {
}
}
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp
index 33eb81fa..83f615e9 100644
--- a/src/iso19111/datum.cpp
+++ b/src/iso19111/datum.cpp
@@ -1773,10 +1773,6 @@ RealizationMethod::RealizationMethod(const std::string &nameIn)
// ---------------------------------------------------------------------------
-RealizationMethod::RealizationMethod(const RealizationMethod &) = default;
-
-// ---------------------------------------------------------------------------
-
RealizationMethod &RealizationMethod::
operator=(const RealizationMethod &other) {
CodeList::operator=(other);
diff --git a/src/projections/tmerc.cpp b/src/projections/tmerc.cpp
index 0c567e13..69f4d352 100644
--- a/src/projections/tmerc.cpp
+++ b/src/projections/tmerc.cpp
@@ -489,16 +489,13 @@ static PJ_LP exact_e_inv (PJ_XY xy, PJ *P) {
}
static PJ *setup_exact(PJ *P) {
- double f, n, np, Z;
auto *Q = &(static_cast<struct tmerc_data*>(P->opaque)->exact);
assert( P->es > 0 );
- /* flattening */
- f = P->es / (1 + sqrt (1 - P->es)); /* Replaces: f = 1 - sqrt(1-P->es); */
-
/* third flattening */
- np = n = f/(2 - f);
+ const double n = P->n;
+ double np = n;
/* COEF. OF TRIG SERIES GEO <-> GAUSS */
/* cgb := Gaussian -> Geodetic, KW p190 - 191 (61) - (62) */
@@ -563,7 +560,7 @@ static PJ *setup_exact(PJ *P) {
Q->gtu[5] = np*(212378941/319334400.0);
/* Gaussian latitude value of the origin latitude */
- Z = gatg (Q->cbg, PROJ_ETMERC_ORDER, P->phi0, cos(2*P->phi0), sin(2*P->phi0));
+ const double Z = gatg (Q->cbg, PROJ_ETMERC_ORDER, P->phi0, cos(2*P->phi0), sin(2*P->phi0));
/* Origin northing minus true northing at the origin latitude */
/* i.e. true northing = N - P->Zb */
diff --git a/test/cli/proj_outIGNF.dist b/test/cli/proj_outIGNF.dist
index c12b883b..35d053fa 100644
--- a/test/cli/proj_outIGNF.dist
+++ b/test/cli/proj_outIGNF.dist
@@ -8,7 +8,7 @@
311552.5340 1906457.4840 0.0000 358799.172 6342652.486 0.000
960488.4138 1910172.8812 0.0000 1007068.686 6340907.237 0.000
600000.0000 1699510.8340 0.0000 645204.279 6133556.746 0.000
-1203792.5981 626873.17210 0.0000 * * inf
+1203792.5981 626873.17210 0.0000 1238837.253 5057451.037 0.000
+init=IGNF:LAMBE +to +init=IGNF:GEOPORTALFXX
600000.0000 2600545.4523 0.0000 179040.148 5610495.275 0.000
135638.3592 2418760.4094 0.0000 -303729.363 5410118.356 0.000
@@ -17,7 +17,7 @@
311552.5340 1906457.4840 0.0000 -96825.465 4909184.136 0.000
960488.4138 1910172.8812 0.0000 523880.019 4909191.141 0.000
600000.0000 1699510.8340 0.0000 179047.633 4708817.007 0.000
-1203792.5981 626873.17210 0.0000 * * inf
+1203792.5981 626873.17210 0.0000 658259.467 3623786.764 0.000
+init=IGNF:RGF93G +to +init=IGNF:GEOPORTALFXX
2d20'11.4239243" 50d23'59.7718445" 0.0 179040.151 5610495.281 0.000
-3d57'49.4051448" 48d35'59.7121716" 0.0 -303729.365 5410118.352 0.000
diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist
index ee7e6f9b..5d36f42e 100644
--- a/test/cli/testprojinfo_out.dist
+++ b/test/cli/testprojinfo_out.dist
@@ -1044,25 +1044,29 @@ Testing -s +proj=longlat +datum=WGS84 +geoidgrids=@foo.gtx +type=crs -t EPSG:432
+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=@foo.gtx +multiplier=1 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1
Testing -s "GDA94" -t "WGS 84 (G1762)" --spatial-test intersects --summary. Should include transformations through ITRF2008 and GDA2020
-Candidate operations found: 6
+Candidate operations found: 7
unknown id, GDA94 to GDA2020 (1) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.21 m, Australia - GDA
+unknown id, GDA94 to WGS 84 (1) + WGS 84 to WGS 84 (G1762), 5 m, Australia - GDA
unknown id, Conversion from GDA94 (geog2D) to GDA94 (geocentric) + Inverse of ITRF2008 to GDA94 (1) + Inverse of WGS 84 (G1762) to ITRF2008 (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.04 m, Australia - onshore and EEZ
-unknown id, GDA94 to GDA2020 (2) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.25 m, Australia - onshore
unknown id, GDA94 to GDA2020 (3) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.25 m, Australia - onshore
+unknown id, GDA94 to GDA2020 (2) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.25 m, Australia - onshore
unknown id, GDA94 to GDA2020 (5) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.25 m, Cocos (Keeling) Islands - onshore
unknown id, GDA94 to GDA2020 (4) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.25 m, Christmas Island - onshore
Testing -s "AGD66" -t "WGS 84 (G1762)" --spatial-test intersects --summary. Should include a transformation through GDA2020
-Candidate operations found: 11
+Candidate operations found: 14
unknown id, AGD66 to WGS 84 (18) + WGS 84 to WGS 84 (G1762), 5 m, Australia - offshore
unknown id, AGD66 to WGS 84 (16) + WGS 84 to WGS 84 (G1762), 7 m, Australia - onshore
+unknown id, AGD66 to WGS 84 (20) + WGS 84 to WGS 84 (G1762), 11 m, Australia - onshore
unknown id, AGD66 to WGS 84 (15) + WGS 84 to WGS 84 (G1762), 3 m, Australia - Northern Territory
unknown id, AGD66 to WGS 84 (13) + WGS 84 to WGS 84 (G1762), 3 m, Australia - New South Wales and Victoria
unknown id, AGD66 to WGS 84 (21) + WGS 84 to WGS 84 (G1762), 7 m, Papua New Guinea - mainland onshore
unknown id, AGD66 to WGS 84 (14) + WGS 84 to WGS 84 (G1762), 3 m, Australia - Tasmania
unknown id, AGD66 to WGS 84 (19) + WGS 84 to WGS 84 (G1762), 4 m, Papua New Guinea - PFTB
+unknown id, AGD66 to WGS 84 (22) + WGS 84 to WGS 84 (G1762), 6 m, Papua New Guinea - PFTB
unknown id, AGD66 to WGS 84 (23) + WGS 84 to WGS 84 (G1762), 6 m, Papua New Guinea - North Fly
unknown id, AGD66 to GDA2020 (1) + Conversion from GDA2020 (geog2D) to GDA2020 (geocentric) + GDA2020 to WGS 84 (G1762) (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762) (geog2D), 0.25 m, Australia - Australian Capital Territory
+unknown id, AGD66 to WGS 84 (12) + WGS 84 to WGS 84 (G1762), 3 m, Australia - Australian Capital Territory
unknown id, AGD66 to WGS 84 (17) + WGS 84 to WGS 84 (G1762), 3 m, Australia - onshore
unknown id, Ballpark geographic offset from AGD66 to WGS 84 (G1762), unknown accuracy, World, has ballpark transformation
@@ -1078,7 +1082,7 @@ Candidate operations found: 1
-------------------------------------
Operation No. 1:
-DERIVED_FROM(EPSG):5656, GDA94 to AHD height (49), 0.03 m, Australia - mainland
+DERIVED_FROM(EPSG):5656, GDA94 to AHD height (49), 0.15 m, Australia - mainland
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +inv +proj=vgridshift +grids=au_ga_AUSGeoid09_V1.01.tif +multiplier=1 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1
@@ -1088,7 +1092,7 @@ Candidate operations found: 1
-------------------------------------
Operation No. 1:
-DERIVED_FROM(EPSG):8451, GDA2020 to AHD height (1), 0.03 m, Australia Christmas and Cocos - onshore
+DERIVED_FROM(EPSG):8451, GDA2020 to AHD height (1), 0.15 m, Australia Christmas and Cocos - onshore
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +inv +proj=vgridshift +grids=au_ga_AUSGeoid2020_20180201.tif +multiplier=1 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index f6ba708f..564833db 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -540,7 +540,7 @@ TEST_F(CApi, proj_as_proj_string_approx_tmerc_option_yes) {
// ---------------------------------------------------------------------------
TEST_F(CApi, proj_crs_create_bound_crs_to_WGS84) {
- auto crs = proj_create_from_database(m_ctxt, "EPSG", "3844",
+ auto crs = proj_create_from_database(m_ctxt, "EPSG", "4807",
PJ_CATEGORY_CRS, false, nullptr);
ObjectKeeper keeper(crs);
ASSERT_NE(crs, nullptr);
@@ -552,10 +552,8 @@ TEST_F(CApi, proj_crs_create_bound_crs_to_WGS84) {
auto proj_4 = proj_as_proj_string(m_ctxt, res, PJ_PROJ_4, nullptr);
ASSERT_NE(proj_4, nullptr);
EXPECT_EQ(std::string(proj_4),
- "+proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 "
- "+y_0=500000 +ellps=krass "
- "+towgs84=2.329,-147.042,-92.08,-0.309,0.325,0.497,5.69 "
- "+units=m +no_defs +type=crs");
+ "+proj=longlat +ellps=clrk80ign +pm=paris "
+ "+towgs84=-168,-60,320,0,0,0,0 +no_defs +type=crs");
auto base_crs = proj_get_source_crs(m_ctxt, res);
ObjectKeeper keeper_base_crs(base_crs);
@@ -572,8 +570,7 @@ TEST_F(CApi, proj_crs_create_bound_crs_to_WGS84) {
std::vector<double> values(7, 0);
EXPECT_TRUE(proj_coordoperation_get_towgs84_values(m_ctxt, transf,
values.data(), 7, true));
- auto expected = std::vector<double>{2.329, -147.042, -92.08, -0.309,
- 0.325, 0.497, 5.69};
+ auto expected = std::vector<double>{-168, -60, 320, 0, 0, 0, 0};
EXPECT_EQ(values, expected);
auto res2 = proj_crs_create_bound_crs(m_ctxt, base_crs, hub_crs, transf);
@@ -1485,7 +1482,7 @@ TEST_F(CApi, proj_create_operations_discard_superseded) {
ASSERT_NE(res, nullptr);
ObjListKeeper keeper_res(res);
- EXPECT_EQ(proj_list_get_count(res), 2);
+ EXPECT_EQ(proj_list_get_count(res), 4);
}
// ---------------------------------------------------------------------------
@@ -1594,7 +1591,7 @@ TEST_F(CApi, proj_create_operations_with_pivot) {
auto res = proj_create_operations(m_ctxt, source_crs, target_crs, ctxt);
ASSERT_NE(res, nullptr);
ObjListKeeper keeper_res(res);
- EXPECT_EQ(proj_list_get_count(res), 7);
+ EXPECT_EQ(proj_list_get_count(res), 8);
auto op = proj_list_get(m_ctxt, res, 0);
ASSERT_NE(op, nullptr);
ObjectKeeper keeper_op(op);
@@ -4737,7 +4734,7 @@ TEST_F(CApi, proj_create_vertical_crs_ex_implied_accuracy) {
ObjectKeeper keeper_transform(transform);
// This is the accuracy of operations EPSG:5656 / 5657
- ASSERT_EQ(proj_coordoperation_get_accuracy(m_ctxt, transform), 0.03);
+ ASSERT_EQ(proj_coordoperation_get_accuracy(m_ctxt, transform), 0.15);
}
// ---------------------------------------------------------------------------
diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp
index caee0646..0e340560 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -5422,40 +5422,18 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
{
// Pulkovo 42 Romania
auto crs_3844 = factory->createCoordinateReferenceSystem("3844");
- auto bound = crs_3844->createBoundCRSToWGS84IfPossible(
- dbContext, CoordinateOperationContext::IntermediateCRSUse::NEVER);
- EXPECT_NE(bound, crs_3844);
- EXPECT_EQ(bound->createBoundCRSToWGS84IfPossible(
+ EXPECT_EQ(crs_3844->createBoundCRSToWGS84IfPossible(
dbContext,
CoordinateOperationContext::IntermediateCRSUse::NEVER),
- bound);
- auto boundCRS = nn_dynamic_pointer_cast<BoundCRS>(bound);
- ASSERT_TRUE(boundCRS != nullptr);
- EXPECT_EQ(
- boundCRS->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 "
- "+y_0=500000 +ellps=krass "
- "+towgs84=2.329,-147.042,-92.08,-0.309,0.325,0.497,5.69 "
- "+units=m +no_defs +type=crs");
+ crs_3844);
}
{
// Pulkovo 42 Poland
auto crs_2171 = factory->createCoordinateReferenceSystem("2171");
- auto bound = crs_2171->createBoundCRSToWGS84IfPossible(
- dbContext, CoordinateOperationContext::IntermediateCRSUse::NEVER);
- EXPECT_NE(bound, crs_2171);
- EXPECT_EQ(bound->createBoundCRSToWGS84IfPossible(
+ EXPECT_EQ(crs_2171->createBoundCRSToWGS84IfPossible(
dbContext,
CoordinateOperationContext::IntermediateCRSUse::NEVER),
- bound);
- auto boundCRS = nn_dynamic_pointer_cast<BoundCRS>(bound);
- ASSERT_TRUE(boundCRS != nullptr);
- EXPECT_EQ(
- boundCRS->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=sterea +lat_0=50.625 +lon_0=21.0833333333333 "
- "+k=0.9998 +x_0=4637000 +y_0=5647000 +ellps=krass "
- "+towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 "
- "+units=m +no_defs +type=crs");
+ crs_2171);
}
{
// NTF (Paris)
@@ -5547,6 +5525,15 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
::testing::UnitTest::GetInstance()->elapsed_time();
EXPECT_LE(time_after - time_before, 500);
}
+ {
+ // POSGAR 2007: it has 2 helmert shifts to WGS84 (#2356). Don't take
+ // an arbitrary one
+ auto crs_5340 = factory->createCoordinateReferenceSystem("5340");
+ EXPECT_EQ(crs_5340->createBoundCRSToWGS84IfPossible(
+ dbContext,
+ CoordinateOperationContext::IntermediateCRSUse::NEVER),
+ crs_5340);
+ }
}
// ---------------------------------------------------------------------------
diff --git a/test/unit/test_operation.cpp b/test/unit/test_operation.cpp
index 0238638d..23f3489b 100644
--- a/test/unit/test_operation.cpp
+++ b/test/unit/test_operation.cpp
@@ -4599,7 +4599,7 @@ TEST(operation, geogCRS_to_geogCRS_context_NAD27_to_WGS84) {
authFactory->createCoordinateReferenceSystem("4267"), // NAD27
authFactory->createCoordinateReferenceSystem("4326"), // WGS84
ctxt);
- ASSERT_EQ(list.size(), 78U);
+ ASSERT_EQ(list.size(), 79U);
EXPECT_EQ(list[0]->nameStr(),
"NAD27 to WGS 84 (33)"); // 1.0 m, Canada - NAD27
EXPECT_EQ(list[1]->nameStr(),
@@ -5050,7 +5050,7 @@ TEST(operation, geogCRS_to_geogCRS_context_concatenated_operation) {
authFactory->createCoordinateReferenceSystem("4807"), // NTF(Paris)
authFactory->createCoordinateReferenceSystem("4171"), // RGF93
ctxt);
- ASSERT_EQ(list.size(), 5U);
+ ASSERT_EQ(list.size(), 4U);
EXPECT_EQ(list[0]->nameStr(), "NTF (Paris) to RGF93 (1)");
EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()),
@@ -5158,7 +5158,7 @@ TEST(operation, geogCRS_to_geogCRS_CH1903_to_CH1903plus_context) {
authFactory->createCoordinateReferenceSystem("4149"), // CH1903
authFactory->createCoordinateReferenceSystem("4150"), // CH1903+
ctxt);
- ASSERT_TRUE(list.size() == 2U || list.size() == 3U);
+ ASSERT_TRUE(list.size() == 1U);
EXPECT_EQ(list[0]->nameStr(), "CH1903 to CH1903+ (1)");
EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()),
@@ -5167,25 +5167,6 @@ TEST(operation, geogCRS_to_geogCRS_CH1903_to_CH1903plus_context) {
"+step +proj=hgridshift +grids=ch_swisstopo_CHENyx06a.tif "
"+step +proj=unitconvert +xy_in=rad +xy_out=deg "
"+step +proj=axisswap +order=2,1");
-
- if (list.size() == 2U) {
- // Grids not there
- EXPECT_EQ(list[1]->nameStr(),
- "CH1903 to ETRS89 (1) + Inverse of CH1903+ to ETRS89 (1)");
- EXPECT_EQ(
- list[1]->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=noop");
- } else {
- // Grids available
- EXPECT_EQ(list[1]->nameStr(),
- "CH1903 to ETRS89 (2) + Inverse of CH1903+ to ETRS89 (1)");
-
- EXPECT_EQ(list[2]->nameStr(),
- "CH1903 to ETRS89 (1) + Inverse of CH1903+ to ETRS89 (1)");
- EXPECT_EQ(
- list[2]->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=noop");
- }
}
// ---------------------------------------------------------------------------
@@ -6069,7 +6050,7 @@ TEST(operation, projCRS_to_projCRS_context_compatible_area) {
authFactory->createCoordinateReferenceSystem(
"2171"), // Pulkovo 42 Poland I
ctxt);
- ASSERT_EQ(list.size(), 1U);
+ ASSERT_EQ(list.size(), 2U);
EXPECT_EQ(list[0]->nameStr(),
"Inverse of UTM zone 34N + Inverse of Pulkovo 1942(58) to WGS 84 "
"(1) + Poland zone I");
@@ -6088,7 +6069,7 @@ TEST(operation, projCRS_to_projCRS_context_compatible_area_bis) {
"3844"), // Pulkovo 42 Stereo 70 (Romania)
authFactory->createCoordinateReferenceSystem("32634"), // UTM 34
ctxt);
- ASSERT_EQ(list.size(), 1U);
+ ASSERT_EQ(list.size(), 3U);
EXPECT_EQ(list[0]->nameStr(), "Inverse of Stereo 70 + "
"Pulkovo 1942(58) to WGS 84 "
"(19) + UTM zone 34N");
@@ -6107,7 +6088,7 @@ TEST(operation, projCRS_to_projCRS_context_one_incompatible_area) {
authFactory->createCoordinateReferenceSystem(
"2171"), // Pulkovo 42 Poland I
ctxt);
- ASSERT_EQ(list.size(), 1U);
+ ASSERT_EQ(list.size(), 2U);
EXPECT_EQ(list[0]->nameStr(),
"Inverse of UTM zone 31N + Inverse of Pulkovo 1942(58) to WGS 84 "
"(1) + Poland zone I");
@@ -6233,6 +6214,24 @@ TEST(operation, projCRS_to_projCRS_through_geog3D) {
// ---------------------------------------------------------------------------
+TEST(operation, transform_from_amersfoort_rd_new_to_epsg_4326) {
+ auto authFactory =
+ AuthorityFactory::create(DatabaseContext::create(), "EPSG");
+ auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0);
+ auto list = CoordinateOperationFactory::create()->createOperations(
+ authFactory->createCoordinateReferenceSystem("28992"),
+ authFactory->createCoordinateReferenceSystem("4326"), ctxt);
+ ASSERT_EQ(list.size(), 2U);
+ // The order matters: "Amersfoort to WGS 84 (4)" replaces "Amersfoort to WGS
+ // 84 (3)"
+ EXPECT_EQ(list[0]->nameStr(),
+ "Inverse of RD New + Amersfoort to WGS 84 (4)");
+ EXPECT_EQ(list[1]->nameStr(),
+ "Inverse of RD New + Amersfoort to WGS 84 (3)");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(operation, boundCRS_of_geogCRS_to_geogCRS) {
auto boundCRS = BoundCRS::createFromTOWGS84(
GeographicCRS::EPSG_4807, std::vector<double>{1, 2, 3, 4, 5, 6, 7});