aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-04-22 22:51:31 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-04-23 01:07:04 +0200
commitf6abb7d75c647013dd83a82361b96c202e615d90 (patch)
tree6743cf5b5feab06004e85ff55f654cd1671a6dc9
parentc6dba3fffb80fe6394f51aae0762f7e5db6d9edf (diff)
downloadPROJ-f6abb7d75c647013dd83a82361b96c202e615d90.tar.gz
PROJ-f6abb7d75c647013dd83a82361b96c202e615d90.zip
Database: update to EPSG v10.019
Non-trivial updates: - some vertical CRS are now encoded as DerivedVerticalCRS. e.g EPSG:8228 "NAVD88 height (ft)", with base EPSG:5703 "NAVD88 height". As we don't have support in our PROJ db model for DerivedVerticalCRS, modify the import script to 'resolve' the derivation up to the original datum. - Method EPSG:1069 'Change of Vertical Unit' is no longer used. It is replaced by a generic-purpose EPSG:1104 method that doesn't take any conversion factor. And generic conversions EPSG:7812 and EPSG:7813 are now used in concatenated operations, which require code changes as well.
-rw-r--r--data/sql/alias_name.sql1
-rw-r--r--data/sql/compound_crs.sql6
-rw-r--r--data/sql/concatenated_operation.sql2
-rw-r--r--data/sql/concatenated_operation_step.sql18
-rw-r--r--data/sql/conversion.sql4
-rw-r--r--data/sql/conversion_triggers.sql2
-rw-r--r--data/sql/extent.sql16
-rw-r--r--data/sql/geodetic_crs.sql2
-rw-r--r--data/sql/grid_transformation.sql2
-rw-r--r--data/sql/helmert_transformation.sql6
-rw-r--r--data/sql/metadata.sql4
-rw-r--r--data/sql/other_transformation.sql44
-rw-r--r--data/sql/proj_db_table_defs.sql1
-rw-r--r--data/sql/projected_crs.sql6
-rw-r--r--data/sql/scope.sql2
-rw-r--r--data/sql/vertical_crs.sql84
-rw-r--r--data/sql/vertical_datum.sql2
-rw-r--r--include/proj/coordinateoperation.hpp3
-rwxr-xr-xscripts/build_db.py23
-rw-r--r--scripts/reference_exported_symbols.txt1
-rw-r--r--src/iso19111/factory.cpp2
-rw-r--r--src/iso19111/operation/concatenatedoperation.cpp32
-rw-r--r--src/iso19111/operation/conversion.cpp66
-rw-r--r--src/iso19111/operation/coordinateoperationfactory.cpp15
-rw-r--r--src/iso19111/operation/parammappings.cpp6
-rw-r--r--src/iso19111/operation/singleoperation.cpp44
-rw-r--r--src/proj_constants.h3
-rw-r--r--test/cli/testprojinfo_out.dist16
-rw-r--r--test/unit/test_c_api.cpp4
-rw-r--r--test/unit/test_factory.cpp38
-rw-r--r--test/unit/test_operation.cpp7
-rw-r--r--test/unit/test_operationfactory.cpp18
32 files changed, 342 insertions, 138 deletions
diff --git a/data/sql/alias_name.sql b/data/sql/alias_name.sql
index 3ee11378..adfdb6d0 100644
--- a/data/sql/alias_name.sql
+++ b/data/sql/alias_name.sql
@@ -7256,3 +7256,4 @@ INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9657','PL-ETRF2000 + Kron
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4277','OSGB 1936','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','27700','OSGB 1936 / British National Grid','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9702','PL-ETRF2000','EPSG');
+INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9713','NAD83(CSRS) / UTM 24N','EPSG');
diff --git a/data/sql/compound_crs.sql b/data/sql/compound_crs.sql
index 80ebe951..f9f83f04 100644
--- a/data/sql/compound_crs.sql
+++ b/data/sql/compound_crs.sql
@@ -698,3 +698,9 @@ INSERT INTO "compound_crs" VALUES('EPSG','9705','WGS 84 + MSL height',NULL,'EPSG
INSERT INTO "usage" VALUES('EPSG','15089','compound_crs','EPSG','9705','EPSG','1262','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9707','WGS 84 + EGM96 height',NULL,'EPSG','4326','EPSG','5773',0);
INSERT INTO "usage" VALUES('EPSG','15091','compound_crs','EPSG','9707','EPSG','1262','EPSG','1026');
+INSERT INTO "compound_crs" VALUES('EPSG','9711','NAD83(CSRS) / UTM zone 23N + CGVD2013 height',NULL,'EPSG','9709','EPSG','6647',0);
+INSERT INTO "usage" VALUES('EPSG','15205','compound_crs','EPSG','9711','EPSG','2153','EPSG','1142');
+INSERT INTO "compound_crs" VALUES('EPSG','9714','NAD83(CSRS) / UTM zone 24N + CGVD2013 height',NULL,'EPSG','9713','EPSG','6647',0);
+INSERT INTO "usage" VALUES('EPSG','15197','compound_crs','EPSG','9714','EPSG','4617','EPSG','1142');
+INSERT INTO "compound_crs" VALUES('EPSG','9715','NAD83(CSRS) / UTM zone 15N + CGVD2013a height',NULL,'EPSG','3159','EPSG','9245',0);
+INSERT INTO "usage" VALUES('EPSG','15200','compound_crs','EPSG','9715','EPSG','3414','EPSG','1142');
diff --git a/data/sql/concatenated_operation.sql b/data/sql/concatenated_operation.sql
index 0047404d..e7404cc9 100644
--- a/data/sql/concatenated_operation.sql
+++ b/data/sql/concatenated_operation.sql
@@ -31,7 +31,7 @@ INSERT INTO "usage" VALUES('EPSG','10276','concatenated_operation','EPSG','7811'
INSERT INTO "concatenated_operation" VALUES('EPSG','7965','Poolbeg height (ft(Br36)) to Malin Head height (1)','','EPSG','5754','EPSG','5731',0.1,'1',0);
INSERT INTO "usage" VALUES('EPSG','10349','concatenated_operation','EPSG','7965','EPSG','1305','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','7967','Poolbeg height (ft(Br36)) to Belfast height (1)','','EPSG','5754','EPSG','5732',0.1,'1',0);
-INSERT INTO "usage" VALUES('EPSG','10351','concatenated_operation','EPSG','7967','EPSG','1305','EPSG','1059');
+INSERT INTO "usage" VALUES('EPSG','10351','concatenated_operation','EPSG','7967','EPSG','2530','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','7973','NGVD29 height (ftUS) to NAVD88 height (1)','','EPSG','5702','EPSG','5703',0.02,'IOGP - US Conus W',0);
INSERT INTO "usage" VALUES('EPSG','10356','concatenated_operation','EPSG','7973','EPSG','2950','EPSG','1099');
INSERT INTO "concatenated_operation" VALUES('EPSG','7974','NGVD29 height (ftUS) to NAVD88 height (2)','','EPSG','5702','EPSG','5703',0.02,'IOGP - US Conus C',0);
diff --git a/data/sql/concatenated_operation_step.sql b/data/sql/concatenated_operation_step.sql
index 4f60032a..b3f6c945 100644
--- a/data/sql/concatenated_operation_step.sql
+++ b/data/sql/concatenated_operation_step.sql
@@ -28,23 +28,23 @@ INSERT INTO "concatenated_operation_step" VALUES('EPSG','6874',1,'EPSG','1265');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','6874',2,'EPSG','6873');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7811',1,'EPSG','1763');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7811',2,'EPSG','15958');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7965',1,'EPSG','7963');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7965',1,'EPSG','7813');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7965',2,'EPSG','7964');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7967',1,'EPSG','7963');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7967',1,'EPSG','7813');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7967',2,'EPSG','7966');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7973',1,'EPSG','7972');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7973',1,'EPSG','7813');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7973',2,'EPSG','7969');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7974',1,'EPSG','7972');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7974',1,'EPSG','7813');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7974',2,'EPSG','7970');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7975',1,'EPSG','7972');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7975',1,'EPSG','7813');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7975',2,'EPSG','7971');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7983',1,'EPSG','7982');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7983',1,'EPSG','7812');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7983',2,'EPSG','7977');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7986',1,'EPSG','7980');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7986',2,'EPSG','7984');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7986',2,'EPSG','7812');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','7987',1,'EPSG','7980');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7987',2,'EPSG','7984');
-INSERT INTO "concatenated_operation_step" VALUES('EPSG','7987',3,'EPSG','7985');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7987',2,'EPSG','7812');
+INSERT INTO "concatenated_operation_step" VALUES('EPSG','7987',3,'EPSG','7813');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','8047',1,'EPSG','1147');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','8047',2,'EPSG','1146');
INSERT INTO "concatenated_operation_step" VALUES('EPSG','8094',1,'EPSG','1763');
diff --git a/data/sql/conversion.sql b/data/sql/conversion.sql
index 06c20b19..93c14f82 100644
--- a/data/sql/conversion.sql
+++ b/data/sql/conversion.sql
@@ -1460,8 +1460,8 @@ INSERT INTO "conversion" VALUES('EPSG','7802','Cadastral Coordinate System 2005'
INSERT INTO "usage" VALUES('EPSG','10270','conversion','EPSG','7802','EPSG','3224','EPSG','1061');
INSERT INTO "conversion" VALUES('EPSG','7812','Height <> Depth Conversion','This is a parameter-less conversion to reverse the positive direction of the axis of a vertical CRS. Source and target CRSs must both have the same unit of measure.','EPSG','1068','Height Depth Reversal',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 "usage" VALUES('EPSG','10277','conversion','EPSG','7812','EPSG','1262','EPSG','1156');
-INSERT INTO "conversion" VALUES('EPSG','7813','Vertical Axis Unit Conversion','Source and target CRSs both must have the same axis direction (both up or both down). The Unit Conversion Scalar (ratio) used should be included in the audit trail.','EPSG','1069','Change of Vertical Unit','EPSG','1051','Unit conversion scalar',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 "usage" VALUES('EPSG','10278','conversion','EPSG','7813','EPSG','1262','EPSG','1156');
+INSERT INTO "conversion" VALUES('EPSG','7813','Vertical Axis Unit Conversion','Source and target CRSs both must have the same axis direction (both up or both down).','EPSG','1104','Change of Vertical Unit',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 "usage" VALUES('EPSG','10278','conversion','EPSG','7813','EPSG','1262','EPSG','1101');
INSERT INTO "conversion" VALUES('EPSG','7818','CS63 zone X1','On the Krassowsky 1940 ellipsoid an alternative but equivalent definition uses latitude of natural origin = 0° and false northing = -9214.692m.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.05,'EPSG','9110','EPSG','8802','Longitude of natural origin',23.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',1300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','10281','conversion','EPSG','7818','EPSG','4435','EPSG','1208');
INSERT INTO "conversion" VALUES('EPSG','7819','CS63 zone X2','On the Krassowsky 1940 ellipsoid an alternative but equivalent definition uses latitude of natural origin = 0° and false northing = -9214.692m.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.05,'EPSG','9110','EPSG','8802','Longitude of natural origin',26.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',2300000.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/conversion_triggers.sql b/data/sql/conversion_triggers.sql
index 001a8174..a14341f8 100644
--- a/data/sql/conversion_triggers.sql
+++ b/data/sql/conversion_triggers.sql
@@ -83,7 +83,7 @@ BEGIN
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1068' AND (NEW.method_name != 'Height Depth Reversal' OR NEW.param1_auth_name IS NOT NULL OR NEW.param1_code IS NOT NULL OR NEW.param1_name IS NOT NULL OR NEW.param1_value IS NOT NULL OR NEW.param1_uom_auth_name IS NOT NULL OR NEW.param1_uom_code IS NOT NULL OR NEW.param2_auth_name IS NOT NULL OR NEW.param2_code IS NOT NULL OR NEW.param2_name IS NOT NULL OR NEW.param2_value IS NOT NULL OR NEW.param2_uom_auth_name IS NOT NULL OR NEW.param2_uom_code IS NOT NULL OR NEW.param3_auth_name IS NOT NULL OR NEW.param3_code IS NOT NULL OR NEW.param3_name IS NOT NULL OR NEW.param3_value IS NOT NULL OR NEW.param3_uom_auth_name IS NOT NULL OR NEW.param3_uom_code IS NOT NULL OR NEW.param4_auth_name IS NOT NULL OR NEW.param4_code IS NOT NULL OR NEW.param4_name IS NOT NULL OR NEW.param4_value IS NOT NULL OR NEW.param4_uom_auth_name IS NOT NULL OR NEW.param4_uom_code IS NOT NULL OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Change of Vertical Unit')
- WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1069' AND (NEW.method_name != 'Change of Vertical Unit' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '1051' OR NEW.param1_name != 'Unit conversion scalar' OR (NOT((NEW.param1_value IS NULL AND NEW.param1_uom_auth_name IS NULL AND NEW.param1_uom_code IS NULL) OR (NEW.param1_value IS NOT NULL AND (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) = 'scale'))) OR NEW.param2_auth_name IS NOT NULL OR NEW.param2_code IS NOT NULL OR NEW.param2_name IS NOT NULL OR NEW.param2_value IS NOT NULL OR NEW.param2_uom_auth_name IS NOT NULL OR NEW.param2_uom_code IS NOT NULL OR NEW.param3_auth_name IS NOT NULL OR NEW.param3_code IS NOT NULL OR NEW.param3_name IS NOT NULL OR NEW.param3_value IS NOT NULL OR NEW.param3_uom_auth_name IS NOT NULL OR NEW.param3_uom_code IS NOT NULL OR NEW.param4_auth_name IS NOT NULL OR NEW.param4_code IS NOT NULL OR NEW.param4_name IS NOT NULL OR NEW.param4_value IS NOT NULL OR NEW.param4_uom_auth_name IS NOT NULL OR NEW.param4_uom_code IS NOT NULL OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
+ WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1104' AND (NEW.method_name != 'Change of Vertical Unit' OR NEW.param1_auth_name IS NOT NULL OR NEW.param1_code IS NOT NULL OR NEW.param1_name IS NOT NULL OR NEW.param1_value IS NOT NULL OR NEW.param1_uom_auth_name IS NOT NULL OR NEW.param1_uom_code IS NOT NULL OR NEW.param2_auth_name IS NOT NULL OR NEW.param2_code IS NOT NULL OR NEW.param2_name IS NOT NULL OR NEW.param2_value IS NOT NULL OR NEW.param2_uom_auth_name IS NOT NULL OR NEW.param2_uom_code IS NOT NULL OR NEW.param3_auth_name IS NOT NULL OR NEW.param3_code IS NOT NULL OR NEW.param3_name IS NOT NULL OR NEW.param3_value IS NOT NULL OR NEW.param3_uom_auth_name IS NOT NULL OR NEW.param3_uom_code IS NOT NULL OR NEW.param4_auth_name IS NOT NULL OR NEW.param4_code IS NOT NULL OR NEW.param4_name IS NOT NULL OR NEW.param4_value IS NOT NULL OR NEW.param4_uom_auth_name IS NOT NULL OR NEW.param4_uom_code IS NOT NULL OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Hotine Oblique Mercator (variant B)')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9815' AND (NEW.method_name != 'Hotine Oblique Mercator (variant B)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth of initial line' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8814' OR NEW.param4_name != 'Angle from Rectified to Skew Grid' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8815' OR NEW.param5_name != 'Scale factor on initial line' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'scale' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8816' OR NEW.param6_name != 'Easting at projection centre' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name != 'EPSG' OR NEW.param7_code != '8817' OR NEW.param7_name != 'Northing at projection centre' OR NEW.param7_value IS NULL OR NEW.param7_uom_auth_name IS NULL OR NEW.param7_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param7_uom_auth_name AND code = NEW.param7_uom_code) != 'length');
diff --git a/data/sql/extent.sql b/data/sql/extent.sql
index fd48d05d..7b0d637e 100644
--- a/data/sql/extent.sql
+++ b/data/sql/extent.sql
@@ -37,7 +37,7 @@ INSERT INTO "extent" VALUES('EPSG','1057','Burkina Faso','Burkina Faso.',9.39,15
INSERT INTO "extent" VALUES('EPSG','1058','Burundi','Burundi.',-4.45,-2.3,28.98,30.86,0);
INSERT INTO "extent" VALUES('EPSG','1059','Cambodia','Cambodia - onshore and offshore.',8.78,14.73,101.33,107.64,0);
INSERT INTO "extent" VALUES('EPSG','1060','Cameroon','Cameroon - onshore and offshore.',1.65,13.09,8.32,16.21,0);
-INSERT INTO "extent" VALUES('EPSG','1061','Canada','Canada - onshore and offshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon.',40.04,86.46,-141.01,-47.74,0);
+INSERT INTO "extent" VALUES('EPSG','1061','Canada','Canada - onshore and offshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon.',38.2122786,86.453745196084,-141.00299072266,-40.7351522,0);
INSERT INTO "extent" VALUES('EPSG','1062','Cape Verde','Cape Verde - onshore and offshore. Includes Boa Vista, Brava, Fogo, Maio, Sal, Santo Antao, Sao Nicolau, Sao Tiago, Sao Vicente.',11.47,20.54,-28.85,-19.53,0);
INSERT INTO "extent" VALUES('EPSG','1063','Cayman Islands','Cayman Islands - onshore and offshore. Includes Grand Cayman, Little Cayman and Cayman Brac.',17.58,20.68,-83.6,-78.72,0);
INSERT INTO "extent" VALUES('EPSG','1064','Central African Republic','Central African Republic.',2.22,11.01,14.41,27.46,0);
@@ -1126,10 +1126,10 @@ INSERT INTO "extent" VALUES('EPSG','2146','North America - 90°W to 84°W and NA
INSERT INTO "extent" VALUES('EPSG','2147','North America - 84°W to 78°W and NAD27 by country','North America - between 84°W and 78°W. Bahamas. Canada - Nunavut; Ontario; Quebec. Costa Rica. Cuba. Honduras. Nicaragua. United States (USA) - Florida; Georgia; Kentucky; Maryland; Michigan; New York; North Carolina; Ohio; Pennsylvania; South Carolina; Tennessee; Virginia; West Virginia. Onshore for Canadian Arctic. onshore and offshore for US east coast and Cuba, with usage in Bahamas onshore plus offshore over internal continental shelf only.',7.98,83.03,-84.0,-78.0,0);
INSERT INTO "extent" VALUES('EPSG','2148','North America - 78°W to 72°W and NAD27 by country','North America - between 78°W and 72°W. Bahamas. Canada - Nunavut; Ontario; Quebec. Cuba. United States (USA) - Connecticut; Delaware; Maryland; Massachusetts; New Hampshire; New Jersey; New York; North Carolina; Pennsylvania; Virginia; Vermont. Onshore for Canadian arctic. onshore and offshore for US east coast and Cuba, with usage in Bahamas onshore plus offshore over internal continental shelf only.',18.83,83.16,-78.0,-72.0,0);
INSERT INTO "extent" VALUES('EPSG','2149','North America - 72°W to 66°W and NAD27 by country','North America - between 72°W and 66°W. Canada - New Brunswick; Labrador; Nunavut; Nova Scotia; Quebec. United States (USA) - Connecticut; Maine; Massachusetts; New Hampshire; New York (Long Island); Rhode Island; Vermont. Onshore and offshore for US and Canadian east coasts.',33.61,83.17,-72.0,-66.0,0);
-INSERT INTO "extent" VALUES('EPSG','2150','North America - 66°W to 60°W and NAD27 by country','North America - between 66°W and 60°W - onshore and offshore. Canada - New Brunswick; Labrador; Nova Scotia; Nunavut; Prince Edward Island; Quebec. United States (USA) offshore Atlantic.',39.85,82.97,-66.0,-60.0,0);
-INSERT INTO "extent" VALUES('EPSG','2151','Canada - 60°W to 54°W','Canada between 60°W and 54°W - Newfoundland and Labrador; Nunavut; Quebec.',40.57,84.0,-60.0,-54.0,0);
-INSERT INTO "extent" VALUES('EPSG','2152','Canada - 54°W to 48°W','Canada between 54°W and 48°W onshore and offshore - Newfoundland and Labrador.',43.27,57.65,-54.0,-48.0,0);
-INSERT INTO "extent" VALUES('EPSG','2153','Canada - 48°W to 42°W','Canada offshore Atlantic - east of 48°W.',46.46,49.18,-48.0,-47.74,0);
+INSERT INTO "extent" VALUES('EPSG','2150','North America - 66°W to 60°W and NAD27 by country','North America - between 66°W and 60°W - onshore and offshore. Canada - New Brunswick; Labrador; Nova Scotia; Nunavut; Prince Edward Island; Quebec. United States (USA) offshore Atlantic.',38.2122786,82.963477642068,-66.0,-60.0,0);
+INSERT INTO "extent" VALUES('EPSG','2151','Canada - 60°W to 54°W','Canada between 60°W and 54°W - Newfoundland and Labrador; Nunavut; Quebec.',38.5697932,84.0,-60.0,-54.0,0);
+INSERT INTO "extent" VALUES('EPSG','2152','Canada - 54°W to 48°W','Canada between 54°W and 48°W onshore and offshore - Newfoundland and Labrador.',39.5085003,57.644712897771,-54.0,-48.0,0);
+INSERT INTO "extent" VALUES('EPSG','2153','Canada - 48°W to 42°W','Canada offshore Atlantic - 48°W to 42°W.',39.855771427585,54.468246690378,-48.0,-42.0,0);
INSERT INTO "extent" VALUES('EPSG','2154','USA - Alabama - SPCS - E','United States (USA) - Alabama east of approximately 86°37''W - counties Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; StClair; Talladega; Tallapoosa.',30.99,35.0,-86.79,-84.89,0);
INSERT INTO "extent" VALUES('EPSG','2155','USA - Alabama - SPCS - W','United States (USA) - Alabama west of approximately 86°37''W - counties Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston.',30.14,35.02,-88.48,-86.3,0);
INSERT INTO "extent" VALUES('EPSG','2156','USA - Alaska - Panhandle','United States (USA) - Alaska - east of 141°W; i.e. Panhandle.',54.61,60.35,-141.0,-129.99,0);
@@ -1807,7 +1807,7 @@ INSERT INTO "extent" VALUES('EPSG','2827','Africa - South Sudan and Sudan - 24°
INSERT INTO "extent" VALUES('EPSG','2828','Guadeloupe - St Martin and St Barthelemy - onshore','Guadeloupe - onshore - St Martin and St Barthélemy islands.',17.82,18.17,-63.21,-62.73,0);
INSERT INTO "extent" VALUES('EPSG','2829','Guadeloupe - Grande-Terre and surrounding islands - onshore','Guadeloupe - onshore - Basse-Terre, Grande-Terre, La Desirade, Marie-Galante, Les Saintes.',15.8,16.55,-61.85,-60.97,0);
INSERT INTO "extent" VALUES('EPSG','2830','World (by country)','World: Afghanistan, Albania, Algeria, American Samoa, Andorra, Angola, Anguilla, Antarctica, Antigua and Barbuda, Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Bahamas, Bahrain, Bangladesh, Barbados, Belgium, Belgium, Belize, Benin, Bermuda, Bhutan, Bolivia, Bonaire, Saint Eustasius and Saba, Bosnia and Herzegovina, Botswana, Bouvet Island, Brazil, British Indian Ocean Territory, British Virgin Islands, Brunei Darussalam, Bulgaria, Burkina Faso, Burundi, Cambodia, Cameroon, Canada, Cape Verde, Cayman Islands, Central African Republic, Chad, Chile, China, Christmas Island, Cocos (Keeling) Islands, Comoros, Congo, Cook Islands, Costa Rica, Côte d''Ivoire (Ivory Coast), Croatia, Cuba, Curacao, Cyprus, Czechia, Denmark, Djibouti, Dominica, Dominican Republic, East Timor, Ecuador, Egypt, El Salvador, Equatorial Guinea, Eritrea, Estonia, Eswatini (Swaziland), Ethiopia, Falkland Islands (Malvinas), Faroe Islands, Fiji, Finland, France, French Guiana, French Polynesia, French Southern Territories, Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, Guinea-Bissau, Guyana, Haiti, Heard Island and McDonald Islands, Holy See (Vatican City State), Honduras, China - Hong Kong, Hungary, Iceland, India, Indonesia, Islamic Republic of Iran, Iraq, Ireland, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Democratic People''s Republic of Korea (North Korea), Republic of Korea (South Korea), Kosovo, Kuwait, Kyrgyzstan, Lao People''s Democratic Republic (Laos), Latvia, Lebanon, Lesotho, Liberia, Libyan Arab Jamahiriya, Liechtenstein, Lithuania, Luxembourg, China - Macao, Madagascar, Malawi, Malaysia, Maldives, Mali, Malta, Marshall Islands, Martinique, Mauritania, Mauritius, Mayotte, Mexico, Federated States of Micronesia, Monaco, Mongolia, Montenegro, Montserrat, Morocco, Mozambique, Myanmar (Burma), Namibia, Nauru, Nepal, Netherlands, New Caledonia, New Zealand, Nicaragua, Niger, Nigeria, Niue, Norfolk Island, North Macedonia, Northern Mariana Islands, Norway, Oman, Pakistan, Palau, Panama, Papua New Guinea (PNG), Paraguay, Peru, Philippines, Pitcairn, Poland, Portugal, Puerto Rico, Qatar, Reunion, Romania, Russian Federation, Rwanda, Saint Kitts and Nevis, Saint Helena, Ascension and Tristan da Cunha, Saint Lucia, Saint Pierre and Miquelon, Saint Vincent and the Grenadines, Samoa, San Marino, Sao Tome and Principe, Saudi Arabia, Senegal, Serbia, Seychelles, Sierra Leone, Singapore, Slovakia (Slovak Republic), Slovenia, Sint Maarten, Solomon Islands, Somalia, South Africa, South Georgia and the South Sandwich Islands, South Sudan, Spain, Sri Lanka, Sudan, Suriname, Svalbard and Jan Mayen, Sweden, Switzerland, Syrian Arab Republic, Taiwan, Tajikistan, United Republic of Tanzania, Thailand, The Democratic Republic of the Congo (Zaire), Togo, Tokelau, Tonga, Trinidad and Tobago, Tunisia, Turkey, Turkmenistan, Turks and Caicos Islands, Tuvalu, Uganda, Ukraine, United Arab Emirates (UAE), United Kingdom (UK), United States (USA), United States Minor Outlying Islands, Uruguay, Uzbekistan, Vanuatu, Venezuela, Vietnam, US Virgin Islands, Wallis and Futuna, Western Sahara, Yemen, Zambia, Zimbabwe.',-90.0,90.0,-180.0,180.0,0);
-INSERT INTO "extent" VALUES('EPSG','2831','Canada - Atlantic offshore','Canada - offshore Newfoundland and Labrador, New Brunswick and Nova Scotia.',40.040199904302,64.205208824162,-67.743055559783,-47.743430543984,0);
+INSERT INTO "extent" VALUES('EPSG','2831','Canada - Atlantic offshore','Canada - offshore Newfoundland and Labrador, New Brunswick and Nova Scotia - west of 44°W and north of 40°N.',40.0,64.205208824162,-67.743055559783,-44.0,0);
INSERT INTO "extent" VALUES('EPSG','2832','Canada - British Columbia','Canada - British Columbia.',48.25,60.01,-139.04,-114.08,0);
INSERT INTO "extent" VALUES('EPSG','2833','Sweden - 12 00','Sweden - communes west of approximately 12°45''E and south of approximately 60°N. See information source for map.',56.74,60.13,10.93,13.11,0);
INSERT INTO "extent" VALUES('EPSG','2834','Sweden - 13 30','Sweden - communes between approximately 12°45''E and 14°15''E and south of approximately 62°10''N. See information source for map.',55.28,62.28,12.12,14.79,0);
@@ -3493,7 +3493,7 @@ INSERT INTO "extent" VALUES('EPSG','4513','USA - Kansas - Pittsburg','United Sta
INSERT INTO "extent" VALUES('EPSG','4514','Pacific - Guam and NMI west of 144°E','Guam and Northern Mariana Islands; offshore west of 144°E.',10.95,23.9,141.19,144.01,0);
INSERT INTO "extent" VALUES('EPSG','4515','USA - FBN','American Samoa - Tutuila, Aunu''u, Ofu, Olesega, Ta''u and Rose islands - onshore. Guam - onshore. Northern Mariana Islands - onshore. Puerto Rico - onshore. United States (USA) - CONUS - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming - onshore plus Gulf of Mexico offshore continental shelf (GoM OCS). US Virgin Islands - onshore.',-14.59,49.38,144.58,-64.51,0);
INSERT INTO "extent" VALUES('EPSG','4516','USA - CONUS and GoM','United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Gulf of Mexico offshore continental shelf (GoM OCS).',23.82,49.38,-124.79,-66.91,0);
-INSERT INTO "extent" VALUES('EPSG','4517','Canada - NAD27','Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast.',40.04,83.17,-141.01,-47.74,0);
+INSERT INTO "extent" VALUES('EPSG','4517','Canada - NAD27','Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N.',40.0,83.16267232269,-141.00299072266,-44.0,0);
INSERT INTO "extent" VALUES('EPSG','4518','Pacific - Guam and NMI east of 144°E','Guam and Northern Mariana Islands; onshore and offshore east of 144°E.',11.05,23.9,144.0,149.55,0);
INSERT INTO "extent" VALUES('EPSG','4519','Algeria - 32°N to 34°39''N','Algeria - 35.6 grads to 38.5 grads North (32°N to 34°39''N).',31.99,34.66,-2.95,9.09,0);
INSERT INTO "extent" VALUES('EPSG','4520','World centred on 90°W','World centred on the Americas.',-90.0,90.0,90.01,89.99,0);
@@ -3592,3 +3592,5 @@ INSERT INTO "extent" VALUES('EPSG','4613','Europe - Lyon-Turin','France and Ital
INSERT INTO "extent" VALUES('EPSG','4614','Argentina - Comodoro Rivadavia - west of 67.5°W','Argentina - Comodoro Rivadavia area west of 67°30''W.',-46.699998855591,-45.199998855591,-69.5,-67.5,0);
INSERT INTO "extent" VALUES('EPSG','4615','Norway, Svalbard and Jan Mayen - offshore','Norway (offshore) and Svalbard and Jan Mayen (offshore).',56.087,84.723,-13.63,38.0,0);
INSERT INTO "extent" VALUES('EPSG','4616','UK - Great Britain onshore; Isle of Man','United Kingdom (UK) - Great Britain - England, Scotland and Wales onshore; Isle of Man onshore.',49.815037348282,60.926651214189,-8.6861861839429,1.9002468741098,0);
+INSERT INTO "extent" VALUES('EPSG','4617','Canada - east of 42°W','Canada offshore Atlantic - east of 42°W.',45.538352195322,49.529643131642,-42.0,-40.7351522,0);
+INSERT INTO "extent" VALUES('EPSG','4618','Canada - 41°N to 85°N, west of 50°W','Canada - onshore and offshore between 41°N and 85°N and west of 50°W - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon.',41.0,85.0,-141.00299072266,-50.0,0);
diff --git a/data/sql/geodetic_crs.sql b/data/sql/geodetic_crs.sql
index 2e683343..13ed9fff 100644
--- a/data/sql/geodetic_crs.sql
+++ b/data/sql/geodetic_crs.sql
@@ -923,7 +923,7 @@ INSERT INTO "usage" VALUES('EPSG','3556','geodetic_crs','EPSG','4726','EPSG','31
INSERT INTO "geodetic_crs" VALUES('EPSG','4727','Midway 1961',NULL,'geographic 2D','EPSG','6422','EPSG','6727',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3557','geodetic_crs','EPSG','4727','EPSG','3202','EPSG','1160');
INSERT INTO "geodetic_crs" VALUES('EPSG','4728','PN84',NULL,'geographic 2D','EPSG','6422','EPSG','6728',NULL,0);
-INSERT INTO "usage" VALUES('EPSG','3558','geodetic_crs','EPSG','4728','EPSG','3873','EPSG','1160');
+INSERT INTO "usage" VALUES('EPSG','3558','geodetic_crs','EPSG','4728','EPSG','4598','EPSG','1160');
INSERT INTO "geodetic_crs" VALUES('EPSG','4729','Pitcairn 1967',NULL,'geographic 2D','EPSG','6422','EPSG','6729',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3559','geodetic_crs','EPSG','4729','EPSG','3208','EPSG','1160');
INSERT INTO "geodetic_crs" VALUES('EPSG','4730','Santo 1965',NULL,'geographic 2D','EPSG','6422','EPSG','6730',NULL,0);
diff --git a/data/sql/grid_transformation.sql b/data/sql/grid_transformation.sql
index 31cce699..f0c02f4b 100644
--- a/data/sql/grid_transformation.sql
+++ b/data/sql/grid_transformation.sql
@@ -549,7 +549,7 @@ INSERT INTO "usage" VALUES('EPSG','10760','grid_transformation','EPSG','8668','E
INSERT INTO "grid_transformation" VALUES('EPSG','8669','NAD83 to NAD83(HARN) (50)','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°.','EPSG','1074','NADCON5 (2D)','EPSG','4269','EPSG','4152',0.15,'EPSG','8657','Latitude difference file','nadcon5.nad83_1986.nad83_1993.prvi.lat.trn.20160901.b','EPSG','8658','Longitude difference file','nadcon5.nad83_1986.nad83_1993.prvi.lon.trn.20160901.b',NULL,NULL,'NGS-Pri Vir Nadcon5',0);
INSERT INTO "usage" VALUES('EPSG','10761','grid_transformation','EPSG','8669','EPSG','3634','EPSG','1027');
INSERT INTO "grid_transformation" VALUES('EPSG','8676','Canada velocity grid v6','','EPSG','1070','Point motion by grid (Canada NTv2_Vel)','EPSG','8251','EPSG','8251',0.01,'EPSG','1050','Point motion velocity grid file','cvg60.cvb',NULL,NULL,NULL,NULL,NULL,NULL,'NRC-Can cvg6.0',0);
-INSERT INTO "usage" VALUES('EPSG','10767','grid_transformation','EPSG','8676','EPSG','1061','EPSG','1058');
+INSERT INTO "usage" VALUES('EPSG','10767','grid_transformation','EPSG','8676','EPSG','4618','EPSG','1058');
INSERT INTO "grid_transformation" VALUES('EPSG','8885','RGF93 to NGF-IGN69 height (3)','Replaces RGF93 to NGF-IGN69 height (2) (code 8371). Accuracy at each grid node is given within the geoid model file. Recommended interpolation method is bilinear. For reversible alternative see RGF93 to RGF93 + NGF-IGN69 height (3) (code 9638).','EPSG','1073','Geographic3D to GravityRelatedHeight (IGN2009)','EPSG','4965','EPSG','5720',0.01,'EPSG','8666','Geoid (height correction) model file','RAF18.tac',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra 18',0);
INSERT INTO "usage" VALUES('EPSG','14492','grid_transformation','EPSG','8885','EPSG','1326','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9105','ATS77 to NAD83 (1)','','EPSG','9615','NTv2','EPSG','4122','EPSG','4269',0.5,'EPSG','8656','Latitude and longitude difference file','GS7783.GSB',NULL,NULL,NULL,NULL,NULL,NULL,'NSGC-Can NS',0);
diff --git a/data/sql/helmert_transformation.sql b/data/sql/helmert_transformation.sql
index 56453cba..0ef56fc0 100644
--- a/data/sql/helmert_transformation.sql
+++ b/data/sql/helmert_transformation.sql
@@ -2426,6 +2426,8 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','9690','WGS 84 to GDA2020 (3)
INSERT INTO "usage" VALUES('EPSG','14920','helmert_transformation','EPSG','9690','EPSG','4177','EPSG','1276');
INSERT INTO "helmert_transformation" VALUES('EPSG','9703','ETRF2000-PL to ETRS89 (1)','','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','9702','EPSG','4258',0.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,'IOGP-Pol',0);
INSERT INTO "usage" VALUES('EPSG','15011','helmert_transformation','EPSG','9703','EPSG','1192','EPSG','1161');
+INSERT INTO "helmert_transformation" VALUES('EPSG','9743','PN68 to WGS 84 (1)','Determined at 1 satellite station. Accuracy +/- 25m in each axis. Unclear from information source whether the source CRS is PN68 or PN84 - see also CT code 15815. Given the accuracy, can be considered to apply to either.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','9403','EPSG','4326',44.0,-307.0,-92.0,127.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,'DMA-Esp Canary',0);
+INSERT INTO "usage" VALUES('EPSG','15321','helmert_transformation','EPSG','9743','EPSG','3873','EPSG','1160');
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.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4302','EPSG','4326',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 "usage" VALUES('EPSG','11086','helmert_transformation','EPSG','10085','EPSG','1339','EPSG','1136');
INSERT INTO "helmert_transformation" VALUES('EPSG','10086','JAD69 to WGS 72 (1)','Derived in 1977 through Transit observations at 2 stations by US DMA.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4242','EPSG','4322',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);
@@ -2684,8 +2686,8 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','15813','South Georgia 1968 t
INSERT INTO "usage" VALUES('EPSG','11824','helmert_transformation','EPSG','15813','EPSG','3529','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','15814','SIGD61 to WGS 84 (1)','Determined from 1 satellite station. Accuracy +/- 25m in each axis.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4726','EPSG','4326',44.0,42.0,124.0,147.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,'DMA-Cym Little Brac',0);
INSERT INTO "usage" VALUES('EPSG','11825','helmert_transformation','EPSG','15814','EPSG','3186','EPSG','1160');
-INSERT INTO "helmert_transformation" VALUES('EPSG','15815','PN84 to WGS 84 (1)','Determined at 1 satellite station. Accuracy +/- 25m in each axis.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4728','EPSG','4326',44.0,-307.0,-92.0,127.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,'DMA-Esp Canary',0);
-INSERT INTO "usage" VALUES('EPSG','11826','helmert_transformation','EPSG','15815','EPSG','3873','EPSG','1160');
+INSERT INTO "helmert_transformation" VALUES('EPSG','15815','PN84 to WGS 84 (1)','Determined at 1 satellite station. Accuracy +/- 25m in each axis. Unclear from information source whether the source CRS is PN68 or PN84 - see also CT code 9743. Given the accuracy, can be considered to apply to either.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4728','EPSG','4326',44.0,-307.0,-92.0,127.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,'DMA-Esp Canary',0);
+INSERT INTO "usage" VALUES('EPSG','11826','helmert_transformation','EPSG','15815','EPSG','4598','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','15816','Tristan 1968 to WGS 84 (1)','Determined at 1 satellite station. Accuracy +/- 25m in each axis.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4734','EPSG','4326',44.0,-632.0,438.0,-609.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,'DMA-Shn Tris',0);
INSERT INTO "usage" VALUES('EPSG','11827','helmert_transformation','EPSG','15816','EPSG','3184','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','15817','Midway 1961 to WGS 84 (1)','Derived at 1 satellite station. Accuracy +/- 25m in each axis. Information source states "provided for historical purposes only. These parameter [values] should not be used". Replaced by Midway 1961 to WGS 84 (2) (tfm code 15818).','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4727','EPSG','4326',44.0,912.0,-58.0,1227.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,'DMA-Umi Midway 1987',0);
diff --git a/data/sql/metadata.sql b/data/sql/metadata.sql
index 97a951dc..705f8274 100644
--- a/data/sql/metadata.sql
+++ b/data/sql/metadata.sql
@@ -9,8 +9,8 @@
INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MAJOR', 1);
INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MINOR', 1);
-INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.018');
-INSERT INTO "metadata" VALUES('EPSG.DATE', '2021-04-02');
+INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.019');
+INSERT INTO "metadata" VALUES('EPSG.DATE', '2021-04-20');
-- The value of ${PROJ_VERSION} is substituted at build time by the actual
-- value.
diff --git a/data/sql/other_transformation.sql b/data/sql/other_transformation.sql
index 1818f5bc..990e369f 100644
--- a/data/sql/other_transformation.sql
+++ b/data/sql/other_transformation.sql
@@ -384,57 +384,57 @@ INSERT INTO "other_transformation" VALUES('EPSG','7873','EGM96 height to POM96 h
INSERT INTO "usage" VALUES('EPSG','10307','other_transformation','EPSG','7873','EPSG','4425','EPSG','1133');
INSERT INTO "other_transformation" VALUES('EPSG','7874','EGM2008 height to POM08 height (1)','Defines POM08 heights.','EPSG','9616','Vertical Offset','EPSG','3855','EPSG','7841',0.0,'EPSG','8603','Vertical Offset',-0.93,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'QC-Png Gulf-Cen',0);
INSERT INTO "usage" VALUES('EPSG','10308','other_transformation','EPSG','7874','EPSG','4425','EPSG','1133');
-INSERT INTO "other_transformation" VALUES('EPSG','7963','Poolbeg height (ft(Br36)) to Poolbeg height (m)','Change of unit from British foot (1936) [ft(BR36)] to metre.','EPSG','1069','Change of Vertical Unit','EPSG','5754','EPSG','7962',NULL,'EPSG','1051','Unit conversion scalar',0.3048007491,'EPSG','9201',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('EPSG','7963','Poolbeg height (ft(Br36)) to Poolbeg height (m)','Change of unit from British foot (1936) [ft(BR36)] to metre.','EPSG','1069','Change of Vertical Unit','EPSG','5754','EPSG','7962',NULL,'EPSG','1051','Unit conversion scalar',0.3048007491,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10347','other_transformation','EPSG','7963','EPSG','1305','EPSG','1101');
INSERT INTO "other_transformation" VALUES('EPSG','7964','Poolbeg height (m) to Malin Head height (1)','Poolbeg vertical reference surface is 2.7m below Malin Head surface. Nominal accuracy 0.1m but transformations are subject to localised anomalies.','EPSG','9616','Vertical Offset','EPSG','7962','EPSG','5731',0.1,'EPSG','8603','Vertical Offset',-2.7,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OSI-Ire',0);
INSERT INTO "usage" VALUES('EPSG','10348','other_transformation','EPSG','7964','EPSG','1305','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','7966','Poolbeg height (m) to Belfast height (1)','Poolbeg vertical reference surface is 2.7m below Belfast surface. Nominal accuracy 0.1m but transformations are subject to localised anomalies.','EPSG','9616','Vertical Offset','EPSG','7962','EPSG','5732',0.1,'EPSG','8603','Vertical Offset',-2.7,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OSI-Ire',0);
-INSERT INTO "usage" VALUES('EPSG','10350','other_transformation','EPSG','7966','EPSG','1305','EPSG','1059');
-INSERT INTO "other_transformation" VALUES('EPSG','7972','NGVD29 height (ftUS) to NGVD29 height (m)','Change of unit from US survey foot (ftUS) to metre. 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5702','EPSG','7968',NULL,'EPSG','1051','Unit conversion scalar',0.304800609601219,'EPSG','9201',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 "usage" VALUES('EPSG','10350','other_transformation','EPSG','7966','EPSG','2530','EPSG','1059');
+INSERT INTO "other_transformation" VALUES('EPSG','7972','NGVD29 height (ftUS) to NGVD29 height (m)','Change of unit from US survey foot (ftUS) to metre. 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5702','EPSG','7968',NULL,'EPSG','1051','Unit conversion scalar',0.304800609601219,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10355','other_transformation','EPSG','7972','EPSG','1323','EPSG','1101');
INSERT INTO "other_transformation" VALUES('EPSG','7977','HKPD depth to HKCD depth (1)','The HKPD vertical reference surface is 0.146m above the HKCD surface.','EPSG','9616','Vertical Offset','EPSG','7976','EPSG','5739',0.0,'EPSG','8603','Vertical Offset',-0.146,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SMO-HK',0);
INSERT INTO "usage" VALUES('EPSG','10359','other_transformation','EPSG','7977','EPSG','3335','EPSG','1060');
-INSERT INTO "other_transformation" VALUES('EPSG','7978','NGVD29 height (ftUS) to NGVD29 depth (ftUS)','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5702','EPSG','6359',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','7978','NGVD29 height (ftUS) to NGVD29 depth (ftUS)','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5702','EPSG','6359',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10360','other_transformation','EPSG','7978','EPSG','1323','EPSG','1111');
INSERT INTO "other_transformation" VALUES('EPSG','7980','KOC CD height to KOC WD height (1)','The KOC CD vertical reference surface is 4.74m (15.55ft) below KOC WD surface.','EPSG','9616','Vertical Offset','EPSG','5790','EPSG','7979',0.1,'EPSG','8603','Vertical Offset',-4.74,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'KOC-Kwt',0);
INSERT INTO "usage" VALUES('EPSG','10361','other_transformation','EPSG','7980','EPSG','3267','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','7981','Kuwait PWD height to KOC WD height (1)','The KOC WD vertical reference surface is 4.25m above the Kuwait PWD surface.','EPSG','9616','Vertical Offset','EPSG','5788','EPSG','7979',0.1,'EPSG','8603','Vertical Offset',-4.25,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'KOC-Kwt',0);
INSERT INTO "usage" VALUES('EPSG','10362','other_transformation','EPSG','7981','EPSG','3267','EPSG','1059');
-INSERT INTO "other_transformation" VALUES('EPSG','7982','HKPD height to HKPD depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5738','EPSG','7976',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','7982','HKPD height to HKPD depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5738','EPSG','7976',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10363','other_transformation','EPSG','7982','EPSG','3334','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','7984','KOC WD height to KOC WD depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','7979','EPSG','5789',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','7984','KOC WD height to KOC WD depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','7979','EPSG','5789',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10365','other_transformation','EPSG','7984','EPSG','3267','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','7985','KOC WD depth to KOC WD depth (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048m.','EPSG','1069','Change of Vertical Unit','EPSG','5789','EPSG','5614',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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('EPSG','7985','KOC WD depth to KOC WD depth (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048m.','EPSG','1069','Change of Vertical Unit','EPSG','5789','EPSG','5614',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10366','other_transformation','EPSG','7985','EPSG','3267','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','7988','NAVD88 height to NAVD88 height (ftUS)','Change of unit from metre to US survey foot. 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5703','EPSG','6360',NULL,'EPSG','1051','Unit conversion scalar',3.28083333333333,'EPSG','9201',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('EPSG','7988','NAVD88 height to NAVD88 height (ftUS)','Change of unit from metre to US survey foot. 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5703','EPSG','6360',NULL,'EPSG','1051','Unit conversion scalar',3.28083333333333,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10369','other_transformation','EPSG','7988','EPSG','3664','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','7989','NAVD88 height to NAVD88 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5703','EPSG','6357',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','7989','NAVD88 height to NAVD88 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5703','EPSG','6357',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10370','other_transformation','EPSG','7989','EPSG','4161','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','7990','NAVD88 height (ftUS) to NAVD88 depth (ftUS)','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','6360','EPSG','6358',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','7990','NAVD88 height (ftUS) to NAVD88 depth (ftUS)','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','6360','EPSG','6358',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10371','other_transformation','EPSG','7990','EPSG','3664','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8038','Instantaneous Water Level height to Instantaneous Water Level depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5829','EPSG','5831',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8038','Instantaneous Water Level height to Instantaneous Water Level depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5829','EPSG','5831',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10395','other_transformation','EPSG','8038','EPSG','1262','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8039','MSL height to MSL depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5714','EPSG','5715',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8039','MSL height to MSL depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5714','EPSG','5715',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10396','other_transformation','EPSG','8039','EPSG','1262','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8054','MSL height to MSL height (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048m.','EPSG','1069','Change of Vertical Unit','EPSG','5714','EPSG','8050',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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('EPSG','8054','MSL height to MSL height (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048m.','EPSG','1069','Change of Vertical Unit','EPSG','5714','EPSG','8050',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10403','other_transformation','EPSG','8054','EPSG','1262','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','8055','MSL height to MSL height (ftUS)','Change of unit from metre to US survey foot (ftUS). 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5714','EPSG','8052',NULL,'EPSG','1051','Unit conversion scalar',3.28083333333333,'EPSG','9201',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('EPSG','8055','MSL height to MSL height (ftUS)','Change of unit from metre to US survey foot (ftUS). 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5714','EPSG','8052',NULL,'EPSG','1051','Unit conversion scalar',3.28083333333333,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10404','other_transformation','EPSG','8055','EPSG','1245','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','8056','MSL depth to MSL depth (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048m.','EPSG','1069','Change of Vertical Unit','EPSG','5715','EPSG','8051',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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('EPSG','8056','MSL depth to MSL depth (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048m.','EPSG','1069','Change of Vertical Unit','EPSG','5715','EPSG','8051',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10405','other_transformation','EPSG','8056','EPSG','1262','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','8057','MSL depth to MSL depth (ftUS)','Change of unit from metre to US survey foot (ftUS). 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5715','EPSG','8053',NULL,'EPSG','1051','Unit conversion scalar',3.28083333333333,'EPSG','9201',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('EPSG','8057','MSL depth to MSL depth (ftUS)','Change of unit from metre to US survey foot (ftUS). 1 ftUS = (12/39.37)m ≈ 0.304800609601219m.','EPSG','1069','Change of Vertical Unit','EPSG','5715','EPSG','8053',NULL,'EPSG','1051','Unit conversion scalar',3.28083333333333,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10406','other_transformation','EPSG','8057','EPSG','1245','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','8060','Baltic 1977 height to Baltic 1977 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5705','EPSG','5612',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8060','Baltic 1977 height to Baltic 1977 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5705','EPSG','5612',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10407','other_transformation','EPSG','8060','EPSG','2423','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8229','NAVD88 height to NAVD88 height (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048. For States which have adopted International feet for their State Plane coordinate systems.','EPSG','1069','Change of Vertical Unit','EPSG','5703','EPSG','8228',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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('EPSG','8229','NAVD88 height to NAVD88 height (ft)','Change of unit from metre to International foot (ft). 1ft = 0.3048. For States which have adopted International feet for their State Plane coordinate systems.','EPSG','1069','Change of Vertical Unit','EPSG','5703','EPSG','8228',NULL,'EPSG','1051','Unit conversion scalar',3.28083989501312,'EPSG','9201',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,1);
INSERT INTO "usage" VALUES('EPSG','10445','other_transformation','EPSG','8229','EPSG','4464','EPSG','1101');
-INSERT INTO "other_transformation" VALUES('EPSG','8354','Black Sea height to Black Sea depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5735','EPSG','5336',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8354','Black Sea height to Black Sea depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5735','EPSG','5336',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10504','other_transformation','EPSG','8354','EPSG','3251','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8355','AIOC95 height to AIOC95 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5797','EPSG','5734',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8355','AIOC95 height to AIOC95 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5797','EPSG','5734',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10505','other_transformation','EPSG','8355','EPSG','2592','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8356','Caspian height to Caspian depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5611','EPSG','5706',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8356','Caspian height to Caspian depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','5611','EPSG','5706',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10506','other_transformation','EPSG','8356','EPSG','1291','EPSG','1111');
-INSERT INTO "other_transformation" VALUES('EPSG','8359','Baltic 1957 height to Baltic 1957 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','8357','EPSG','8358',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,NULL,NULL,NULL,0);
+INSERT INTO "other_transformation" VALUES('EPSG','8359','Baltic 1957 height to Baltic 1957 depth','Change of axis positive direction from up to down.','EPSG','1068','Height Depth Reversal','EPSG','8357','EPSG','8358',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,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','10507','other_transformation','EPSG','8359','EPSG','1306','EPSG','1111');
INSERT INTO "other_transformation" VALUES('EPSG','9371','Vienna height to GHA height (1)','Defines Wiener Null surface. GHA vertical reference surface is 156.68m below Wiener Null surface.','EPSG','9616','Vertical Offset','EPSG','8881','EPSG','5778',0.0,'EPSG','8603','Vertical Offset',156.68,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut Wien',0);
INSERT INTO "usage" VALUES('EPSG','13986','other_transformation','EPSG','9371','EPSG','4585','EPSG','1059');
diff --git a/data/sql/proj_db_table_defs.sql b/data/sql/proj_db_table_defs.sql
index 9b1d3dce..368d24f3 100644
--- a/data/sql/proj_db_table_defs.sql
+++ b/data/sql/proj_db_table_defs.sql
@@ -500,6 +500,7 @@ BEGIN
'EPSG_1052_Colombia Urban',
'EPSG_1068_Height Depth Reversal',
'EPSG_1069_Change of Vertical Unit',
+ 'EPSG_1104_Change of Vertical Unit',
'EPSG_1078_Equal Earth',
'EPSG_9602_Geographic/geocentric conversions',
'EPSG_9659_Geographic3D to 2D conversion',
diff --git a/data/sql/projected_crs.sql b/data/sql/projected_crs.sql
index fec63d4c..d25ed9b5 100644
--- a/data/sql/projected_crs.sql
+++ b/data/sql/projected_crs.sql
@@ -7313,6 +7313,12 @@ INSERT INTO "projected_crs" VALUES('EPSG','9698','REDGEOMIN / UTM zone 18S',NULL
INSERT INTO "usage" VALUES('EPSG','14943','projected_crs','EPSG','9698','EPSG','3829','EPSG','1181');
INSERT INTO "projected_crs" VALUES('EPSG','9699','REDGEOMIN / UTM zone 19S',NULL,'EPSG','4400','EPSG','9696','EPSG','16119',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14945','projected_crs','EPSG','9699','EPSG','3811','EPSG','1181');
+INSERT INTO "projected_crs" VALUES('EPSG','9709','NAD83(CSRS) / UTM zone 23N',NULL,'EPSG','4400','EPSG','4617','EPSG','16023',NULL,0);
+INSERT INTO "usage" VALUES('EPSG','15204','projected_crs','EPSG','9709','EPSG','2153','EPSG','1142');
+INSERT INTO "projected_crs" VALUES('EPSG','9712','NAD83 / UTM zone 24N',NULL,'EPSG','4400','EPSG','4269','EPSG','16024',NULL,0);
+INSERT INTO "usage" VALUES('EPSG','15196','projected_crs','EPSG','9712','EPSG','4617','EPSG','1142');
+INSERT INTO "projected_crs" VALUES('EPSG','9713','NAD83(CSRS) / UTM zone 24N',NULL,'EPSG','4400','EPSG','4617','EPSG','16024',NULL,0);
+INSERT INTO "usage" VALUES('EPSG','15195','projected_crs','EPSG','9713','EPSG','4617','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','20004','Pulkovo 1995 / Gauss-Kruger zone 4',NULL,'EPSG','4530','EPSG','4200','EPSG','16204',NULL,0);
INSERT INTO "usage" VALUES('EPSG','6177','projected_crs','EPSG','20004','EPSG','1763','EPSG','1211');
INSERT INTO "projected_crs" VALUES('EPSG','20005','Pulkovo 1995 / Gauss-Kruger zone 5',NULL,'EPSG','4530','EPSG','4200','EPSG','16205',NULL,0);
diff --git a/data/sql/scope.sql b/data/sql/scope.sql
index 8706ced7..a7b6ebc4 100644
--- a/data/sql/scope.sql
+++ b/data/sql/scope.sql
@@ -77,7 +77,7 @@ INSERT INTO "scope" VALUES('EPSG','1097','Cartography System of Distrito Federal
INSERT INTO "scope" VALUES('EPSG','1098','Web mapping and visualisation.',0);
INSERT INTO "scope" VALUES('EPSG','1099','Change of height to a different vertical reference surface and unit.',0);
INSERT INTO "scope" VALUES('EPSG','1100','Change of prime meridian.',0);
-INSERT INTO "scope" VALUES('EPSG','1101','Change of height or depth unit to facilitate transformation through concatenated operations.',0);
+INSERT INTO "scope" VALUES('EPSG','1101','Change of height or depth unit.',0);
INSERT INTO "scope" VALUES('EPSG','1102','Cadastre, engineering survey, civilian topographic mapping.',0);
INSERT INTO "scope" VALUES('EPSG','1103','Coastal hydrography.',0);
INSERT INTO "scope" VALUES('EPSG','1104','Coastal hydrography, offshore oil and gas exploration and production.',0);
diff --git a/data/sql/vertical_crs.sql b/data/sql/vertical_crs.sql
index 9a9b90ad..8f3e91f9 100644
--- a/data/sql/vertical_crs.sql
+++ b/data/sql/vertical_crs.sql
@@ -20,8 +20,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5237','SLVD height',NULL,'EPSG','6499'
INSERT INTO "usage" VALUES('EPSG','3876','vertical_crs','EPSG','5237','EPSG','3310','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','5317','FVR09 height',NULL,'EPSG','6499','EPSG','1059',0);
INSERT INTO "usage" VALUES('EPSG','3924','vertical_crs','EPSG','5317','EPSG','3248','EPSG','1029');
-INSERT INTO "vertical_crs" VALUES('EPSG','5336','Black Sea depth',NULL,'EPSG','6498','EPSG','5134',0);
-INSERT INTO "usage" VALUES('EPSG','3936','vertical_crs','EPSG','5336','EPSG','3251','EPSG','1198');
INSERT INTO "vertical_crs" VALUES('EPSG','5597','FCSVR10 height',NULL,'EPSG','6499','EPSG','1079',0);
INSERT INTO "usage" VALUES('EPSG','4067','vertical_crs','EPSG','5597','EPSG','3890','EPSG','1139');
INSERT INTO "vertical_crs" VALUES('EPSG','5600','NGPF height',NULL,'EPSG','6499','EPSG','5195',0);
@@ -48,12 +46,8 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5610','HVRS71 height',NULL,'EPSG','649
INSERT INTO "usage" VALUES('EPSG','4079','vertical_crs','EPSG','5610','EPSG','3234','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','5611','Caspian height',NULL,'EPSG','6499','EPSG','5106',0);
INSERT INTO "usage" VALUES('EPSG','4080','vertical_crs','EPSG','5611','EPSG','1291','EPSG','1136');
-INSERT INTO "vertical_crs" VALUES('EPSG','5612','Baltic 1977 depth',NULL,'EPSG','6498','EPSG','5105',0);
-INSERT INTO "usage" VALUES('EPSG','4081','vertical_crs','EPSG','5612','EPSG','2423','EPSG','1136');
INSERT INTO "vertical_crs" VALUES('EPSG','5613','RH2000 height',NULL,'EPSG','6499','EPSG','5208',0);
INSERT INTO "usage" VALUES('EPSG','4082','vertical_crs','EPSG','5613','EPSG','3313','EPSG','1179');
-INSERT INTO "vertical_crs" VALUES('EPSG','5614','KOC WD depth (ft)',NULL,'EPSG','6495','EPSG','5187',0);
-INSERT INTO "usage" VALUES('EPSG','4083','vertical_crs','EPSG','5614','EPSG','3267','EPSG','1205');
INSERT INTO "vertical_crs" VALUES('EPSG','5615','RH00 height',NULL,'EPSG','6499','EPSG','5209',0);
INSERT INTO "usage" VALUES('EPSG','4084','vertical_crs','EPSG','5615','EPSG','3313','EPSG','1029');
INSERT INTO "vertical_crs" VALUES('EPSG','5616','IGN 1988 LS height',NULL,'EPSG','6499','EPSG','5210',0);
@@ -78,8 +72,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5704','Yellow Sea',NULL,'EPSG','6499',
INSERT INTO "usage" VALUES('EPSG','4147','vertical_crs','EPSG','5704','EPSG','1067','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','5705','Baltic 1977 height',NULL,'EPSG','6499','EPSG','5105',0);
INSERT INTO "usage" VALUES('EPSG','4148','vertical_crs','EPSG','5705','EPSG','2423','EPSG','1179');
-INSERT INTO "vertical_crs" VALUES('EPSG','5706','Caspian depth',NULL,'EPSG','6498','EPSG','5106',0);
-INSERT INTO "usage" VALUES('EPSG','4149','vertical_crs','EPSG','5706','EPSG','1291','EPSG','1198');
INSERT INTO "vertical_crs" VALUES('EPSG','5709','NAP height',NULL,'EPSG','6499','EPSG','5109',0);
INSERT INTO "usage" VALUES('EPSG','4152','vertical_crs','EPSG','5709','EPSG','1172','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','5710','Ostend height',NULL,'EPSG','6499','EPSG','5110',0);
@@ -92,8 +84,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5713','CGVD28 height',NULL,'EPSG','649
INSERT INTO "usage" VALUES('EPSG','4156','vertical_crs','EPSG','5713','EPSG','1289','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','5714','MSL height',NULL,'EPSG','6499','EPSG','5100',0);
INSERT INTO "usage" VALUES('EPSG','4157','vertical_crs','EPSG','5714','EPSG','1262','EPSG','1199');
-INSERT INTO "vertical_crs" VALUES('EPSG','5715','MSL depth',NULL,'EPSG','6498','EPSG','5100',0);
-INSERT INTO "usage" VALUES('EPSG','4158','vertical_crs','EPSG','5715','EPSG','1262','EPSG','1199');
INSERT INTO "vertical_crs" VALUES('EPSG','5716','Piraeus height',NULL,'EPSG','6499','EPSG','5115',0);
INSERT INTO "usage" VALUES('EPSG','4159','vertical_crs','EPSG','5716','EPSG','3254','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','5717','N60 height',NULL,'EPSG','6499','EPSG','5116',0);
@@ -130,8 +120,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5732','Belfast height',NULL,'EPSG','64
INSERT INTO "usage" VALUES('EPSG','4175','vertical_crs','EPSG','5732','EPSG','2530','EPSG','1209');
INSERT INTO "vertical_crs" VALUES('EPSG','5733','DNN height',NULL,'EPSG','6499','EPSG','5132',0);
INSERT INTO "usage" VALUES('EPSG','4176','vertical_crs','EPSG','5733','EPSG','3237','EPSG','1142');
-INSERT INTO "vertical_crs" VALUES('EPSG','5734','AIOC95 depth',NULL,'EPSG','6498','EPSG','5133',0);
-INSERT INTO "usage" VALUES('EPSG','4177','vertical_crs','EPSG','5734','EPSG','2592','EPSG','1136');
INSERT INTO "vertical_crs" VALUES('EPSG','5735','Black Sea height',NULL,'EPSG','6499','EPSG','5134',0);
INSERT INTO "usage" VALUES('EPSG','4178','vertical_crs','EPSG','5735','EPSG','3251','EPSG','1153');
INSERT INTO "vertical_crs" VALUES('EPSG','5736','Yellow Sea 1956 height',NULL,'EPSG','6499','EPSG','5104',0);
@@ -240,8 +228,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5787','EOMA 1980 height',NULL,'EPSG','
INSERT INTO "usage" VALUES('EPSG','4230','vertical_crs','EPSG','5787','EPSG','1119','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','5788','Kuwait PWD height',NULL,'EPSG','6499','EPSG','5186',0);
INSERT INTO "usage" VALUES('EPSG','4231','vertical_crs','EPSG','5788','EPSG','3267','EPSG','1248');
-INSERT INTO "vertical_crs" VALUES('EPSG','5789','KOC WD depth',NULL,'EPSG','6498','EPSG','5187',0);
-INSERT INTO "usage" VALUES('EPSG','4232','vertical_crs','EPSG','5789','EPSG','3267','EPSG','1205');
INSERT INTO "vertical_crs" VALUES('EPSG','5790','KOC CD height',NULL,'EPSG','6499','EPSG','5188',0);
INSERT INTO "usage" VALUES('EPSG','4233','vertical_crs','EPSG','5790','EPSG','3267','EPSG','1206');
INSERT INTO "vertical_crs" VALUES('EPSG','5791','NGC 1948 height',NULL,'EPSG','6499','EPSG','5189',0);
@@ -264,8 +250,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','5799','DVR90 height',NULL,'EPSG','6499
INSERT INTO "usage" VALUES('EPSG','4242','vertical_crs','EPSG','5799','EPSG','3237','EPSG','1142');
INSERT INTO "vertical_crs" VALUES('EPSG','5829','Instantaneous Water Level height',NULL,'EPSG','6499','EPSG','5113',0);
INSERT INTO "usage" VALUES('EPSG','4267','vertical_crs','EPSG','5829','EPSG','1262','EPSG','1200');
-INSERT INTO "vertical_crs" VALUES('EPSG','5831','Instantaneous Water Level depth',NULL,'EPSG','6498','EPSG','5113',0);
-INSERT INTO "usage" VALUES('EPSG','4269','vertical_crs','EPSG','5831','EPSG','1262','EPSG','1200');
INSERT INTO "vertical_crs" VALUES('EPSG','5843','Ras Ghumays height',NULL,'EPSG','6499','EPSG','1146',0);
INSERT INTO "usage" VALUES('EPSG','4278','vertical_crs','EPSG','5843','EPSG','4225','EPSG','1142');
INSERT INTO "vertical_crs" VALUES('EPSG','5861','LAT depth',NULL,'EPSG','6498','EPSG','1080',0);
@@ -324,14 +308,6 @@ INSERT INTO "vertical_crs" VALUES('EPSG','6186','Cais da Vila do Porto height',N
INSERT INTO "usage" VALUES('EPSG','4505','vertical_crs','EPSG','6186','EPSG','4126','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','6187','Ponta Delgada height',NULL,'EPSG','6499','EPSG','1110',0);
INSERT INTO "usage" VALUES('EPSG','4506','vertical_crs','EPSG','6187','EPSG','2871','EPSG','1178');
-INSERT INTO "vertical_crs" VALUES('EPSG','6357','NAVD88 depth',NULL,'EPSG','6498','EPSG','5103',0);
-INSERT INTO "usage" VALUES('EPSG','4591','vertical_crs','EPSG','6357','EPSG','4161','EPSG','1179');
-INSERT INTO "vertical_crs" VALUES('EPSG','6358','NAVD88 depth (ftUS)',NULL,'EPSG','1043','EPSG','5103',0);
-INSERT INTO "usage" VALUES('EPSG','4592','vertical_crs','EPSG','6358','EPSG','3664','EPSG','1179');
-INSERT INTO "vertical_crs" VALUES('EPSG','6359','NGVD29 depth (ftUS)',NULL,'EPSG','1043','EPSG','5102',0);
-INSERT INTO "usage" VALUES('EPSG','4593','vertical_crs','EPSG','6359','EPSG','1323','EPSG','1179');
-INSERT INTO "vertical_crs" VALUES('EPSG','6360','NAVD88 height (ftUS)',NULL,'EPSG','6497','EPSG','5103',0);
-INSERT INTO "usage" VALUES('EPSG','4594','vertical_crs','EPSG','6360','EPSG','3664','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','6638','Tutuila 1962 height',NULL,'EPSG','6499','EPSG','1121',0);
INSERT INTO "usage" VALUES('EPSG','4859','vertical_crs','EPSG','6638','EPSG','2288','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','6639','Guam 1963 height',NULL,'EPSG','6499','EPSG','1122',0);
@@ -384,34 +360,16 @@ INSERT INTO "vertical_crs" VALUES('EPSG','7889','St. Helena Tritan 2011 height',
INSERT INTO "usage" VALUES('EPSG','5531','vertical_crs','EPSG','7889','EPSG','3183','EPSG','1145');
INSERT INTO "vertical_crs" VALUES('EPSG','7890','SHVD2015 height',NULL,'EPSG','6499','EPSG','1177',0);
INSERT INTO "usage" VALUES('EPSG','5532','vertical_crs','EPSG','7890','EPSG','3183','EPSG','1027');
-INSERT INTO "vertical_crs" VALUES('EPSG','7962','Poolbeg height (m)',NULL,'EPSG','6499','EPSG','5152',0);
-INSERT INTO "usage" VALUES('EPSG','5568','vertical_crs','EPSG','7962','EPSG','1305','EPSG','1203');
-INSERT INTO "vertical_crs" VALUES('EPSG','7968','NGVD29 height (m)',NULL,'EPSG','6499','EPSG','5102',0);
-INSERT INTO "usage" VALUES('EPSG','5569','vertical_crs','EPSG','7968','EPSG','1323','EPSG','1203');
-INSERT INTO "vertical_crs" VALUES('EPSG','7976','HKPD depth',NULL,'EPSG','6498','EPSG','5135',0);
-INSERT INTO "usage" VALUES('EPSG','5570','vertical_crs','EPSG','7976','EPSG','3334','EPSG','1203');
INSERT INTO "vertical_crs" VALUES('EPSG','7979','KOC WD height',NULL,'EPSG','6499','EPSG','5187',0);
INSERT INTO "usage" VALUES('EPSG','5571','vertical_crs','EPSG','7979','EPSG','3267','EPSG','1205');
-INSERT INTO "vertical_crs" VALUES('EPSG','8050','MSL height (ft)',NULL,'EPSG','1030','EPSG','5100',0);
-INSERT INTO "usage" VALUES('EPSG','5600','vertical_crs','EPSG','8050','EPSG','1262','EPSG','1199');
-INSERT INTO "vertical_crs" VALUES('EPSG','8051','MSL depth (ft)',NULL,'EPSG','6495','EPSG','5100',0);
-INSERT INTO "usage" VALUES('EPSG','5601','vertical_crs','EPSG','8051','EPSG','1262','EPSG','1199');
-INSERT INTO "vertical_crs" VALUES('EPSG','8052','MSL height (ftUS)',NULL,'EPSG','6497','EPSG','5100',0);
-INSERT INTO "usage" VALUES('EPSG','5602','vertical_crs','EPSG','8052','EPSG','1245','EPSG','1199');
-INSERT INTO "vertical_crs" VALUES('EPSG','8053','MSL depth (ftUS)',NULL,'EPSG','1043','EPSG','5100',0);
-INSERT INTO "usage" VALUES('EPSG','5603','vertical_crs','EPSG','8053','EPSG','1245','EPSG','1199');
INSERT INTO "vertical_crs" VALUES('EPSG','8089','ISH2004 height',NULL,'EPSG','6499','EPSG','1190',0);
INSERT INTO "usage" VALUES('EPSG','5616','vertical_crs','EPSG','8089','EPSG','3262','EPSG','1178');
-INSERT INTO "vertical_crs" VALUES('EPSG','8228','NAVD88 height (ft)',NULL,'EPSG','1030','EPSG','5103',0);
-INSERT INTO "usage" VALUES('EPSG','5736','vertical_crs','EPSG','8228','EPSG','4464','EPSG','1144');
INSERT INTO "vertical_crs" VALUES('EPSG','8266','GVR2000 height',NULL,'EPSG','6499','EPSG','1199',0);
INSERT INTO "usage" VALUES('EPSG','5758','vertical_crs','EPSG','8266','EPSG','4461','EPSG','1153');
INSERT INTO "vertical_crs" VALUES('EPSG','8267','GVR2016 height',NULL,'EPSG','6499','EPSG','1200',0);
INSERT INTO "usage" VALUES('EPSG','5759','vertical_crs','EPSG','8267','EPSG','4454','EPSG','1153');
INSERT INTO "vertical_crs" VALUES('EPSG','8357','Baltic 1957 height',NULL,'EPSG','6499','EPSG','1202',0);
INSERT INTO "usage" VALUES('EPSG','5803','vertical_crs','EPSG','8357','EPSG','1306','EPSG','1178');
-INSERT INTO "vertical_crs" VALUES('EPSG','8358','Baltic 1957 depth',NULL,'EPSG','6498','EPSG','1202',0);
-INSERT INTO "usage" VALUES('EPSG','5804','vertical_crs','EPSG','8358','EPSG','1306','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','8378','EPSG example wellbore local vertical CRS',NULL,'EPSG','1049','EPSG','1205',0);
INSERT INTO "usage" VALUES('EPSG','5808','vertical_crs','EPSG','8378','EPSG','4393','EPSG','1226');
INSERT INTO "vertical_crs" VALUES('EPSG','8434','Macao height',NULL,'EPSG','6499','EPSG','1210',0);
@@ -500,3 +458,45 @@ INSERT INTO "vertical_crs" VALUES('EPSG','9675','Pago Pago 2020 height',NULL,'EP
INSERT INTO "usage" VALUES('EPSG','14793','vertical_crs','EPSG','9675','EPSG','2288','EPSG','1026');
INSERT INTO "vertical_crs" VALUES('EPSG','9681','NVD 1992 height',NULL,'EPSG','6499','EPSG','1303',0);
INSERT INTO "usage" VALUES('EPSG','14851','vertical_crs','EPSG','9681','EPSG','3217','EPSG','1181');
+INSERT INTO "vertical_crs" VALUES('EPSG','5336','Black Sea depth',NULL,'EPSG','6498','EPSG','5134',0);
+INSERT INTO "usage" VALUES('EPSG','3936','vertical_crs','EPSG','5336','EPSG','1102','EPSG','1198');
+INSERT INTO "vertical_crs" VALUES('EPSG','5612','Baltic 1977 depth',NULL,'EPSG','6498','EPSG','5105',0);
+INSERT INTO "usage" VALUES('EPSG','4081','vertical_crs','EPSG','5612','EPSG','2423','EPSG','1136');
+INSERT INTO "vertical_crs" VALUES('EPSG','5706','Caspian depth',NULL,'EPSG','6498','EPSG','5106',0);
+INSERT INTO "usage" VALUES('EPSG','4149','vertical_crs','EPSG','5706','EPSG','1291','EPSG','1198');
+INSERT INTO "vertical_crs" VALUES('EPSG','5715','MSL depth',NULL,'EPSG','6498','EPSG','5100',0);
+INSERT INTO "usage" VALUES('EPSG','4158','vertical_crs','EPSG','5715','EPSG','1262','EPSG','1199');
+INSERT INTO "vertical_crs" VALUES('EPSG','5734','AIOC95 depth',NULL,'EPSG','6498','EPSG','5133',0);
+INSERT INTO "usage" VALUES('EPSG','4177','vertical_crs','EPSG','5734','EPSG','2592','EPSG','1136');
+INSERT INTO "vertical_crs" VALUES('EPSG','5789','KOC WD depth',NULL,'EPSG','6498','EPSG','5187',0);
+INSERT INTO "usage" VALUES('EPSG','4232','vertical_crs','EPSG','5789','EPSG','3267','EPSG','1205');
+INSERT INTO "vertical_crs" VALUES('EPSG','5831','Instantaneous Water Level depth',NULL,'EPSG','6498','EPSG','5113',0);
+INSERT INTO "usage" VALUES('EPSG','4269','vertical_crs','EPSG','5831','EPSG','1262','EPSG','1200');
+INSERT INTO "vertical_crs" VALUES('EPSG','6357','NAVD88 depth',NULL,'EPSG','6498','EPSG','5103',0);
+INSERT INTO "usage" VALUES('EPSG','4591','vertical_crs','EPSG','6357','EPSG','4161','EPSG','1179');
+INSERT INTO "vertical_crs" VALUES('EPSG','6359','NGVD29 depth (ftUS)',NULL,'EPSG','1043','EPSG','5102',0);
+INSERT INTO "usage" VALUES('EPSG','4593','vertical_crs','EPSG','6359','EPSG','1323','EPSG','1179');
+INSERT INTO "vertical_crs" VALUES('EPSG','6360','NAVD88 height (ftUS)',NULL,'EPSG','6497','EPSG','5103',0);
+INSERT INTO "usage" VALUES('EPSG','4594','vertical_crs','EPSG','6360','EPSG','3664','EPSG','1179');
+INSERT INTO "vertical_crs" VALUES('EPSG','7962','Poolbeg height (m)',NULL,'EPSG','6499','EPSG','5152',0);
+INSERT INTO "usage" VALUES('EPSG','5568','vertical_crs','EPSG','7962','EPSG','1305','EPSG','1203');
+INSERT INTO "vertical_crs" VALUES('EPSG','7968','NGVD29 height (m)',NULL,'EPSG','6499','EPSG','5102',0);
+INSERT INTO "usage" VALUES('EPSG','5569','vertical_crs','EPSG','7968','EPSG','1323','EPSG','1203');
+INSERT INTO "vertical_crs" VALUES('EPSG','7976','HKPD depth',NULL,'EPSG','6498','EPSG','5135',0);
+INSERT INTO "usage" VALUES('EPSG','5570','vertical_crs','EPSG','7976','EPSG','3334','EPSG','1203');
+INSERT INTO "vertical_crs" VALUES('EPSG','8050','MSL height (ft)',NULL,'EPSG','1030','EPSG','5100',0);
+INSERT INTO "usage" VALUES('EPSG','5600','vertical_crs','EPSG','8050','EPSG','1262','EPSG','1199');
+INSERT INTO "vertical_crs" VALUES('EPSG','8052','MSL height (ftUS)',NULL,'EPSG','6497','EPSG','5100',0);
+INSERT INTO "usage" VALUES('EPSG','5602','vertical_crs','EPSG','8052','EPSG','1245','EPSG','1199');
+INSERT INTO "vertical_crs" VALUES('EPSG','8228','NAVD88 height (ft)',NULL,'EPSG','1030','EPSG','5103',0);
+INSERT INTO "usage" VALUES('EPSG','5736','vertical_crs','EPSG','8228','EPSG','4464','EPSG','1144');
+INSERT INTO "vertical_crs" VALUES('EPSG','8358','Baltic 1957 depth',NULL,'EPSG','6498','EPSG','1202',0);
+INSERT INTO "usage" VALUES('EPSG','5804','vertical_crs','EPSG','8358','EPSG','1306','EPSG','1178');
+INSERT INTO "vertical_crs" VALUES('EPSG','5614','KOC WD depth (ft)',NULL,'EPSG','6495','EPSG','5187',0);
+INSERT INTO "usage" VALUES('EPSG','4083','vertical_crs','EPSG','5614','EPSG','3267','EPSG','1205');
+INSERT INTO "vertical_crs" VALUES('EPSG','6358','NAVD88 depth (ftUS)',NULL,'EPSG','1043','EPSG','5103',0);
+INSERT INTO "usage" VALUES('EPSG','4592','vertical_crs','EPSG','6358','EPSG','3664','EPSG','1179');
+INSERT INTO "vertical_crs" VALUES('EPSG','8051','MSL depth (ft)',NULL,'EPSG','6495','EPSG','5100',0);
+INSERT INTO "usage" VALUES('EPSG','5601','vertical_crs','EPSG','8051','EPSG','1262','EPSG','1199');
+INSERT INTO "vertical_crs" VALUES('EPSG','8053','MSL depth (ftUS)',NULL,'EPSG','1043','EPSG','5100',0);
+INSERT INTO "usage" VALUES('EPSG','5603','vertical_crs','EPSG','8053','EPSG','1245','EPSG','1199');
diff --git a/data/sql/vertical_datum.sql b/data/sql/vertical_datum.sql
index 3a3904bb..e427bf76 100644
--- a/data/sql/vertical_datum.sql
+++ b/data/sql/vertical_datum.sql
@@ -291,7 +291,7 @@ INSERT INTO "usage" VALUES('EPSG','13338','vertical_datum','EPSG','5132','EPSG',
INSERT INTO "vertical_datum" VALUES('EPSG','5133','AIOC 1995',NULL,'1995-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13339','vertical_datum','EPSG','5133','EPSG','2592','EPSG','1136');
INSERT INTO "vertical_datum" VALUES('EPSG','5134','Black Sea',NULL,NULL,NULL,NULL,0);
-INSERT INTO "usage" VALUES('EPSG','13340','vertical_datum','EPSG','5134','EPSG','3251','EPSG','1201');
+INSERT INTO "usage" VALUES('EPSG','13340','vertical_datum','EPSG','5134','EPSG','1102','EPSG','1201');
INSERT INTO "vertical_datum" VALUES('EPSG','5135','Hong Kong Principal Datum',NULL,'1980-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13341','vertical_datum','EPSG','5135','EPSG','3334','EPSG','1184');
INSERT INTO "vertical_datum" VALUES('EPSG','5136','Hong Kong Chart Datum',NULL,NULL,NULL,NULL,0);
diff --git a/include/proj/coordinateoperation.hpp b/include/proj/coordinateoperation.hpp
index 1b209cae..aeef04f3 100644
--- a/include/proj/coordinateoperation.hpp
+++ b/include/proj/coordinateoperation.hpp
@@ -1345,6 +1345,9 @@ class PROJ_GCC_DLL Conversion : public SingleOperation {
const common::Scale &factor);
PROJ_DLL static ConversionNNPtr
+ createChangeVerticalUnit(const util::PropertyMap &properties);
+
+ PROJ_DLL static ConversionNNPtr
createHeightDepthReversal(const util::PropertyMap &properties);
PROJ_DLL static ConversionNNPtr createAxisOrderReversal(bool is3D);
diff --git a/scripts/build_db.py b/scripts/build_db.py
index afecf3e8..7f17443c 100755
--- a/scripts/build_db.py
+++ b/scripts/build_db.py
@@ -47,6 +47,12 @@ def ingest_sqlite_dump(cursor, filename):
line = line.decode('utf-8') #python3
else:
line = str(line) # python2
+
+ # Historically this script was developped with code columns using TEXT
+ # so keep it that way to minimized changes in it, and in the diff of
+ # generated .sql files
+ line = line.replace('INTEGER_OR_TEXT', 'TEXT')
+
sql += line
if sqlite3.complete_statement(sql):
sql = sql.strip()
@@ -277,6 +283,23 @@ def fill_vertical_crs(proj_db_cursor):
# "INSERT INTO crs SELECT ?, coord_ref_sys_code, coord_ref_sys_kind FROM epsg.epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('vertical') AND datum_code IS NOT NULL", (EPSG_AUTHORITY,))
proj_db_cursor.execute("INSERT INTO vertical_crs SELECT ?, coord_ref_sys_code, coord_ref_sys_name, NULL, ?, coord_sys_code, ?, datum_code, deprecated FROM epsg.epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('vertical') AND datum_code IS NOT NULL", (EPSG_AUTHORITY, EPSG_AUTHORITY, EPSG_AUTHORITY))
+ proj_db_cursor.execute("SELECT * FROM epsg.epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('vertical') AND datum_code IS NULL AND projection_conv_code NOT IN (7812, 7813)")
+ res = proj_db_cursor.fetchall()
+ for row in res:
+ assert False, row
+
+ proj_db_cursor.execute("SELECT * FROM epsg.epsg_coordinatereferencesystem crs1 WHERE crs1.coord_ref_sys_kind IN ('vertical') AND crs1.datum_code IS NULL AND NOT EXISTS (SELECT 1 FROM epsg.epsg_coordinatereferencesystem crs2 WHERE crs2.coord_ref_sys_code = crs1.base_crs_code AND crs2.coord_ref_sys_kind IN ('vertical'))")
+ res = proj_db_cursor.fetchall()
+ for row in res:
+ assert False, row
+
+ # Insert vertical_crs that are based on another one, such as EPSG:8228 that is based on EPSG:5703
+ proj_db_cursor.execute("INSERT INTO vertical_crs SELECT ?, crs1.coord_ref_sys_code, crs1.coord_ref_sys_name, NULL, ?, crs1.coord_sys_code, ?, crs2.datum_code, crs1.deprecated FROM epsg.epsg_coordinatereferencesystem crs1 JOIN epsg.epsg_coordinatereferencesystem crs2 ON crs1.base_crs_code = crs2.coord_ref_sys_code WHERE crs1.coord_ref_sys_kind IN ('vertical') AND crs1.datum_code IS NULL AND crs2.datum_code iS NOT NULL", (EPSG_AUTHORITY, EPSG_AUTHORITY, EPSG_AUTHORITY))
+
+ # Extra punishment for EPSG:8051 that is based on EPSG:5715 which is based on EPSG:5714
+ proj_db_cursor.execute("INSERT INTO vertical_crs SELECT ?, crs1.coord_ref_sys_code, crs1.coord_ref_sys_name, NULL, ?, crs1.coord_sys_code, ?, crs3.datum_code, crs1.deprecated FROM epsg.epsg_coordinatereferencesystem crs1 JOIN epsg.epsg_coordinatereferencesystem crs2 ON crs1.base_crs_code = crs2.coord_ref_sys_code JOIN epsg.epsg_coordinatereferencesystem crs3 ON crs2.base_crs_code = crs3.coord_ref_sys_code WHERE crs1.coord_ref_sys_kind IN ('vertical') AND crs1.datum_code IS NULL AND crs2.datum_code IS NULL", (EPSG_AUTHORITY, EPSG_AUTHORITY, EPSG_AUTHORITY))
+
+
def fill_conversion(proj_db_cursor):
# TODO? current we deal with point motion operation as transformation in grid_transformation table
diff --git a/scripts/reference_exported_symbols.txt b/scripts/reference_exported_symbols.txt
index d5aef65d..6364ed67 100644
--- a/scripts/reference_exported_symbols.txt
+++ b/scripts/reference_exported_symbols.txt
@@ -520,6 +520,7 @@ osgeo::proj::operation::Conversion::createAxisOrderReversal(bool)
osgeo::proj::operation::Conversion::createAzimuthalEquidistant(osgeo::proj::util::PropertyMap const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Length const&, osgeo::proj::common::Length const&)
osgeo::proj::operation::Conversion::createBonne(osgeo::proj::util::PropertyMap const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Length const&, osgeo::proj::common::Length const&)
osgeo::proj::operation::Conversion::createCassiniSoldner(osgeo::proj::util::PropertyMap const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Length const&, osgeo::proj::common::Length const&)
+osgeo::proj::operation::Conversion::createChangeVerticalUnit(osgeo::proj::util::PropertyMap const&)
osgeo::proj::operation::Conversion::createChangeVerticalUnit(osgeo::proj::util::PropertyMap const&, osgeo::proj::common::Scale const&)
osgeo::proj::operation::Conversion::createEckertIII(osgeo::proj::util::PropertyMap const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Length const&, osgeo::proj::common::Length const&)
osgeo::proj::operation::Conversion::createEckertII(osgeo::proj::util::PropertyMap const&, osgeo::proj::common::Angle const&, osgeo::proj::common::Length const&, osgeo::proj::common::Length const&)
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp
index 5a81506b..7b83484d 100644
--- a/src/iso19111/factory.cpp
+++ b/src/iso19111/factory.cpp
@@ -5613,6 +5613,8 @@ operation::CoordinateOperationNNPtr AuthorityFactory::createCoordinateOperation(
int method_code_int = std::atoi(method_code.c_str());
if (operation::isAxisOrderReversal(method_code_int) ||
method_code_int == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT ||
+ method_code_int ==
+ EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR ||
method_code_int == EPSG_CODE_METHOD_HEIGHT_DEPTH_REVERSAL) {
auto op = operation::Conversion::create(props, propsMethod,
parameters, values);
diff --git a/src/iso19111/operation/concatenatedoperation.cpp b/src/iso19111/operation/concatenatedoperation.cpp
index a1c0dca8..ad2ab65b 100644
--- a/src/iso19111/operation/concatenatedoperation.cpp
+++ b/src/iso19111/operation/concatenatedoperation.cpp
@@ -48,6 +48,7 @@
#include "proj.h"
#include "proj_internal.h" // M_PI
// clang-format on
+#include "proj_constants.h"
#include "proj_json_streaming_writer.hpp"
@@ -341,6 +342,37 @@ void ConcatenatedOperation::fixStepsDirection(
if (l_sourceCRS && l_targetCRS) {
op->setCRSs(NN_NO_CHECK(l_sourceCRS), NN_NO_CHECK(l_targetCRS),
nullptr);
+ } else if (l_sourceCRS && l_targetCRS == nullptr &&
+ conv->method()->getEPSGCode() ==
+ EPSG_CODE_METHOD_HEIGHT_DEPTH_REVERSAL) {
+ // Needed for EPSG:7987 e.g.
+ auto vertCRS =
+ dynamic_cast<const crs::VerticalCRS *>(l_sourceCRS.get());
+ if (vertCRS && ends_with(l_sourceCRS->nameStr(), " height") &&
+ &vertCRS->coordinateSystem()->axisList()[0]->direction() ==
+ &cs::AxisDirection::UP) {
+ op->setCRSs(
+ NN_NO_CHECK(l_sourceCRS),
+ crs::VerticalCRS::create(
+ util::PropertyMap().set(
+ common::IdentifiedObject::NAME_KEY,
+ l_sourceCRS->nameStr().substr(
+ 0, l_sourceCRS->nameStr().size() -
+ strlen(" height")) +
+ " depth"),
+ vertCRS->datum(), vertCRS->datumEnsemble(),
+ cs::VerticalCS::create(
+ util::PropertyMap(),
+ cs::CoordinateSystemAxis::create(
+ util::PropertyMap().set(
+ common::IdentifiedObject::NAME_KEY,
+ "Gravity-related depth"),
+ "D", cs::AxisDirection::DOWN,
+ vertCRS->coordinateSystem()
+ ->axisList()[0]
+ ->unit()))),
+ nullptr);
+ }
}
} else if (!conv && l_sourceCRS && l_targetCRS) {
diff --git a/src/iso19111/operation/conversion.cpp b/src/iso19111/operation/conversion.cpp
index e9d688b7..e2e77562 100644
--- a/src/iso19111/operation/conversion.cpp
+++ b/src/iso19111/operation/conversion.cpp
@@ -2252,6 +2252,26 @@ Conversion::createChangeVerticalUnit(const util::PropertyMap &properties,
// ---------------------------------------------------------------------------
+/** \brief Instantiate a conversion based on the Change of Vertical Unit
+ * method (without explicit conversion factor)
+ *
+ * This method is defined as [EPSG:1104]
+ * (https://www.epsg-registry.org/export.htm?gml=urn:ogc:def:method:EPSG::1104)
+ *
+ * @param properties See \ref general_properties of the conversion. If the name
+ * is not provided, it is automatically set.
+ * @return a new Conversion.
+ */
+ConversionNNPtr
+Conversion::createChangeVerticalUnit(const util::PropertyMap &properties) {
+ return create(properties,
+ createMethodMapNameEPSGCode(
+ EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR),
+ VectorOfParameters{}, VectorOfValues{});
+}
+
+// ---------------------------------------------------------------------------
+
/** \brief Instantiate a conversion based on the Height Depth Reversal
* method.
*
@@ -2409,6 +2429,14 @@ CoordinateOperationNNPtr Conversion::inverse() const {
return conv;
}
+ if (methodEPSGCode ==
+ EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR) {
+ auto conv = createChangeVerticalUnit(
+ createPropertiesForInverse(this, false, false));
+ conv->setCRSs(this, true);
+ return conv;
+ }
+
const bool l_isAxisOrderReversal2D = isAxisOrderReversal2D(methodEPSGCode);
const bool l_isAxisOrderReversal3D = isAxisOrderReversal3D(methodEPSGCode);
if (l_isAxisOrderReversal2D || l_isAxisOrderReversal3D) {
@@ -3345,7 +3373,8 @@ void Conversion::_exportToPROJString(
const auto &methodName = l_method->nameStr();
const int methodEPSGCode = l_method->getEPSGCode();
const bool isZUnitConversion =
- methodEPSGCode == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT;
+ methodEPSGCode == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT ||
+ methodEPSGCode == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR;
const bool isAffineParametric =
methodEPSGCode == EPSG_CODE_METHOD_AFFINE_PARAMETRIC_TRANSFORMATION;
const bool isGeographicGeocentric =
@@ -3368,6 +3397,8 @@ void Conversion::_exportToPROJString(
}
auto l_sourceCRS = sourceCRS();
+ auto l_targetCRS = targetCRS();
+
crs::GeographicCRSPtr srcGeogCRS;
if (!formatter->getCRSExport() && l_sourceCRS && applySourceCRSModifiers) {
@@ -3633,8 +3664,35 @@ void Conversion::_exportToPROJString(
} else if (formatter->convention() ==
io::PROJStringFormatter::Convention::PROJ_5 &&
isZUnitConversion) {
- double convFactor = parameterValueNumericAsSI(
- EPSG_CODE_PARAMETER_UNIT_CONVERSION_SCALAR);
+ double convFactor;
+ if (methodEPSGCode == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT) {
+ convFactor = parameterValueNumericAsSI(
+ EPSG_CODE_PARAMETER_UNIT_CONVERSION_SCALAR);
+ } else {
+ assert(methodEPSGCode ==
+ EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR);
+ const auto vertSrcCRS =
+ dynamic_cast<const crs::VerticalCRS *>(l_sourceCRS.get());
+ const auto vertTgtCRS =
+ dynamic_cast<const crs::VerticalCRS *>(l_targetCRS.get());
+ if (vertSrcCRS && vertTgtCRS) {
+ const double convSrc = vertSrcCRS->coordinateSystem()
+ ->axisList()[0]
+ ->unit()
+ .conversionToSI();
+ const double convDst = vertTgtCRS->coordinateSystem()
+ ->axisList()[0]
+ ->unit()
+ .conversionToSI();
+ convFactor = convSrc / convDst;
+ } else {
+ throw io::FormattingException(
+ "Export of "
+ "EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR "
+ "conversion to a PROJ string "
+ "requires an input and output vertical CRS");
+ }
+ }
auto uom = common::UnitOfMeasure(std::string(), convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
@@ -3686,8 +3744,6 @@ void Conversion::_exportToPROJString(
bConversionDone = true;
}
- auto l_targetCRS = targetCRS();
-
bool bAxisSpecFound = false;
if (!bConversionDone) {
const MethodMapping *mapping = getMapping(l_method.get());
diff --git a/src/iso19111/operation/coordinateoperationfactory.cpp b/src/iso19111/operation/coordinateoperationfactory.cpp
index eb560cc9..13d245bb 100644
--- a/src/iso19111/operation/coordinateoperationfactory.cpp
+++ b/src/iso19111/operation/coordinateoperationfactory.cpp
@@ -2097,6 +2097,17 @@ static std::string buildTransfName(const std::string &srcName,
// ---------------------------------------------------------------------------
+static std::string buildConvName(const std::string &srcName,
+ const std::string &targetName) {
+ std::string name("Conversion from ");
+ name += srcName;
+ name += " to ";
+ name += targetName;
+ return name;
+}
+
+// ---------------------------------------------------------------------------
+
static SingleOperationNNPtr createPROJBased(
const util::PropertyMap &properties,
const io::IPROJStringExportableNNPtr &projExportable,
@@ -4273,8 +4284,8 @@ void CoordinateOperationFactory::Private::createOperationsVertToVert(
((srcIsUp && dstIsDown) || (srcIsDown && dstIsUp));
const double factor = convSrc / convDst;
- auto name = buildTransfName(sourceCRS->nameStr(), targetCRS->nameStr());
if (!equivalentVDatum) {
+ auto name = buildTransfName(sourceCRS->nameStr(), targetCRS->nameStr());
name += BALLPARK_VERTICAL_TRANSFORMATION;
auto conv = Transformation::createChangeVerticalUnit(
util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, name),
@@ -4285,6 +4296,7 @@ void CoordinateOperationFactory::Private::createOperationsVertToVert(
conv->setHasBallparkTransformation(true);
res.push_back(conv);
} else if (convSrc != convDst || !heightDepthReversal) {
+ auto name = buildConvName(sourceCRS->nameStr(), targetCRS->nameStr());
auto conv = Conversion::createChangeVerticalUnit(
util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, name),
// In case of a height depth reversal, we should probably have
@@ -4293,6 +4305,7 @@ void CoordinateOperationFactory::Private::createOperationsVertToVert(
conv->setCRSs(sourceCRS, targetCRS, nullptr);
res.push_back(conv);
} else {
+ auto name = buildConvName(sourceCRS->nameStr(), targetCRS->nameStr());
auto conv = Conversion::createHeightDepthReversal(
util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, name));
conv->setCRSs(sourceCRS, targetCRS, nullptr);
diff --git a/src/iso19111/operation/parammappings.cpp b/src/iso19111/operation/parammappings.cpp
index 15ecb24f..5999d535 100644
--- a/src/iso19111/operation/parammappings.cpp
+++ b/src/iso19111/operation/parammappings.cpp
@@ -924,6 +924,7 @@ const struct MethodNameCode methodNameCodes[] = {
METHOD_NAME_CODE(COLOMBIA_URBAN),
// Other conversions
METHOD_NAME_CODE(CHANGE_VERTICAL_UNIT),
+ METHOD_NAME_CODE(CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR),
METHOD_NAME_CODE(HEIGHT_DEPTH_REVERSAL),
METHOD_NAME_CODE(AXIS_ORDER_REVERSAL_2D),
METHOD_NAME_CODE(AXIS_ORDER_REVERSAL_3D),
@@ -1308,9 +1309,12 @@ static const MethodMapping otherMethodMappings[] = {
{EPSG_NAME_METHOD_CHANGE_VERTICAL_UNIT,
EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT, nullptr, nullptr, nullptr,
paramsChangeVerticalUnit},
+ {EPSG_NAME_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR,
+ EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR, nullptr, nullptr,
+ nullptr, nullptr},
{EPSG_NAME_METHOD_HEIGHT_DEPTH_REVERSAL,
EPSG_CODE_METHOD_HEIGHT_DEPTH_REVERSAL, nullptr, nullptr, nullptr,
- paramsChangeVerticalUnit},
+ nullptr},
{EPSG_NAME_METHOD_AXIS_ORDER_REVERSAL_2D,
EPSG_CODE_METHOD_AXIS_ORDER_REVERSAL_2D, nullptr, nullptr, nullptr,
nullptr},
diff --git a/src/iso19111/operation/singleoperation.cpp b/src/iso19111/operation/singleoperation.cpp
index 6812819c..2f60828e 100644
--- a/src/iso19111/operation/singleoperation.cpp
+++ b/src/iso19111/operation/singleoperation.cpp
@@ -1525,31 +1525,39 @@ std::list<std::string> SingleOperation::validateParameters() const {
const auto &l_method = method();
const auto &methodName = l_method->nameStr();
- const MethodMapping *methodMapping = nullptr;
const auto methodEPSGCode = l_method->getEPSGCode();
+
+ const auto findMapping = [methodEPSGCode, &methodName](
+ const MethodMapping *mappings,
+ size_t mappingCount) -> const MethodMapping * {
+ if (methodEPSGCode != 0) {
+ for (size_t i = 0; i < mappingCount; ++i) {
+ const auto &mapping = mappings[i];
+ if (methodEPSGCode == mapping.epsg_code) {
+ return &mapping;
+ }
+ }
+ }
+ for (size_t i = 0; i < mappingCount; ++i) {
+ const auto &mapping = mappings[i];
+ if (metadata::Identifier::isEquivalentName(mapping.wkt2_name,
+ methodName.c_str())) {
+ return &mapping;
+ }
+ }
+ return nullptr;
+ };
+
size_t nProjectionMethodMappings = 0;
const auto projectionMethodMappings =
getProjectionMethodMappings(nProjectionMethodMappings);
- for (size_t i = 0; i < nProjectionMethodMappings; ++i) {
- const auto &mapping = projectionMethodMappings[i];
- if (metadata::Identifier::isEquivalentName(mapping.wkt2_name,
- methodName.c_str()) ||
- (methodEPSGCode != 0 && methodEPSGCode == mapping.epsg_code)) {
- methodMapping = &mapping;
- }
- }
+ const MethodMapping *methodMapping =
+ findMapping(projectionMethodMappings, nProjectionMethodMappings);
if (methodMapping == nullptr) {
size_t nOtherMethodMappings = 0;
const auto otherMethodMappings =
getOtherMethodMappings(nOtherMethodMappings);
- for (size_t i = 0; i < nOtherMethodMappings; ++i) {
- const auto &mapping = otherMethodMappings[i];
- if (metadata::Identifier::isEquivalentName(mapping.wkt2_name,
- methodName.c_str()) ||
- (methodEPSGCode != 0 && methodEPSGCode == mapping.epsg_code)) {
- methodMapping = &mapping;
- }
- }
+ methodMapping = findMapping(otherMethodMappings, nOtherMethodMappings);
}
if (!methodMapping) {
res.emplace_back("Unknown method " + methodName);
@@ -1661,7 +1669,7 @@ std::list<std::string> SingleOperation::validateParameters() const {
}
return res;
-}
+} // namespace operation
// ---------------------------------------------------------------------------
diff --git a/src/proj_constants.h b/src/proj_constants.h
index baea05da..66d04294 100644
--- a/src/proj_constants.h
+++ b/src/proj_constants.h
@@ -582,6 +582,9 @@
#define EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT 1069
#define EPSG_NAME_METHOD_CHANGE_VERTICAL_UNIT "Change of Vertical Unit"
+#define EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR 1104
+#define EPSG_NAME_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR "Change of Vertical Unit"
+
#define EPSG_NAME_PARAMETER_UNIT_CONVERSION_SCALAR "Unit conversion scalar"
#define EPSG_CODE_PARAMETER_UNIT_CONVERSION_SCALAR 1051
diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist
index 596f915c..7569f948 100644
--- a/test/cli/testprojinfo_out.dist
+++ b/test/cli/testprojinfo_out.dist
@@ -342,8 +342,8 @@ COORDINATEOPERATION["Ballpark geographic offset from NAD27 to NAD83",
Testing projinfo -s NAD27 -t NAD83 --grid-check none --spatial-test intersects --summary --hide-ballpark
Candidate operations found: 9
-DERIVED_FROM(EPSG):1313, NAD27 to NAD83 (4), 1.5 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast.
-DERIVED_FROM(EPSG):1312, NAD27 to NAD83 (3), 2.0 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast.
+DERIVED_FROM(EPSG):1313, NAD27 to NAD83 (4), 1.5 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N.
+DERIVED_FROM(EPSG):1312, NAD27 to NAD83 (3), 2.0 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N.
DERIVED_FROM(EPSG):1241, NAD27 to NAD83 (1), 0.15 m, United States (USA) - CONUS including EEZ -onshore and offshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Gulf of Mexico (GoM) OCS.
DERIVED_FROM(EPSG):1243, NAD27 to NAD83 (2), 0.5 m, United States (USA) - Alaska including EEZ.
DERIVED_FROM(EPSG):1573, NAD27 to NAD83 (6), 1.5 m, Canada - Quebec.
@@ -357,7 +357,7 @@ Candidate operations found: 10
-------------------------------------
Operation No. 1:
-DERIVED_FROM(EPSG):1313, NAD27 to NAD83 (4), 1.5 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast.
+DERIVED_FROM(EPSG):1313, NAD27 to NAD83 (4), 1.5 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N.
PROJ string:
+proj=pipeline
@@ -404,15 +404,15 @@ COORDINATEOPERATION["NAD27 to NAD83 (4)",
OPERATIONACCURACY[1.5],
USAGE[
SCOPE["Transformation of coordinates at 1m to 2m level of accuracy."],
- AREA["Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast."],
- BBOX[40.04,-141.01,83.17,-47.74]],
+ AREA["Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N."],
+ BBOX[40,-141.00299072266,83.16267232269,-44]],
ID["DERIVED_FROM(EPSG)",1313],
REMARK["Uses NTv2 data files. Replaces NTv1 (transformation code 1312) except in Quebec. Input expects longitudes to be positive west; EPSG GeogCRS NAD27 (code 4267) and (code 4269) have longitudes positive east. May be used as tfm to WGS 84 - see code 1693."]]
-------------------------------------
Operation No. 2:
-DERIVED_FROM(EPSG):1312, NAD27 to NAD83 (3), 2.0 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast.
+DERIVED_FROM(EPSG):1312, NAD27 to NAD83 (3), 2.0 m, Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N.
PROJ string:
+proj=pipeline
@@ -459,8 +459,8 @@ COORDINATEOPERATION["NAD27 to NAD83 (3)",
OPERATIONACCURACY[2.0],
USAGE[
SCOPE["Historic record only - now superseded - see remarks."],
- AREA["Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast."],
- BBOX[40.04,-141.01,83.17,-47.74]],
+ AREA["Canada - onshore - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon; offshore east coast west of 44°W and north of 40°N."],
+ BBOX[40,-141.00299072266,83.16267232269,-44]],
ID["DERIVED_FROM(EPSG)",1312],
REMARK["Uses NTv1 method. Replaced in Quebec by code 1462 and elsewhere in 1997 by NTv2 (transformation code 1313). Input expects longitudes to be positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east."]]
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index fa69c9aa..8fa1b228 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -5021,7 +5021,7 @@ TEST_F(CApi, proj_create_vertical_crs_ex) {
ASSERT_TRUE(name != nullptr);
EXPECT_EQ(name,
std::string("Inverse of UTM zone 11N + "
- "Transformation from myVertCRS (ftUS) to myVertCRS + "
+ "Conversion from myVertCRS (ftUS) to myVertCRS + "
"Transformation from myVertCRS to NAD83(2011)"));
auto proj_5 = proj_as_proj_string(m_ctxt, P, PJ_PROJ_5, nullptr);
@@ -5090,7 +5090,7 @@ TEST_F(CApi, proj_create_vertical_crs_ex_with_geog_crs) {
name,
std::string("Inverse of UTM zone 11N + "
"Ballpark geographic offset from NAD83(2011) to WGS 84 + "
- "Transformation from myVertCRS to myVertCRS (metre) + "
+ "Conversion from myVertCRS to myVertCRS (metre) + "
"Transformation from myVertCRS (metre) to WGS 84 + "
"Ballpark geographic offset from WGS 84 to NAD83(2011)"));
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp
index 02033a8a..c10c4697 100644
--- a/test/unit/test_factory.cpp
+++ b/test/unit/test_factory.cpp
@@ -1261,7 +1261,7 @@ TEST(
auto operations = concatenated->operations();
ASSERT_EQ(operations.size(), 2U);
EXPECT_TRUE(operations[0]->isEquivalentTo(
- factory->createCoordinateOperation("7972", false).get()));
+ factory->createCoordinateOperation("7813", false).get()));
EXPECT_TRUE(operations[1]->isEquivalentTo(
factory->createCoordinateOperation("7969", false).get()));
}
@@ -1270,6 +1270,42 @@ TEST(
TEST(
factory,
+ AuthorityFactory_createCoordinateOperation_concatenated_operation_step_2_and_3_are_conversion) {
+ auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG");
+ auto op = factory->createCoordinateOperation("7987", false);
+ auto concatenated = nn_dynamic_pointer_cast<ConcatenatedOperation>(op);
+ ASSERT_TRUE(concatenated != nullptr);
+ auto operations = concatenated->operations();
+ ASSERT_EQ(operations.size(), 3U);
+ EXPECT_TRUE(operations[0]->isEquivalentTo(
+ factory->createCoordinateOperation("7980", false).get()));
+ EXPECT_TRUE(operations[1]->isEquivalentTo(
+ factory->createCoordinateOperation("7812", false).get()));
+ EXPECT_TRUE(operations[2]->isEquivalentTo(
+ factory->createCoordinateOperation("7813", false).get()));
+
+ EXPECT_EQ(operations[1]->targetCRS()->nameStr(), "KOC WD depth");
+ EXPECT_EQ(operations[2]->sourceCRS()->nameStr(),
+ operations[1]->targetCRS()->nameStr());
+ EXPECT_EQ(
+ concatenated->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=pipeline "
+ "+step +proj=geogoffset +dh=-4.74 "
+ "+step +proj=axisswap +order=1,2,-3 "
+ "+step +proj=unitconvert +z_in=m +z_out=ft");
+
+ EXPECT_EQ(concatenated->inverse()->exportToPROJString(
+ PROJStringFormatter::create().get()),
+ "+proj=pipeline "
+ "+step +proj=unitconvert +z_in=ft +z_out=m "
+ "+step +proj=axisswap +order=1,2,-3 "
+ "+step +proj=geogoffset +dh=4.74");
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(
+ factory,
AuthorityFactory_createCoordinateOperation_concatenated_operation_epsg_9103) {
auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG");
auto op = factory->createCoordinateOperation("9103", false);
diff --git a/test/unit/test_operation.cpp b/test/unit/test_operation.cpp
index 2830ea94..f76647e2 100644
--- a/test/unit/test_operation.cpp
+++ b/test/unit/test_operation.cpp
@@ -5302,6 +5302,13 @@ TEST(operation, createChangeVerticalUnit) {
// ---------------------------------------------------------------------------
+TEST(operation, createChangeVerticalUnitNoconvFactor) {
+ auto conv = Conversion::createChangeVerticalUnit(PropertyMap());
+ EXPECT_TRUE(conv->validateParameters().empty());
+}
+
+// ---------------------------------------------------------------------------
+
TEST(operation, createGeographicGeocentric) {
auto conv = Conversion::createGeographicGeocentric(PropertyMap());
EXPECT_TRUE(conv->validateParameters().empty());
diff --git a/test/unit/test_operationfactory.cpp b/test/unit/test_operationfactory.cpp
index 4c204c21..8ef59eb0 100644
--- a/test/unit/test_operationfactory.cpp
+++ b/test/unit/test_operationfactory.cpp
@@ -3357,7 +3357,7 @@ TEST(operation,
NN_NO_CHECK(src), GeographicCRS::EPSG_4979);
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->nameStr(), "axis order change (2D) + "
- "Transformation from unknown to unknown + "
+ "Conversion from unknown to unknown + "
"unknown to WGS84 ellipsoidal height");
EXPECT_EQ(
op->exportToPROJString(PROJStringFormatter::create().get()),
@@ -3719,7 +3719,7 @@ TEST(operation,
"Inverse of unnamed + "
"Transformation from NAD83 to WGS84 + "
"Ballpark geographic offset from WGS 84 to NAD83(2011) + "
- "Transformation from NAVD88 height (ftUS) to NAVD88 height + "
+ "Conversion from NAVD88 height (ftUS) to NAVD88 height + "
"Inverse of NAD83(2011) to NAVD88 height (1) + "
"Conversion from NAD83(2011) (geog3D) to NAD83(2011) "
"(geocentric)") {
@@ -4101,7 +4101,7 @@ TEST(
EXPECT_EQ(list[0]->nameStr(),
"Inverse of unnamed + "
"Transformation from NAD83 to WGS84 + "
- "NAVD88 height to NAVD88 height (ftUS) + "
+ "Conversion from NAVD88 height to NAVD88 height (ftUS) + "
"Inverse of Transformation from NAD83 to WGS84 + "
"unnamed");
auto grids = list[0]->gridsNeeded(dbContext, false);
@@ -5304,7 +5304,7 @@ TEST(operation, compoundCRS_to_geogCRS_with_vertical_unit_change) {
ASSERT_EQ(listCompoundToGeog.size(), listCompoundMetreToGeog.size());
EXPECT_EQ(listCompoundToGeog[0]->nameStr(),
- "Inverse of NAVD88 height to NAVD88 height (ftUS) + " +
+ "Conversion from NAVD88 height (ftUS) to NAVD88 height + " +
listCompoundMetreToGeog[0]->nameStr());
EXPECT_EQ(
listCompoundToGeog[0]->exportToPROJString(
@@ -5369,7 +5369,7 @@ TEST(
ASSERT_GE(listCompoundToGeog.size(), 1U);
EXPECT_EQ(listCompoundToGeog[0]->nameStr(),
- "Inverse of NAVD88 height to NAVD88 height (ftUS) + " +
+ "Conversion from NAVD88 height (ftUS) to NAVD88 height + " +
listCompoundMetreToGeog[0]->nameStr());
EXPECT_EQ(
listCompoundToGeog[0]->exportToPROJString(
@@ -5425,7 +5425,7 @@ TEST(operation, compoundCRS_to_geogCRS_with_height_depth_reversal) {
ASSERT_EQ(listCompoundToGeog.size(), listCompoundMetreToGeog.size());
EXPECT_EQ(listCompoundToGeog[0]->nameStr(),
- "Inverse of NAVD88 height to NAVD88 depth + " +
+ "Conversion from NAVD88 depth to NAVD88 height + " +
listCompoundMetreToGeog[0]->nameStr());
EXPECT_EQ(
listCompoundToGeog[0]->exportToPROJString(
@@ -5489,8 +5489,7 @@ TEST(
ASSERT_EQ(listCompoundToGeog.size(), listCompoundMetreToGeog.size());
EXPECT_EQ(listCompoundToGeog[0]->nameStr(),
- "Inverse of NAVD88 height (ftUS) to NAVD88 depth (ftUS) + "
- "Inverse of NAVD88 height to NAVD88 height (ftUS) + " +
+ "Conversion from NAVD88 depth (ftUS) to NAVD88 height + " +
listCompoundMetreToGeog[0]->nameStr());
EXPECT_EQ(
listCompoundToGeog[0]->exportToPROJString(
@@ -5504,8 +5503,7 @@ TEST(
.get()),
"+step +proj=unitconvert +xy_in=deg +xy_out=rad",
"+step +proj=unitconvert +xy_in=deg +xy_out=rad "
- "+step +proj=axisswap +order=1,2,-3 "
- "+step +proj=unitconvert +z_in=us-ft +z_out=m"));
+ "+step +proj=affine +s33=-0.304800609601219"));
// Check reverse path
auto listGeogToCompound =