From e174cc288824f5e5be4b317574438728b92be658 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sat, 21 Jan 2023 17:59:49 +0100 Subject: [PATCH] Implement EPSG:9621 'Similarity transformation' and import related transformations from EPSG This is used for a number of projectedCRS -> projectedCRS coordinate transformations. --- data/sql/other_transformation.sql | 98 +++++++++++++++++++ .../operations/transformations/affine.rst | 26 +++++ scripts/build_db.py | 8 +- src/iso19111/operation/conversion.cpp | 4 +- src/iso19111/operation/parammappings.cpp | 30 ++++++ src/iso19111/operation/singleoperation.cpp | 30 ++++++ src/proj_constants.h | 22 +++++ test/cli/testvarious | 14 +++ test/cli/tv_out.dist | 6 ++ 9 files changed, 236 insertions(+), 2 deletions(-) diff --git a/data/sql/other_transformation.sql b/data/sql/other_transformation.sql index 585a742e8c..f469630b6a 100644 --- a/data/sql/other_transformation.sql +++ b/data/sql/other_transformation.sql @@ -248,6 +248,12 @@ INSERT INTO "other_transformation" VALUES('EPSG','1436','Tokyo + JSLD to WGS 84 INSERT INTO "usage" VALUES('EPSG','8357','other_transformation','EPSG','1436','EPSG','2526','EPSG','1158'); INSERT INTO "other_transformation" VALUES('EPSG','1447','Anguilla 1957 to WGS 84 (1)','','EPSG','9619','Geographic2D offsets','EPSG','4600','EPSG','4326',10.0,'EPSG','8601','Latitude offset',-18.0,'EPSG','9104','EPSG','8602','Longitude offset',4.4,'EPSG','9104',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DOS-Aia',0); INSERT INTO "usage" VALUES('EPSG','8368','other_transformation','EPSG','1447','EPSG','3214','EPSG','1024'); +INSERT INTO "other_transformation" VALUES('EPSG','1452','D48 / GK to D96 / TM (1)','Information source gives rotation angle of source CRS axes as 359.9990153250° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-378.752,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.395,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000126775,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.000984675,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 1',1); +INSERT INTO "usage" VALUES('EPSG','8373','other_transformation','EPSG','1452','EPSG','2578','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','1453','D48 / GK to D96 / TM (2)','Information source gives rotation angle of source CRS axes as 359.9987988952° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-380.322,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',494.216,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.000015768,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0012011048,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 2',1); +INSERT INTO "usage" VALUES('EPSG','8374','other_transformation','EPSG','1453','EPSG','2579','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','1465','D48 / GK to D96 / TM (3)','Information source gives rotation angle of source CRS axes as 359.9990080921° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-382.19,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',492.412,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000210585,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0009919079,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 3',1); +INSERT INTO "usage" VALUES('EPSG','8386','other_transformation','EPSG','1465','EPSG','2582','EPSG','1032'); INSERT INTO "other_transformation" VALUES('EPSG','1466','NGO 1948 (Oslo) to NGO1948 (Greenwich)','','EPSG','9601','Longitude rotation','EPSG','4817','EPSG','4273',NULL,'EPSG','8602','Longitude offset',10.43225,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NGO-Nor',1); INSERT INTO "usage" VALUES('EPSG','8387','other_transformation','EPSG','1466','EPSG','1352','EPSG','1100'); INSERT INTO "other_transformation" VALUES('EPSG','1467','NTF (Paris) to NTF (Greenwich) (1)','','EPSG','9601','Longitude rotation','EPSG','4807','EPSG','4275',NULL,'EPSG','8602','Longitude offset',2.5969213,'EPSG','9105',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Fra',1); @@ -256,6 +262,12 @@ INSERT INTO "other_transformation" VALUES('EPSG','1468','NTF (Paris) to NTF (Gre INSERT INTO "usage" VALUES('EPSG','8389','other_transformation','EPSG','1468','EPSG','1096','EPSG','1100'); INSERT INTO "other_transformation" VALUES('EPSG','1519','Bern 1898 (Bern) to CH1903 (Greenwich)','','EPSG','9601','Longitude rotation','EPSG','4801','EPSG','4149',NULL,'EPSG','8602','Longitude offset',7.26225,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BfL-CH',1); INSERT INTO "usage" VALUES('EPSG','8440','other_transformation','EPSG','1519','EPSG','1286','EPSG','1100'); +INSERT INTO "other_transformation" VALUES('EPSG','1535','D48 / GK to D96 / TM (4)','Information source gives rotation angle of source CRS axes as 359.9991387616° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-377.487,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',492.209,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000103303,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0008612384,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 4',1); +INSERT INTO "usage" VALUES('EPSG','8456','other_transformation','EPSG','1535','EPSG','2583','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','1636','D48 / GK to D96 / TM (5)','Information source gives rotation angle of source CRS axes as 359.9988083326° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-383.677,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.408,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.000023822,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0011916674,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 5',1); +INSERT INTO "usage" VALUES('EPSG','8557','other_transformation','EPSG','1636','EPSG','3348','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','1637','D48 / GK to D96 / TM (6)','Information source gives rotation angle of source CRS axes as 359.9985894280° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-379.867,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.342,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000139529,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.001410572,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 6',1); +INSERT INTO "usage" VALUES('EPSG','8558','other_transformation','EPSG','1637','EPSG','2422','EPSG','1032'); INSERT INTO "other_transformation" VALUES('EPSG','1755','Bogota 1975 (Bogota) to Bogota 1975 (1)','','EPSG','9601','Longitude rotation','EPSG','4802','EPSG','4218',0.0,'EPSG','8602','Longitude offset',-74.04513,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGAC-Col',0); INSERT INTO "usage" VALUES('EPSG','8676','other_transformation','EPSG','1755','EPSG','3229','EPSG','1100'); INSERT INTO "other_transformation" VALUES('EPSG','1756','Lisbon (Lisbon) to Lisbon (1)','','EPSG','9601','Longitude rotation','EPSG','4803','EPSG','4207',0.0,'EPSG','8602','Longitude offset',-9.0754862,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGC-Prt',0); @@ -292,10 +304,94 @@ INSERT INTO "other_transformation" VALUES('EPSG','1891','Greek to GGRS87 (1)','M INSERT INTO "usage" VALUES('EPSG','8812','other_transformation','EPSG','1891','EPSG','3254','EPSG','1045'); INSERT INTO "other_transformation" VALUES('EPSG','1991','Lisbon 1890 (Lisbon) to Lisbon 1890 (1)','','EPSG','9601','Longitude rotation','EPSG','4904','EPSG','4666',0.0,'EPSG','8602','Longitude offset',-9.0754862,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'CGC-Prt',0); INSERT INTO "usage" VALUES('EPSG','8912','other_transformation','EPSG','1991','EPSG','1294','EPSG','1100'); +INSERT INTO "other_transformation" VALUES('EPSG','2181','D48 / GK to D96 / TM (7)','Information source gives rotation angle of source CRS axes as 359.9989361857° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-378.706,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.722,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000128479,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0010638143,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 7',1); +INSERT INTO "usage" VALUES('EPSG','8921','other_transformation','EPSG','2181','EPSG','3349','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2182','D48 / GK to D96 / TM (8)','Information source gives rotation angle of source CRS axes as 359.9990279960° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-376.275,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.231,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000076601,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.000972004,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 8',1); +INSERT INTO "usage" VALUES('EPSG','8922','other_transformation','EPSG','2182','EPSG','3350','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2183','D48 / GK to D96 / TM (9)','Information source gives rotation angle of source CRS axes as 359.9984713141° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-379.883,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',497.465,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000132379,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0015286859,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 9',1); +INSERT INTO "usage" VALUES('EPSG','8923','other_transformation','EPSG','2183','EPSG','2580','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2184','D48 / GK to D96 / TM (10)','Information source gives rotation angle of source CRS axes as 359.9984602820° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-380.127,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',497.52,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000138184,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.001539718,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 10',1); +INSERT INTO "usage" VALUES('EPSG','8924','other_transformation','EPSG','2184','EPSG','3345','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2185','D48 / GK to D96 / TM (11)','Information source gives rotation angle of source CRS axes as 359.9982890576° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-377.965,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',499.354,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000089352,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0017109424,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 11',1); +INSERT INTO "usage" VALUES('EPSG','8925','other_transformation','EPSG','2185','EPSG','2581','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2186','D48 / GK to D96 / TM (12)','Information source gives rotation angle of source CRS axes as 359.9995848956° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-384.455,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',487.979,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000246653,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0004151044,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 12',1); +INSERT INTO "usage" VALUES('EPSG','8926','other_transformation','EPSG','2186','EPSG','3351','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2187','D48 / GK to D96 / TM (13)','Information source gives rotation angle of source CRS axes as 359.9978086208° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-384.415,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',502.308,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000190161,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0021913792,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 13',1); +INSERT INTO "usage" VALUES('EPSG','8927','other_transformation','EPSG','2187','EPSG','3352','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2293','D48 / GK to D96 / TM (14)','Information source gives rotation angle of source CRS axes as 359.9986330172° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-380.84,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',495.612,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000158378,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0013669828,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 14',1); +INSERT INTO "usage" VALUES('EPSG','8928','other_transformation','EPSG','2293','EPSG','3353','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','2974','D48 / GK to D96 / TM (15)','Information source gives rotation angle of source CRS axes as 359.9986660539° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-377.812,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.076,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000100475,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0013339461,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 15',1); +INSERT INTO "usage" VALUES('EPSG','8929','other_transformation','EPSG','2974','EPSG','3354','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3792','D48 / GK to D96 / TM (16)','Information source gives rotation angle of source CRS axes as 359.9988835539° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-379.658,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.837,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000140367,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0011164461,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 16',1); +INSERT INTO "usage" VALUES('EPSG','8930','other_transformation','EPSG','3792','EPSG','3560','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3803','D48 / GK to D96 / TM (17)','Information source gives rotation angle of source CRS axes as 359.9985599438° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-382.138,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.819,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000177148,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0014400562,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 17',1); +INSERT INTO "usage" VALUES('EPSG','8931','other_transformation','EPSG','3803','EPSG','3347','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3804','D48 / GK to D96 / TM (18)','Information source gives rotation angle of source CRS axes as 359.9993228929° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-375.995,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',490.833,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000073161,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0006771071,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 18',1); +INSERT INTO "usage" VALUES('EPSG','8932','other_transformation','EPSG','3804','EPSG','2584','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3805','D48 / GK to D96 / TM (19)','Information source gives rotation angle of source CRS axes as 359.9975573682° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-381.28,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',505.983,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000118449,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0024426318,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 19',1); +INSERT INTO "usage" VALUES('EPSG','8933','other_transformation','EPSG','3805','EPSG','2585','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3806','D48 / GK to D96 / TM (20)','Information source gives rotation angle of source CRS axes as 359.9981683819° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-374.256,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',501.885,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000013456,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0018316181,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 20',1); +INSERT INTO "usage" VALUES('EPSG','8934','other_transformation','EPSG','3806','EPSG','2877','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3807','D48 / GK to D96 / TM (21)','Information source gives rotation angle of source CRS axes as 359.9987926666° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-371.329,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.151,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999980009,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0012073334,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 21',1); +INSERT INTO "usage" VALUES('EPSG','8935','other_transformation','EPSG','3807','EPSG','2586','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3808','D48 / GK to D96 / TM (22)','Information source gives rotation angle of source CRS axes as 359.9978515930° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-372.573,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',505.578,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999970275,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.002148407,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 22',1); +INSERT INTO "usage" VALUES('EPSG','8936','other_transformation','EPSG','3808','EPSG','2587','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3809','D48 / GK to D96 / TM (23)','Information source gives rotation angle of source CRS axes as 359.9980774015° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-371.849,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',503.318,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999967297,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0019225985,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 23',1); +INSERT INTO "usage" VALUES('EPSG','8937','other_transformation','EPSG','3809','EPSG','2878','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3810','D48 / GK to D96 / TM (24)','Information source gives rotation angle of source CRS axes as 359.9979842399° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3787','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-371.498,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',504.461,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999956084,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0020157601,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 24',1); +INSERT INTO "usage" VALUES('EPSG','8938','other_transformation','EPSG','3810','EPSG','3346','EPSG','1032'); INSERT INTO "other_transformation" VALUES('EPSG','3895','MGI (Ferro) to MGI (1)','See tfm code 3913 for longitude rotation applied in former Yugoslavia.','EPSG','9601','Longitude rotation','EPSG','4805','EPSG','4312',0.0,'EPSG','8602','Longitude offset',-17.4,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,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',0); INSERT INTO "usage" VALUES('EPSG','8964','other_transformation','EPSG','3895','EPSG','1037','EPSG','1100'); INSERT INTO "other_transformation" VALUES('EPSG','3913','MGI (Ferro) to MGI 1901 (1)','Uses Albrecht 1902 value. See tfm code 3895 for longitude rotation applied in Austria.','EPSG','9601','Longitude rotation','EPSG','4805','EPSG','3906',1.0,'EPSG','8602','Longitude offset',-17.394602,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Yug',0); INSERT INTO "usage" VALUES('EPSG','8971','other_transformation','EPSG','3913','EPSG','2370','EPSG','1100'); +INSERT INTO "other_transformation" VALUES('EPSG','3929','D48/GK to D96/TM (1)','Information source gives rotation angle of source CRS axes as 359.9990153250° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-378.752,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.395,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000126775,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.000984675,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 1',0); +INSERT INTO "usage" VALUES('EPSG','8986','other_transformation','EPSG','3929','EPSG','2578','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3930','D48/GK to D96/TM (2)','Information source gives rotation angle of source CRS axes as 359.9987988952° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-380.322,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',494.216,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.000015768,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0012011048,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 2',0); +INSERT INTO "usage" VALUES('EPSG','8987','other_transformation','EPSG','3930','EPSG','2579','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3931','D48/GK to D96/TM (3)','Information source gives rotation angle of source CRS axes as 359.9990080921° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-382.19,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',492.412,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000210585,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0009919079,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 3',0); +INSERT INTO "usage" VALUES('EPSG','8988','other_transformation','EPSG','3931','EPSG','2582','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3932','D48/GK to D96/TM (4)','Information source gives rotation angle of source CRS axes as 359.9991387616° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-377.487,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',492.209,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000103303,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0008612384,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 4',0); +INSERT INTO "usage" VALUES('EPSG','8989','other_transformation','EPSG','3932','EPSG','2583','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3933','D48/GK to D96/TM (5)','Information source gives rotation angle of source CRS axes as 359.9988083326° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-383.677,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.408,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.000023822,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0011916674,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 5',0); +INSERT INTO "usage" VALUES('EPSG','8990','other_transformation','EPSG','3933','EPSG','3348','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3934','D48/GK to D96/TM (6)','Information source gives rotation angle of source CRS axes as 359.9985894280° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-379.867,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.342,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000139529,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.001410572,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 6',0); +INSERT INTO "usage" VALUES('EPSG','8991','other_transformation','EPSG','3934','EPSG','2422','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3935','D48/GK to D96/TM (7)','Information source gives rotation angle of source CRS axes as 359.9989361857° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-378.706,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.722,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000128479,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0010638143,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 7',0); +INSERT INTO "usage" VALUES('EPSG','8992','other_transformation','EPSG','3935','EPSG','3349','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3936','D48/GK to D96/TM (8)','Information source gives rotation angle of source CRS axes as 359.9990279960° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-376.275,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.231,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000076601,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.000972004,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 8',0); +INSERT INTO "usage" VALUES('EPSG','8993','other_transformation','EPSG','3936','EPSG','3350','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3937','D48/GK to D96/TM (9)','Information source gives rotation angle of source CRS axes as 359.9984713141° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-379.883,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',497.465,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000132379,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0015286859,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 9',0); +INSERT INTO "usage" VALUES('EPSG','8994','other_transformation','EPSG','3937','EPSG','2580','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3938','D48/GK to D96/TM (10)','Information source gives rotation angle of source CRS axes as 359.9984602820° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-380.127,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',497.52,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000138184,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.001539718,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 10',0); +INSERT INTO "usage" VALUES('EPSG','8995','other_transformation','EPSG','3938','EPSG','3345','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3939','D48/GK to D96/TM (11)','Information source gives rotation angle of source CRS axes as 359.9982890576° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-377.965,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',499.354,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000089352,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0017109424,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 11',0); +INSERT INTO "usage" VALUES('EPSG','8996','other_transformation','EPSG','3939','EPSG','2581','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3940','D48/GK to D96/TM (12)','Information source gives rotation angle of source CRS axes as 359.9995848956° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-384.455,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',487.979,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000246653,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0004151044,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 12',0); +INSERT INTO "usage" VALUES('EPSG','8997','other_transformation','EPSG','3940','EPSG','3351','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3941','D48/GK to D96/TM (13)','Information source gives rotation angle of source CRS axes as 359.9978086208° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-384.415,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',502.308,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000190161,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0021913792,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 13',0); +INSERT INTO "usage" VALUES('EPSG','8998','other_transformation','EPSG','3941','EPSG','3352','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3951','D48/GK to D96/TM (14)','Information source gives rotation angle of source CRS axes as 359.9986330172° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-380.84,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',495.612,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000158378,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0013669828,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 14',0); +INSERT INTO "usage" VALUES('EPSG','8999','other_transformation','EPSG','3951','EPSG','3353','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3952','D48/GK to D96/TM (15)','Information source gives rotation angle of source CRS axes as 359.9986660539° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-377.812,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.076,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000100475,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0013339461,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 15',0); +INSERT INTO "usage" VALUES('EPSG','9000','other_transformation','EPSG','3952','EPSG','3354','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3953','D48/GK to D96/TM (16)','Information source gives rotation angle of source CRS axes as 359.9988835539° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-379.658,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',493.837,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000140367,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0011164461,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 16',0); +INSERT INTO "usage" VALUES('EPSG','9001','other_transformation','EPSG','3953','EPSG','3560','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3954','D48/GK to D96/TM (17)','Information source gives rotation angle of source CRS axes as 359.9985599438° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-382.138,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.819,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000177148,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0014400562,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 17',0); +INSERT INTO "usage" VALUES('EPSG','9002','other_transformation','EPSG','3954','EPSG','3347','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3955','D48/GK to D96/TM (18)','Information source gives rotation angle of source CRS axes as 359.9993228929° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-375.995,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',490.833,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000073161,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0006771071,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 18',0); +INSERT INTO "usage" VALUES('EPSG','9003','other_transformation','EPSG','3955','EPSG','2584','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3956','D48/GK to D96/TM (19)','Information source gives rotation angle of source CRS axes as 359.9975573682° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-381.28,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',505.983,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000118449,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0024426318,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 19',0); +INSERT INTO "usage" VALUES('EPSG','9004','other_transformation','EPSG','3956','EPSG','2585','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3957','D48/GK to D96/TM (20)','Information source gives rotation angle of source CRS axes as 359.9981683819° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-374.256,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',501.885,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000013456,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0018316181,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 20',0); +INSERT INTO "usage" VALUES('EPSG','9005','other_transformation','EPSG','3957','EPSG','2877','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3958','D48/GK to D96/TM (21)','Information source gives rotation angle of source CRS axes as 359.9987926666° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-371.329,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',496.151,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999980009,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0012073334,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 21',0); +INSERT INTO "usage" VALUES('EPSG','9006','other_transformation','EPSG','3958','EPSG','2586','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3959','D48/GK to D96/TM (22)','Information source gives rotation angle of source CRS axes as 359.9978515930° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-372.573,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',505.578,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999970275,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.002148407,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 22',0); +INSERT INTO "usage" VALUES('EPSG','9007','other_transformation','EPSG','3959','EPSG','2587','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3960','D48/GK to D96/TM (23)','Information source gives rotation angle of source CRS axes as 359.9980774015° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-371.849,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',503.318,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999967297,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0019225985,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 23',0); +INSERT INTO "usage" VALUES('EPSG','9008','other_transformation','EPSG','3960','EPSG','2878','EPSG','1032'); +INSERT INTO "other_transformation" VALUES('EPSG','3961','D48/GK to D96/TM (24)','Information source gives rotation angle of source CRS axes as 359.9979842399° using opposite rotation convention to EPSG formula.','EPSG','9621','Similarity transformation','EPSG','3912','EPSG','3794',0.2,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-371.498,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',504.461,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',0.9999956084,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',0.0020157601,'EPSG','9102',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn 24',0); +INSERT INTO "usage" VALUES('EPSG','9009','other_transformation','EPSG','3961','EPSG','3346','EPSG','1032'); INSERT INTO "other_transformation" VALUES('EPSG','4441','NZVD2009 height to One Tree Point 1964 height (1)','Accuracy 0.03m (1 sigma).','EPSG','9616','Vertical Offset','EPSG','4440','EPSG','5767',0.03,'EPSG','8603','Vertical Offset',0.06,'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,'LINZ-NZ ONTP',0); INSERT INTO "usage" VALUES('EPSG','9076','other_transformation','EPSG','4441','EPSG','3762','EPSG','1059'); INSERT INTO "other_transformation" VALUES('EPSG','4442','NZVD2009 height to Auckland 1946 height (1)','Accuracy 0.05m (1 sigma).','EPSG','9616','Vertical Offset','EPSG','4440','EPSG','5759',0.05,'EPSG','8603','Vertical Offset',0.34,'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,'LINZ-NZ AUCK',0); @@ -328,6 +424,8 @@ INSERT INTO "other_transformation" VALUES('EPSG','5133','Tokyo 1892 to Tokyo (1) INSERT INTO "usage" VALUES('EPSG','9240','other_transformation','EPSG','5133','EPSG','1364','EPSG','1027'); INSERT INTO "other_transformation" VALUES('EPSG','5134','Tokyo 1892 to Korean 1985 (1)','Caused by redetermination of longitude of Tokyo datum origin in 1918. Korean 1985 is based on the 1918 determination.','EPSG','9601','Longitude rotation','EPSG','5132','EPSG','4162',0.0,'EPSG','8602','Longitude offset',10.405,'EPSG','9104',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Kor',0); INSERT INTO "usage" VALUES('EPSG','9241','other_transformation','EPSG','5134','EPSG','3266','EPSG','1027'); +INSERT INTO "other_transformation" VALUES('EPSG','5166','ED50 / UTM zone 31N to ETRS89 / UTM zone 31N (1)','ICC publishes as two tfms, code 100800400 for ED50 to ETRS89 and code 800100400 for reverse when ordinate 1 = 129.547m, ordinate 2 = 208.186m, dS = 0.9999984496 and rotation = -1.56504". See ED50 to ETRS89 (14) (code 5661) for emulation using NTv2.','EPSG','9621','Similarity transformation','EPSG','23031','EPSG','25831',0.05,'EPSG','8621','Ordinate 1 of evaluation point in target CRS',-129.549,'EPSG','9001','EPSG','8622','Ordinate 2 of evaluation point in target CRS',-208.185,'EPSG','9001','EPSG','1061','Scale factor for source CRS axes',1.0000015504,'EPSG','9201','EPSG','8614','Rotation angle of source CRS axes',1.56504,'EPSG','9104',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ICC-Esp Cat',0); +INSERT INTO "usage" VALUES('EPSG','9273','other_transformation','EPSG','5166','EPSG','3732','EPSG','1079'); INSERT INTO "other_transformation" VALUES('EPSG','5196','HVRS71 height to EVRF2000 height (1)','Determined at 46 points. RMS residual 0.008m, maximum residual 0.016m.','EPSG','1046','Vertical Offset and Slope','EPSG','5610','EPSG','5730',0.1,'EPSG','8617','Ordinate 1 of evaluation point',45.21,'EPSG','9110','EPSG','8618','Ordinate 2 of evaluation point',16.22,'EPSG','9110','EPSG','8603','Vertical Offset',-0.343,'EPSG','9001','EPSG','8730','Inclination in latitude',-0.007,'EPSG','9104','EPSG','8731','Inclination in longitude',-0.016,'EPSG','9104',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Hrv',0); INSERT INTO "usage" VALUES('EPSG','9279','other_transformation','EPSG','5196','EPSG','3234','EPSG','1059'); INSERT INTO "other_transformation" VALUES('EPSG','5197','HVRS71 height to EVRF2007 height (1)','Determined at 46 points. RMS residual 0.008m, maximum residual 0.017m.','EPSG','1046','Vertical Offset and Slope','EPSG','5610','EPSG','5621',0.1,'EPSG','8617','Ordinate 1 of evaluation point',45.21,'EPSG','9110','EPSG','8618','Ordinate 2 of evaluation point',16.22,'EPSG','9110','EPSG','8603','Vertical Offset',-0.313,'EPSG','9001','EPSG','8730','Inclination in latitude',-0.016,'EPSG','9104','EPSG','8731','Inclination in longitude',-0.018,'EPSG','9104',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Hrv',0); diff --git a/docs/source/operations/transformations/affine.rst b/docs/source/operations/transformations/affine.rst index d2a4e26b63..6ee2f4ef86 100644 --- a/docs/source/operations/transformations/affine.rst +++ b/docs/source/operations/transformations/affine.rst @@ -22,6 +22,32 @@ x,y,z coordinates, and translation and scaling on the temporal coordinate. By default, the parameters are set for an identity transforms. The transformation is reversible unless the determinant of the sji matrix is 0, or `tscale` is 0 +This can be used to implement: + +- EPSG "Affine parametric transformation" of code 9624 by setting `A0`, `A1`, `A2`, + `B0`, `B1`, `B2` EPSG parameters to respectively `xoff`, `s11`, `s12`, `yoff`, + `s21`, `s21` PROJ parameters. + +- EPSG "Similarity transformation" of code 9621 by setting: + + * xoff to :math:`X_{T0}` + * yoff to :math:`Y_{T0}` + * s11 to :math:`M \cos \theta` + * s12 to :math:`M \sin \theta` + * s21 to :math:`-M \sin \theta` + * s22 to :math:`M \cos \theta` + + where: + + * :math:`X_{T0}` is the first ordinate of the origin point of the source + CRS expressed in the target CRS. + * :math:`Y_{T0}` is the second ordinate of the origin point of the source + CRS expressed in the target CRS. + * :math:`M` is the multiplication factor applied to coordinates in the + source CRS to obtain the correct scale of the target CRS. + * :math:`\theta` is the angle about which the axes of the source CRS need to + be rotated to coincide with the axes of the target CRS, counter-clockwise + being positive Parameters ################################################################################ diff --git a/scripts/build_db.py b/scripts/build_db.py index 6e23aa4f14..d23dca6e6d 100755 --- a/scripts/build_db.py +++ b/scripts/build_db.py @@ -820,7 +820,8 @@ def fill_other_transformation(proj_db_cursor): # 1068: Height Depth Reversal # 1069: Change of Vertical Unit # 1046: Vertical Offset and Slope - proj_db_cursor.execute("SELECT coord_op_code, coord_op_name, coord_op_method_code, coord_op_method_name, source_crs_code, target_crs_code, coord_op_accuracy, coord_tfm_version, epsg_coordoperation.deprecated, epsg_coordoperation.remarks FROM epsg.epsg_coordoperation LEFT JOIN epsg.epsg_coordoperationmethod USING (coord_op_method_code) WHERE coord_op_method_code IN (9601, 9616, 9618, 9619, 9624, 9660, 1068, 1069, 1046)") + # 9621 : Similarity transformation + proj_db_cursor.execute("SELECT coord_op_code, coord_op_name, coord_op_method_code, coord_op_method_name, source_crs_code, target_crs_code, coord_op_accuracy, coord_tfm_version, epsg_coordoperation.deprecated, epsg_coordoperation.remarks FROM epsg.epsg_coordoperation LEFT JOIN epsg.epsg_coordoperationmethod USING (coord_op_method_code) WHERE coord_op_method_code IN (9601, 9616, 9618, 9619, 9624, 9660, 1068, 1069, 1046, 9621)") for (code, name, method_code, method_name, source_crs_code, target_crs_code, coord_op_accuracy, coord_tfm_version, deprecated, remarks) in proj_db_cursor.fetchall(): # 1068 and 1069 are Height Depth Reversal and Change of Vertical Unit @@ -843,6 +844,11 @@ def fill_other_transformation(proj_db_cursor): source_crs_code = source_codes[0][0] target_crs_code = target_codes[0][0] + # Engineering CRS + if source_crs_code in (5800, 5817): + print("Skipping transformation %s as source CRS (%d) is not handled" % (name, source_crs_code)) + continue + expected_order = 1 max_n_params = 7 param_auth_name = [None for i in range(max_n_params)] diff --git a/src/iso19111/operation/conversion.cpp b/src/iso19111/operation/conversion.cpp index cbd1dcd76d..f6ecbf13a6 100644 --- a/src/iso19111/operation/conversion.cpp +++ b/src/iso19111/operation/conversion.cpp @@ -3580,6 +3580,8 @@ void Conversion::_exportToPROJString( methodEPSGCode == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT_NO_CONV_FACTOR; const bool isAffineParametric = methodEPSGCode == EPSG_CODE_METHOD_AFFINE_PARAMETRIC_TRANSFORMATION; + const bool isSimilarity = + methodEPSGCode == EPSG_CODE_METHOD_SIMILARITY_TRANSFORMATION; const bool isGeographicGeocentric = methodEPSGCode == EPSG_CODE_METHOD_GEOGRAPHIC_GEOCENTRIC; const bool isGeographicOffsets = @@ -3589,7 +3591,7 @@ void Conversion::_exportToPROJString( const bool isHeightDepthReversal = methodEPSGCode == EPSG_CODE_METHOD_HEIGHT_DEPTH_REVERSAL; const bool applySourceCRSModifiers = - !isZUnitConversion && !isAffineParametric && + !isZUnitConversion && !isAffineParametric && !isSimilarity && !isAxisOrderReversal(methodEPSGCode) && !isGeographicGeocentric && !isGeographicOffsets && !isHeightDepthReversal; bool applyTargetCRSModifiers = applySourceCRSModifiers; diff --git a/src/iso19111/operation/parammappings.cpp b/src/iso19111/operation/parammappings.cpp index 059f8dde8f..5cc031ab81 100644 --- a/src/iso19111/operation/parammappings.cpp +++ b/src/iso19111/operation/parammappings.cpp @@ -945,6 +945,7 @@ const struct MethodNameCode methodNameCodes[] = { // Transformations METHOD_NAME_CODE(LONGITUDE_ROTATION), METHOD_NAME_CODE(AFFINE_PARAMETRIC_TRANSFORMATION), + METHOD_NAME_CODE(SIMILARITY_TRANSFORMATION), METHOD_NAME_CODE(COORDINATE_FRAME_GEOCENTRIC), METHOD_NAME_CODE(COORDINATE_FRAME_GEOGRAPHIC_2D), METHOD_NAME_CODE(COORDINATE_FRAME_GEOGRAPHIC_3D), @@ -1112,6 +1113,31 @@ static const ParamMapping paramB2 = { static const ParamMapping *const paramsAffineParametricTransformation[] = { ¶mA0, ¶mA1, ¶mA2, ¶mB0, ¶mB1, ¶mB2, nullptr}; +static const ParamMapping paramOrdinate1EvalPointTargetCRS = { + EPSG_NAME_PARAMETER_ORDINATE_1_EVAL_POINT_TARGET_CRS, + EPSG_CODE_PARAMETER_ORDINATE_1_EVAL_POINT_TARGET_CRS, nullptr, + common::UnitOfMeasure::Type::UNKNOWN, nullptr}; + +static const ParamMapping paramOrdinate2EvalPointTargetCRS = { + EPSG_NAME_PARAMETER_ORDINATE_2_EVAL_POINT_TARGET_CRS, + EPSG_CODE_PARAMETER_ORDINATE_2_EVAL_POINT_TARGET_CRS, nullptr, + common::UnitOfMeasure::Type::UNKNOWN, nullptr}; + +static const ParamMapping paramScaleFactorForSourceCRSAxes = { + EPSG_NAME_PARAMETER_SCALE_FACTOR_FOR_SOURCE_CRS_AXES, + EPSG_CODE_PARAMETER_SCALE_FACTOR_FOR_SOURCE_CRS_AXES, nullptr, + common::UnitOfMeasure::Type::SCALE, nullptr}; + +static const ParamMapping paramRotationAngleOfSourceCRSAxes = { + EPSG_NAME_PARAMETER_ROTATION_ANGLE_OF_SOURCE_CRS_AXES, + EPSG_CODE_PARAMETER_ROTATION_ANGLE_OF_SOURCE_CRS_AXES, nullptr, + common::UnitOfMeasure::Type::ANGULAR, nullptr}; + +static const ParamMapping *const paramsSimilarityTransformation[] = { + ¶mOrdinate1EvalPointTargetCRS, ¶mOrdinate2EvalPointTargetCRS, + ¶mScaleFactorForSourceCRSAxes, ¶mRotationAngleOfSourceCRSAxes, + nullptr}; + static const ParamMapping paramXTranslation = { EPSG_NAME_PARAMETER_X_AXIS_TRANSLATION, EPSG_CODE_PARAMETER_X_AXIS_TRANSLATION, nullptr, @@ -1393,6 +1419,10 @@ static const MethodMapping otherMethodMappings[] = { EPSG_CODE_METHOD_AFFINE_PARAMETRIC_TRANSFORMATION, nullptr, nullptr, nullptr, paramsAffineParametricTransformation}, + {EPSG_NAME_METHOD_SIMILARITY_TRANSFORMATION, + EPSG_CODE_METHOD_SIMILARITY_TRANSFORMATION, nullptr, nullptr, nullptr, + paramsSimilarityTransformation}, + {PROJ_WKT2_NAME_METHOD_POLE_ROTATION_GRIB_CONVENTION, 0, nullptr, nullptr, nullptr, paramsPoleRotationGRIBConvention}, diff --git a/src/iso19111/operation/singleoperation.cpp b/src/iso19111/operation/singleoperation.cpp index e5a153f339..6a41d3783c 100644 --- a/src/iso19111/operation/singleoperation.cpp +++ b/src/iso19111/operation/singleoperation.cpp @@ -2883,6 +2883,36 @@ bool SingleOperation::exportToPROJStringGeneric( return true; } + if (methodEPSGCode == EPSG_CODE_METHOD_SIMILARITY_TRANSFORMATION) { + const double XT0 = + parameterValueMeasure( + EPSG_CODE_PARAMETER_ORDINATE_1_EVAL_POINT_TARGET_CRS) + .value(); + const double YT0 = + parameterValueMeasure( + EPSG_CODE_PARAMETER_ORDINATE_2_EVAL_POINT_TARGET_CRS) + .value(); + const double M = + parameterValueMeasure( + EPSG_CODE_PARAMETER_SCALE_FACTOR_FOR_SOURCE_CRS_AXES) + .value(); + const double q = parameterValueNumeric( + EPSG_CODE_PARAMETER_ROTATION_ANGLE_OF_SOURCE_CRS_AXES, + common::UnitOfMeasure::RADIAN); + + // Do not mess with axis unit and order for that transformation + + formatter->addStep("affine"); + formatter->addParam("xoff", XT0); + formatter->addParam("s11", M * cos(q)); + formatter->addParam("s12", M * sin(q)); + formatter->addParam("yoff", YT0); + formatter->addParam("s21", -M * sin(q)); + formatter->addParam("s22", M * cos(q)); + + return true; + } + if (isAxisOrderReversal(methodEPSGCode)) { formatter->addStep("axisswap"); formatter->addParam("order", "2,1"); diff --git a/src/proj_constants.h b/src/proj_constants.h index 2a7bbdba2f..cb3f3eb95d 100644 --- a/src/proj_constants.h +++ b/src/proj_constants.h @@ -705,6 +705,28 @@ /* ------------------------------------------------------------------------ */ +#define EPSG_CODE_METHOD_SIMILARITY_TRANSFORMATION 9621 +#define EPSG_NAME_METHOD_SIMILARITY_TRANSFORMATION \ + "Similarity transformation" + +#define EPSG_NAME_PARAMETER_ORDINATE_1_EVAL_POINT_TARGET_CRS \ + "Ordinate 1 of evaluation point in target CRS" +#define EPSG_CODE_PARAMETER_ORDINATE_1_EVAL_POINT_TARGET_CRS 8621 + +#define EPSG_NAME_PARAMETER_ORDINATE_2_EVAL_POINT_TARGET_CRS \ + "Ordinate 2 of evaluation point in target CRS" +#define EPSG_CODE_PARAMETER_ORDINATE_2_EVAL_POINT_TARGET_CRS 8622 + +#define EPSG_NAME_PARAMETER_SCALE_FACTOR_FOR_SOURCE_CRS_AXES \ + "Scale factor for source CRS axes" +#define EPSG_CODE_PARAMETER_SCALE_FACTOR_FOR_SOURCE_CRS_AXES 1061 + +#define EPSG_NAME_PARAMETER_ROTATION_ANGLE_OF_SOURCE_CRS_AXES \ + "Rotation angle of source CRS axes" +#define EPSG_CODE_PARAMETER_ROTATION_ANGLE_OF_SOURCE_CRS_AXES 8614 + +/* ------------------------------------------------------------------------ */ + #define EPSG_CODE_METHOD_AXIS_ORDER_REVERSAL_2D 9843 #define EPSG_NAME_METHOD_AXIS_ORDER_REVERSAL_2D "Axis Order Reversal (2D)" diff --git a/test/cli/testvarious b/test/cli/testvarious index 6033b38b62..b098a4f02d 100755 --- a/test/cli/testvarious +++ b/test/cli/testvarious @@ -1156,6 +1156,20 @@ $EXE --only-best --no-ballpark EPSG:4326+3855 EPSG:4979 -E >>${OUT} 2>&1 <> ${OUT} +echo "Test Similarity Transformation (example from EPSG Guidance Note 7.2)" >> ${OUT} +# +$EXE -d 3 EPSG:23031 EPSG:25831 -E >>${OUT} 2>&1 <> ${OUT} +echo "Test inverse of Similarity Transformation (example from EPSG Guidance Note 7.2)" >> ${OUT} +# +$EXE -d 3 EPSG:25831 EPSG:23031 -E >>${OUT} 2>&1 <