From a9b6f39494e6dab0ea02af9d82e7b3d570f5422f Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 24 Sep 2020 22:41:59 +0200 Subject: Database: "minimal" update to EPSG v10.003 Content mostly unchanged since v9.9 This update is "minimal" in that it mostly reflects the removal of the 'area' table, replaced now by 'extent', 'scope' and 'usage' Other new aspects of EPSG v10 are left aside. --- test/unit/test_factory.cpp | 343 ++++++++++++++++++++++++++++++++------------- 1 file changed, 246 insertions(+), 97 deletions(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index c34723f2..8881402c 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -835,14 +835,14 @@ TEST(factory, AuthorityFactory_createCoordinateOperation_helmert_15_CF) { " ID[\"EPSG\",1047]],\n" " OPERATIONACCURACY[0.03],\n" " USAGE[\n" - " SCOPE[\"Geodesy. RMS residuals 5mm north, 8mm east and 28mm " - "vertical, maximum residuals 10mm north, 13mm east and 51mm " - "vertical.\"],\n" + " SCOPE[\"Geodesy.\"],\n" " AREA[\"Australia - onshore and EEZ\"],\n" " BBOX[-47.2,109.23,-8.88,163.2]],\n" " ID[\"EPSG\",6276],\n" - " REMARK[\"Scale difference in ppb and scale difference rate in " - "ppb/yr where 1/billion = 1E-9 or nm/m.\"]]"; + " REMARK[\"RMS residuals 5mm north, 8mm east and 28mm vertical, " + "maximum residuals 10mm north, 13mm east and 51mm vertical. Scale " + "difference in ppb and scale difference rate in ppb/yr where " + "1/billion = 1E-9 or nm/m.\"]]"; EXPECT_EQ( op->exportToWKT( @@ -943,12 +943,12 @@ TEST( "file\",\"RGNC1991_NEA74Noumea.gsb\"],\n" " OPERATIONACCURACY[0.05],\n" " USAGE[\n" - " SCOPE[\"Accuracy 5-10cm.\"],\n" + " SCOPE[\"Geodesy.\"],\n" " AREA[\"New Caledonia - Grande Terre - Noumea\"],\n" " BBOX[-22.37,166.35,-22.19,166.54]],\n" " ID[\"EPSG\",1295],\n" " REMARK[\"Emulation using NTv2 method of tfm NEA74 Noumea to " - "RGNC91-93 (3) (code 9328). Note reversal of sign of parameter values " + "RGNC91-93 (3) (code 15943). Note reversal of sign of parameter values " "in grid file.\"]]"; EXPECT_EQ( op->exportToWKT( @@ -1415,10 +1415,13 @@ class FactoryWithTmpDatabase : public ::testing::Test { "0);")) << last_error(); ASSERT_TRUE( - execute("INSERT INTO area " + execute("INSERT INTO extent " "VALUES('EPSG','1262','World','World.',-90.0,90.0,-180." "0,180.0,0);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO scope VALUES('EPSG','1024','Not known.',0);")) + << last_error(); ASSERT_TRUE( execute("INSERT INTO prime_meridian " "VALUES('EPSG','8901','Greenwich',0.0,'EPSG','9102',0);")) @@ -1434,12 +1437,20 @@ class FactoryWithTmpDatabase : public ::testing::Test { << last_error(); ASSERT_TRUE( execute("INSERT INTO geodetic_datum " - "VALUES('EPSG','6326','World Geodetic System 1984','',NULL," - "'EPSG','7030','EPSG','8901','EPSG','1262',NULL,0);")) + "VALUES('EPSG','6326','World Geodetic System 1984',''," + "'EPSG','7030','EPSG','8901',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'geodetic_datum_6326_usage','geodetic_datum'," + "'EPSG','6326','EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE( execute("INSERT INTO vertical_datum VALUES('EPSG','1027','EGM2008 " - "geoid',NULL,NULL,'EPSG','1262',NULL,0);")) + "geoid',NULL,NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'vertical_datum_1027_usage','vertical_datum'," + "'EPSG','1027','EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute("INSERT INTO coordinate_system " "VALUES('EPSG','6422','ellipsoidal',2);")) @@ -1454,8 +1465,12 @@ class FactoryWithTmpDatabase : public ::testing::Test { << last_error(); ASSERT_TRUE( execute("INSERT INTO geodetic_crs VALUES('EPSG','4326','WGS " - "84',NULL,NULL,'geographic " - "2D','EPSG','6422','EPSG','6326','EPSG','1262',NULL,0);")) + "84',NULL,'geographic " + "2D','EPSG','6422','EPSG','6326',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'geodetic_crs4326_usage','geodetic_crs'," + "'EPSG','4326','EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute("INSERT INTO coordinate_system " @@ -1467,8 +1482,11 @@ class FactoryWithTmpDatabase : public ::testing::Test { << last_error(); ASSERT_TRUE( execute("INSERT INTO vertical_crs VALUES('EPSG','3855','EGM2008 " - "height',NULL,NULL,'EPSG','6499','EPSG','1027','EPSG'," - "'1262',0);")) + "height',NULL,'EPSG','6499','EPSG','1027',0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'vertical_crs3855_usage','vertical_crs'," + "'EPSG','3855','EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute("INSERT INTO unit_of_measure " @@ -1477,13 +1495,13 @@ class FactoryWithTmpDatabase : public ::testing::Test { << last_error(); ASSERT_TRUE(execute( - "INSERT INTO area VALUES('EPSG','1933','World - N hemisphere - " + "INSERT INTO extent VALUES('EPSG','1933','World - N hemisphere - " "0°E to 6°E','',0.0,84.0,0.0,6.0,0);")) << last_error(); ASSERT_TRUE(execute( "INSERT INTO conversion VALUES('EPSG','16031','UTM zone " - "31N',NULL,NULL,'EPSG','1933','EPSG','9807','Transverse " + "31N',NULL,'EPSG','9807','Transverse " "Mercator','EPSG','8801','Latitude " "of " "natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of " @@ -1495,9 +1513,13 @@ class FactoryWithTmpDatabase : public ::testing::Test { "NULL," "NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'conversion16031_usage','conversion'," + "'EPSG','16031','EPSG','1933','EPSG','1024');")) + << last_error(); ASSERT_TRUE(execute( - "INSERT INTO area VALUES('EPSG','2060','World - N hemisphere - " + "INSERT INTO extent VALUES('EPSG','2060','World - N hemisphere - " "0°E to 6°E - by country','',0.0,84.0,0.0,6.0,0);")) << last_error(); @@ -1517,36 +1539,56 @@ class FactoryWithTmpDatabase : public ::testing::Test { ASSERT_TRUE(execute("INSERT INTO projected_crs " "VALUES('EPSG','32631','WGS 84 / UTM zone " - "31N',NULL,NULL,'EPSG','4400','EPSG','4326'," - "'EPSG','16031','" - "EPSG','2060',NULL,0);")) + "31N',NULL,'EPSG','4400','EPSG','4326'," + "'EPSG','16031',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'projected_crs32631_usage','projected_crs'," + "'EPSG','32631','EPSG','2060','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute( "INSERT INTO compound_crs VALUES('EPSG','MY_COMPOUND','WGS 84 + " - "EGM2008 geoid height',NULL,NULL,'EPSG','4326','EPSG','3855'," - "'EPSG','1262',0);")) + "EGM2008 geoid height',NULL,'EPSG','4326','EPSG','3855',0);")) + << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('EPSG'," + "'compound_crsMY_COMPOUND_usage','compound_crs'," + "'EPSG','MY_COMPOUND','EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute( "INSERT INTO helmert_transformation " - "VALUES('EPSG','DUMMY_HELMERT','name',NULL,NULL,'EPSG','9603','" + "VALUES('EPSG','DUMMY_HELMERT','name',NULL,'EPSG','9603','" "Geocentric translations (geog2D domain)','EPSG','4326'," - "'EPSG','4326','EPSG','1262',44.0,-143." + "'EPSG','4326',44.0,-143." "0,-90.0,-294.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,NULL,0);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('EPSG'," + "'helmert_transformation_DUMMY_HELMERT_usage'," + "'helmert_transformation'," + "'EPSG','DUMMY_HELMERT','EPSG','1262','EPSG','1024');")) + << last_error(); ASSERT_TRUE(execute( "INSERT INTO grid_transformation " - "VALUES('EPSG','DUMMY_GRID_TRANSFORMATION','name',NULL,NULL," + "VALUES('EPSG','DUMMY_GRID_TRANSFORMATION','name',NULL," "'EPSG','9615'" - ",'NTv2','EPSG','4326','EPSG','4326','EPSG','1262',1.0,'EPSG','" + ",'NTv2','EPSG','4326','EPSG','4326',1.0,'EPSG','" "8656','Latitude and longitude difference " "file','nzgd2kgrid0005.gsb',NULL,NULL,NULL,NULL,NULL,NULL,NULL," "0);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('EPSG'," + "'grid_transformation_DUMMY_GRID_TRANSFORMATION_usage'," + "'grid_transformation'," + "'EPSG','DUMMY_GRID_TRANSFORMATION'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); ASSERT_TRUE(execute( "INSERT INTO unit_of_measure VALUES('EPSG','9110','sexagesimal " @@ -1555,21 +1597,33 @@ class FactoryWithTmpDatabase : public ::testing::Test { ASSERT_TRUE(execute( "INSERT INTO other_transformation " - "VALUES('EPSG','DUMMY_OTHER_TRANSFORMATION','name',NULL,NULL," + "VALUES('EPSG','DUMMY_OTHER_TRANSFORMATION','name',NULL," "'EPSG','9601','Longitude rotation'," - "'EPSG','4326','EPSG','4326','EPSG','1262',0.0,'EPSG'" + "'EPSG','4326','EPSG','4326',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,0);")) << last_error(); - ASSERT_TRUE( - execute("INSERT INTO concatenated_operation " - "VALUES('EPSG','DUMMY_CONCATENATED','name',NULL,NULL," - "'EPSG','4326','EPSG'" - ",'4326','EPSG','1262',NULL,NULL,0);")) + execute("INSERT INTO usage VALUES('EPSG'," + "'other_transformation_DUMMY_OTHER_TRANSFORMATION_usage'," + "'other_transformation'," + "'EPSG','DUMMY_OTHER_TRANSFORMATION'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); + + ASSERT_TRUE(execute("INSERT INTO concatenated_operation " + "VALUES('EPSG','DUMMY_CONCATENATED','name',NULL," + "'EPSG','4326','EPSG'" + ",'4326',NULL,NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'concatenated_operation_DUMMY_CONCATENATED_usage'," + "'concatenated_operation'," + "'EPSG','DUMMY_CONCATENATED'," + "'EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " @@ -1587,20 +1641,35 @@ class FactoryWithTmpDatabase : public ::testing::Test { const auto vals = std::vector{"SOURCE", "TARGET", "PIVOT"}; for (const auto &val : vals) { - ASSERT_TRUE( - execute("INSERT INTO geodetic_datum " - "VALUES('FOO','" + - val + "','" + val + - "','',NULL," - "'EPSG','7030','EPSG','8901','EPSG','1262',NULL,0);")) + ASSERT_TRUE(execute("INSERT INTO geodetic_datum " + "VALUES('FOO','" + + val + "','" + val + + "',''," + "'EPSG','7030','EPSG','8901',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('FOO'," + "'geodetic_datum_" + + val + "_usage'," + "'geodetic_datum'," + "'FOO','" + + val + "'," + "'EPSG','1262','EPSG','1024');")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO geodetic_crs " "VALUES('NS_" + val + "','" + val + "','" + val + - "',NULL,NULL,'geographic 2D','EPSG','6422'," + "',NULL,'geographic 2D','EPSG','6422'," "'FOO','" + - val + "'," - "'EPSG','1262',NULL,0);")) + val + "',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('FOO'," + "'geodetic_crs_" + + val + "_usage'," + "'geodetic_crs'," + "'NS_" + + val + "','" + val + + "','EPSG','1262','EPSG','1024');")) << last_error(); } } @@ -1612,14 +1681,21 @@ class FactoryWithTmpDatabase : public ::testing::Test { "INSERT INTO helmert_transformation " "VALUES('OTHER','" + src + "_" + dst + "','Transformation from " + src + " to " + dst + - "',NULL,NULL,'EPSG','9603','" + "',NULL,'EPSG','9603','" "Geocentric translations (geog2D domain)','NS_" + src + "','" + src + "','NS_" + dst + "','" + dst + - "','EPSG'" - ",'1262',1.0,0,0,0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL," + "',1.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,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'helmert_transformation" + + src + '_' + dst + "_usage'," + "'helmert_transformation'," + "'OTHER','" + + src + "_" + dst + "'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); } void checkSourceToOther() { @@ -1886,14 +1962,22 @@ TEST_F(FactoryWithTmpDatabase, ASSERT_TRUE( execute("INSERT INTO geodetic_crs VALUES('OTHER','OTHER_4326','WGS " - "84',NULL,NULL,'geographic " - "2D','EPSG','6422','EPSG','6326','EPSG','1262',NULL,0);")) + "84',NULL,'geographic " + "2D','EPSG','6422','EPSG','6326',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'geodetic_crs_OTHER_4326_usage','geodetic_crs'," + "'OTHER','OTHER_4326','EPSG','1262','EPSG','1024');")) << last_error(); ASSERT_TRUE(execute("INSERT INTO projected_crs " "VALUES('OTHER','OTHER_32631','WGS 84 / UTM zone " - "31N',NULL,NULL,'EPSG','4400','OTHER','OTHER_4326'," - "'EPSG','16031','EPSG','2060',NULL,0);")) + "31N',NULL,'EPSG','4400','OTHER','OTHER_4326'," + "'EPSG','16031',NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'projected_crs_OTHER_32631_usage','projected_crs'," + "'OTHER','OTHER_32631','EPSG','2060','EPSG','1024');")) << last_error(); auto factoryGeneral = AuthorityFactory::create( @@ -1924,12 +2008,19 @@ TEST_F(FactoryWithTmpDatabase, ASSERT_TRUE(execute( "INSERT INTO grid_transformation " - "VALUES('OTHER','OTHER_GRID_TRANSFORMATION','name',NULL,NULL," + "VALUES('OTHER','OTHER_GRID_TRANSFORMATION','name',NULL," "'EPSG','9615'" - ",'NTv2','EPSG','4326','OTHER','OTHER_4326','EPSG','1262',1.0,'EPSG','" + ",'NTv2','EPSG','4326','OTHER','OTHER_4326',1.0,'EPSG','" "8656','Latitude and longitude difference " "file','nzgd2kgrid0005.gsb',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute( + "INSERT INTO usage VALUES('OTHER'," + "'grid_transformation_OTHER_GRID_TRANSFORMATION_usage'," + "'grid_transformation'," + "'OTHER','OTHER_GRID_TRANSFORMATION','EPSG','1262','EPSG','1024');")) + << last_error(); + { auto res = factoryGeneral->createFromCoordinateReferenceSystemCodes( "EPSG", "4326", "OTHER", "OTHER_4326", false, false, false, false); @@ -1956,41 +2047,67 @@ TEST_F(FactoryWithTmpDatabase, ASSERT_TRUE(execute( "INSERT INTO grid_transformation " - "VALUES('OTHER','TRANSFORMATION_10M','TRANSFORMATION_10M',NULL,NULL," + "VALUES('OTHER','TRANSFORMATION_10M','TRANSFORMATION_10M',NULL," "'EPSG','9615'" - ",'NTv2','EPSG','4326','EPSG','4326','EPSG','1262',10.0,'EPSG','" + ",'NTv2','EPSG','4326','EPSG','4326',10.0,'EPSG','" "8656','Latitude and longitude difference " "file','nzgd2kgrid0005.gsb',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('OTHER'," + "'grid_transformation_TTRANSFORMATION_10M_usage'," + "'grid_transformation'," + "'OTHER','TRANSFORMATION_10M','EPSG','1262','EPSG','1024');")) + << last_error(); ASSERT_TRUE( execute("INSERT INTO grid_transformation " "VALUES('OTHER','TRANSFORMATION_1M_SMALL_EXTENT','" - "TRANSFORMATION_1M_SMALL_EXTENT',NULL,NULL,'EPSG','9615'" - ",'NTv2','EPSG','4326','EPSG','4326','EPSG','2060',1.0,'EPSG','" + "TRANSFORMATION_1M_SMALL_EXTENT',NULL,'EPSG','9615'" + ",'NTv2','EPSG','4326','EPSG','4326',1.0,'EPSG','" "8656','Latitude and longitude difference " "file','nzgd2kgrid0005.gsb',NULL,NULL,NULL,NULL,NULL,NULL," "NULL,0);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('OTHER'," + "'grid_transformation_TRANSFORMATION_1M_SMALL_EXTENT_usage'," + "'grid_transformation'," + "'OTHER','TRANSFORMATION_1M_SMALL_EXTENT'," + "'EPSG','2060','EPSG','1024');")) + << last_error(); ASSERT_TRUE(execute( "INSERT INTO grid_transformation " - "VALUES('OTHER','TRANSFORMATION_1M','TRANSFORMATION_1M',NULL,NULL," + "VALUES('OTHER','TRANSFORMATION_1M','TRANSFORMATION_1M',NULL," "'EPSG','9615'" - ",'NTv2','EPSG','4326','EPSG','4326','EPSG','1262',1.0,'EPSG','" + ",'NTv2','EPSG','4326','EPSG','4326',1.0,'EPSG','" "8656','Latitude and longitude difference " "file','nzgd2kgrid0005.gsb',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('OTHER'," + "'grid_transformation_TRANSFORMATION_1M_usage'," + "'grid_transformation'," + "'OTHER','TRANSFORMATION_1M','EPSG','1262','EPSG','1024');")) + << last_error(); ASSERT_TRUE( execute("INSERT INTO grid_transformation " "VALUES('OTHER','TRANSFORMATION_0.5M_DEPRECATED','" - "TRANSFORMATION_0.5M_DEPRECATED',NULL,NULL,'EPSG','9615'" - ",'NTv2','EPSG','4326','EPSG','4326','EPSG','1262',1.0,'EPSG','" + "TRANSFORMATION_0.5M_DEPRECATED',NULL,'EPSG','9615'" + ",'NTv2','EPSG','4326','EPSG','4326',1.0,'EPSG','" "8656','Latitude and longitude difference " "file','nzgd2kgrid0005.gsb',NULL,NULL,NULL,NULL,NULL,NULL," "NULL,1);")) << last_error(); + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('OTHER'," + "'grid_transformation_TRANSFORMATION_0.5M_DEPRECATED_usage'," + "'grid_transformation'," + "'OTHER','TRANSFORMATION_0.5M_DEPRECATED'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); auto factoryOTHER = AuthorityFactory::create(DatabaseContext::create(m_ctxt), "OTHER"); @@ -2086,14 +2203,20 @@ TEST_F(FactoryWithTmpDatabase, AuthorityFactory_proj_based_transformation) { ASSERT_TRUE(execute( "INSERT INTO other_transformation " - "VALUES('OTHER','FOO','My PROJ string based op',NULL,NULL,'PROJ'," + "VALUES('OTHER','FOO','My PROJ string based op',NULL,'PROJ'," "'PROJString','+proj=pipeline +ellps=WGS84 +step +proj=longlat'," - "'EPSG','4326','EPSG','4326','EPSG','1262',0.0,NULL,NULL,NULL," + "'EPSG','4326','EPSG','4326',0.0,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'other_transformation_FOO_usage'," + "'other_transformation'," + "'OTHER','FOO'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); auto factoryOTHER = AuthorityFactory::create(DatabaseContext::create(m_ctxt), "OTHER"); @@ -2145,16 +2268,22 @@ TEST_F(FactoryWithTmpDatabase, AuthorityFactory_wkt_based_transformation) { ASSERT_TRUE( execute("INSERT INTO other_transformation " - "VALUES('OTHER','FOO','My WKT string based op',NULL,NULL," + "VALUES('OTHER','FOO','My WKT string based op',NULL," "'PROJ','WKT','" + std::string(wkt) + "'," - "'EPSG','4326','EPSG','4326','EPSG','1262',0.0,NULL,NULL,NULL," + "'EPSG','4326','EPSG','4326',0.0,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'other_transformation_FOO_usage'," + "'other_transformation'," + "'OTHER','FOO'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); auto factoryOTHER = AuthorityFactory::create(DatabaseContext::create(m_ctxt), "OTHER"); @@ -2180,16 +2309,22 @@ TEST_F(FactoryWithTmpDatabase, ASSERT_TRUE( execute("INSERT INTO other_transformation " - "VALUES('OTHER','FOO','My WKT string based op',NULL,NULL," + "VALUES('OTHER','FOO','My WKT string based op',NULL," "'PROJ','WKT','" + std::string("invalid_wkt") + "'," - "'EPSG','4326','EPSG','4326','EPSG','1262',0.0,NULL,NULL,NULL," + "'EPSG','4326','EPSG','4326',0.0,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'other_transformation_FOO_usage'," + "'other_transformation'," + "'OTHER','FOO'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); auto factoryOTHER = AuthorityFactory::create(DatabaseContext::create(m_ctxt), "OTHER"); @@ -2208,16 +2343,22 @@ TEST_F(FactoryWithTmpDatabase, ASSERT_TRUE( execute("INSERT INTO other_transformation " - "VALUES('OTHER','FOO','My WKT string based op',NULL,NULL," + "VALUES('OTHER','FOO','My WKT string based op',NULL," "'PROJ','WKT','" + std::string("LOCAL_CS[\"foo\"]") + "'," - "'EPSG','4326','EPSG','4326','EPSG','1262',0.0,NULL,NULL,NULL," + "'EPSG','4326','EPSG','4326',0.0,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER'," + "'other_transformation_FOO_usage'," + "'other_transformation'," + "'OTHER','FOO'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); auto factoryOTHER = AuthorityFactory::create(DatabaseContext::create(m_ctxt), "OTHER"); @@ -2297,40 +2438,40 @@ TEST_F(FactoryWithTmpDatabase, custom_geodetic_crs) { populateWithFakeEPSG(); ASSERT_TRUE(execute("INSERT INTO geodetic_crs VALUES('TEST_NS','TEST','my " - "name TEST',NULL,NULL,'geographic 2D'," - "NULL,NULL,NULL,NULL,NULL,NULL,'+proj=longlat +a=2 " + "name TEST',NULL,'geographic 2D'," + "NULL,NULL,NULL,NULL,'+proj=longlat +a=2 " "+rf=300',0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO geodetic_crs VALUES" "('TEST_NS','TEST_BOUND'," - "'my name TEST',NULL,NULL,'geographic 2D'," - "NULL,NULL,NULL,NULL,NULL,NULL,'+proj=longlat +a=2 " + "'my name TEST',NULL,'geographic 2D'," + "NULL,NULL,NULL,NULL,'+proj=longlat +a=2 " "+rf=300 +towgs84=1,2,3',0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO geodetic_crs VALUES('TEST_NS','TEST_GC'," - "'my name',NULL,NULL,'geocentric',NULL,NULL,NULL,NULL," + "'my name',NULL,'geocentric',NULL,NULL," "NULL,NULL,'+proj=geocent +a=2 +rf=300',0);")) << last_error(); ASSERT_TRUE(execute( "INSERT INTO geodetic_crs " "VALUES('TEST_NS','TEST_REF_ANOTHER','my name TEST_REF_ANOTHER'," - "NULL,NULL," - "'geographic 2D',NULL,NULL,NULL,NULL,NULL,NULL,'TEST_NS:TEST',0);")) + "NULL," + "'geographic 2D',NULL,NULL,NULL,NULL,'TEST_NS:TEST',0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO geodetic_crs " - "VALUES('TEST_NS','TEST_WRONG','my name',NULL,NULL," - "'geographic 2D',NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST_WRONG','my name',NULL," + "'geographic 2D',NULL,NULL,NULL,NULL," "'+proj=merc',0);")) << last_error(); ASSERT_TRUE(execute( "INSERT INTO geodetic_crs " - "VALUES('TEST_NS','TEST_RECURSIVE','my name',NULL,NULL,'geographic 2D'," - "NULL,NULL,NULL,NULL,NULL,NULL,'TEST_NS:TEST_RECURSIVE',0);")) + "VALUES('TEST_NS','TEST_RECURSIVE','my name',NULL,'geographic 2D'," + "NULL,NULL,NULL,NULL,'TEST_NS:TEST_RECURSIVE',0);")) << last_error(); auto factory = @@ -2383,42 +2524,42 @@ TEST_F(FactoryWithTmpDatabase, custom_projected_crs) { populateWithFakeEPSG(); ASSERT_TRUE(execute("INSERT INTO projected_crs " - "VALUES('TEST_NS','TEST','my name',NULL,NULL,NULL," - "NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST','my name',NULL,NULL," + "NULL,NULL,NULL,NULL,NULL," "'+proj=mbt_s +unused_flag',0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO projected_crs " - "VALUES('TEST_NS','TEST_BOUND','my name',NULL,NULL," - "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST_BOUND','my name',NULL," + "NULL,NULL,NULL,NULL,NULL,NULL," "'+proj=mbt_s +unused_flag +towgs84=1,2,3',0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO projected_crs " - "VALUES('TEST_NS','TEST_WRONG','my name',NULL,NULL," - "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST_WRONG','my name',NULL," + "NULL,NULL,NULL,NULL,NULL,NULL," "'+proj=longlat',0);")) << last_error(); // Unknown ellipsoid ASSERT_TRUE(execute("INSERT INTO projected_crs " - "VALUES('TEST_NS','TEST_MERC','merc',NULL,NULL,NULL," - "NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST_MERC','merc',NULL,NULL," + "NULL,NULL,NULL,NULL,NULL," "'+proj=merc +x_0=0 +R=1',0);")) << last_error(); // Well-known ellipsoid ASSERT_TRUE(execute("INSERT INTO projected_crs " - "VALUES('TEST_NS','TEST_MERC2','merc2',NULL,NULL,NULL," - "NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST_MERC2','merc2',NULL,NULL," + "NULL,NULL,NULL,NULL,NULL," "'+proj=merc +x_0=0 +ellps=GRS80',0);")) << last_error(); // WKT1_GDAL ASSERT_TRUE( execute("INSERT INTO projected_crs " - "VALUES('TEST_NS','TEST_WKT1_GDAL','WKT1_GDAL',NULL,NULL,NULL," - "NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "VALUES('TEST_NS','TEST_WKT1_GDAL','WKT1_GDAL',NULL,NULL," + "NULL,NULL,NULL,NULL,NULL," "'" "PROJCS[\"unknown\",\n" " GEOGCS[\"unknown\",\n" @@ -2578,8 +2719,8 @@ TEST(factory, attachExtraDatabases_auxiliary) { sqlite3_exec( dbAux, "INSERT INTO geodetic_crs VALUES('OTHER','OTHER_4326','WGS " - "84',NULL,NULL,'geographic 2D','EPSG','6422','EPSG','6326'," - "'EPSG','1262',NULL,0);", + "84',NULL,'geographic 2D','EPSG','6422','EPSG','6326'," + "NULL,0);", nullptr, nullptr, nullptr) == SQLITE_OK); ASSERT_TRUE(sqlite3_exec(dbAux, "COMMIT", nullptr, nullptr, nullptr) == SQLITE_OK); @@ -2704,26 +2845,34 @@ TEST_F(FactoryWithTmpDatabase, ASSERT_TRUE( execute("INSERT INTO other_transformation " "VALUES('OTHER','PARTIAL_AREA_PERFECT_ACCURACY'," - "'PARTIAL_AREA_PERFECT_ACCURACY',NULL,NULL,'PROJ'," + "'PARTIAL_AREA_PERFECT_ACCURACY',NULL,'PROJ'," "'PROJString','+proj=helmert +x=1'," - "'EPSG','4326','EPSG','4326','EPSG','1933',0.0,NULL,NULL,NULL," + "'EPSG','4326','EPSG','4326',0.0,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER', " + "'1','other_transformation','OTHER','PARTIAL_AREA_" + "PERFECT_ACCURACY','EPSG','1933','EPSG','1024')")) + << last_error(); ASSERT_TRUE( execute("INSERT INTO other_transformation " "VALUES('OTHER','WHOLE_AREA_APPROX_ACCURACY'," - "'WHOLE_AREA_APPROX_ACCURACY',NULL,NULL,'PROJ'," + "'WHOLE_AREA_APPROX_ACCURACY',NULL,'PROJ'," "'PROJString','+proj=helmert +x=2'," - "'EPSG','4326','EPSG','4326','EPSG','1262',1.0,NULL,NULL,NULL," + "'EPSG','4326','EPSG','4326',1.0,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);")) << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('OTHER', " + "'2','other_transformation','OTHER','WHOLE_AREA_APPROX_" + "ACCURACY','EPSG','1262','EPSG','1024')")) + << last_error(); auto dbContext = DatabaseContext::create(m_ctxt); auto authFactory = -- cgit v1.2.3 From 4c992038ea01ead56df12f468f29325f7ca9e43d Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 5 Oct 2020 14:36:33 +0200 Subject: Database: add a reference_frame_epoch column to the geodetic_datum for dynamic datums, but not yet used --- test/unit/test_factory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 8881402c..90990a96 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -1438,7 +1438,7 @@ class FactoryWithTmpDatabase : public ::testing::Test { ASSERT_TRUE( execute("INSERT INTO geodetic_datum " "VALUES('EPSG','6326','World Geodetic System 1984',''," - "'EPSG','7030','EPSG','8901',NULL,0);")) + "'EPSG','7030','EPSG','8901',NULL,NULL,0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," "'geodetic_datum_6326_usage','geodetic_datum'," @@ -1645,7 +1645,7 @@ class FactoryWithTmpDatabase : public ::testing::Test { "VALUES('FOO','" + val + "','" + val + "',''," - "'EPSG','7030','EPSG','8901',NULL,0);")) + "'EPSG','7030','EPSG','8901',NULL,NULL,0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO usage VALUES('FOO'," "'geodetic_datum_" + -- cgit v1.2.3 From 2cfdd6f7fc683517a62147feace1b98b3f587abc Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 5 Oct 2020 14:56:41 +0200 Subject: Database: instanciate DynamicGeodeticReferenceFrame (things like ITRFxxx, WGS 84 (Gxxxx), etc.) when possible --- test/unit/test_factory.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 90990a96..6950c88e 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -246,6 +246,8 @@ TEST(factory, AuthorityFactory_createGeodeticDatum) { EXPECT_THROW(factory->createGeodeticDatum("-1"), NoSuchAuthorityCodeException); auto grf = factory->createGeodeticDatum("6326"); + EXPECT_TRUE(nn_dynamic_pointer_cast(grf) == + nullptr); ASSERT_EQ(grf->identifiers().size(), 1U); EXPECT_EQ(grf->identifiers()[0]->code(), "6326"); EXPECT_EQ(*(grf->identifiers()[0]->codeSpace()), "EPSG"); @@ -266,10 +268,22 @@ TEST(factory, AuthorityFactory_createGeodeticDatum) { TEST(factory, AuthorityFactory_createGeodeticDatum_with_publication_date) { auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); - //'World Geodetic System 1984 (G1762) - auto grf = factory->createGeodeticDatum("1156"); + // North American Datum 1983 + auto grf = factory->createGeodeticDatum("6269"); + EXPECT_TRUE(nn_dynamic_pointer_cast(grf) == + nullptr); EXPECT_TRUE(grf->publicationDate().has_value()); - EXPECT_EQ(grf->publicationDate()->toString(), "2005-01-01"); + EXPECT_EQ(grf->publicationDate()->toString(), "1986-01-01"); +} + +// --------------------------------------------------------------------------- + +TEST(factory, AuthorityFactory_createDynamicGeodeticDatum) { + auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + auto grf = factory->createGeodeticDatum("1165"); // ITRF 2014 + auto dgrf = nn_dynamic_pointer_cast(grf); + ASSERT_TRUE(dgrf != nullptr); + EXPECT_EQ(dgrf->frameReferenceEpoch().value(), 2010.0); } // --------------------------------------------------------------------------- @@ -747,6 +761,8 @@ TEST(factory, AuthorityFactory_createCoordinateOperation_helmert_15_CF) { " VERSION[\"GA-Aus 2010\"],\n" " SOURCECRS[\n" " GEODCRS[\"ITRF2008\",\n" + " DYNAMIC[\n" + " FRAMEEPOCH[2005]],\n" " DATUM[\"International Terrestrial Reference Frame " "2008\",\n" " ELLIPSOID[\"GRS 1980\",6378137,298.257222101,\n" -- cgit v1.2.3 From 3ed9a613d8da9874f45d2a069686f1fa38c72ad9 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 5 Oct 2020 15:40:20 +0200 Subject: Database: use extended description for extent/area of use, as done by epsg.org WKT export --- test/unit/test_factory.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 6950c88e..5ddc2387 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -218,7 +218,7 @@ TEST(factory, AuthorityFactory_createExtent) { auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); EXPECT_THROW(factory->createExtent("-1"), NoSuchAuthorityCodeException); auto extent = factory->createExtent("1262"); - EXPECT_EQ(*(extent->description()), "World"); + EXPECT_EQ(*(extent->description()), "World."); const auto &geogElts = extent->geographicElements(); ASSERT_EQ(geogElts.size(), 1U); auto bbox = nn_dynamic_pointer_cast(geogElts[0]); @@ -234,7 +234,7 @@ TEST(factory, AuthorityFactory_createExtent) { TEST(factory, AuthorityFactory_createExtent_no_bbox) { auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); auto extent = factory->createExtent("1361"); // Sudan - south. Deprecated - EXPECT_EQ(*(extent->description()), "Sudan - south"); + EXPECT_EQ(*(extent->description()), "Sudan - south."); const auto &geogElts = extent->geographicElements(); EXPECT_TRUE(geogElts.empty()); } @@ -852,7 +852,9 @@ TEST(factory, AuthorityFactory_createCoordinateOperation_helmert_15_CF) { " OPERATIONACCURACY[0.03],\n" " USAGE[\n" " SCOPE[\"Geodesy.\"],\n" - " AREA[\"Australia - onshore and EEZ\"],\n" + " AREA[\"Australia - onshore and offshore to 200 nautical mile " + "EEZ boundary. Includes Lord Howe Island, Ashmore and Cartier " + "Islands.\"],\n" " BBOX[-47.2,109.23,-8.88,163.2]],\n" " ID[\"EPSG\",6276],\n" " REMARK[\"RMS residuals 5mm north, 8mm east and 28mm vertical, " @@ -960,7 +962,7 @@ TEST( " OPERATIONACCURACY[0.05],\n" " USAGE[\n" " SCOPE[\"Geodesy.\"],\n" - " AREA[\"New Caledonia - Grande Terre - Noumea\"],\n" + " AREA[\"New Caledonia - Grande Terre - Noumea district.\"],\n" " BBOX[-22.37,166.35,-22.19,166.54]],\n" " ID[\"EPSG\",1295],\n" " REMARK[\"Emulation using NTv2 method of tfm NEA74 Noumea to " @@ -1036,7 +1038,7 @@ TEST(factory, AuthorityFactory_createCoordinateOperation_other_transformation) { " OPERATIONACCURACY[0.0],\n" " USAGE[\n" " SCOPE[\"Change of prime meridian.\"],\n" - " AREA[\"Europe - Czechoslovakia\"],\n" + " AREA[\"Czechia; Slovakia.\"],\n" " BBOX[47.73,12.09,51.06,22.56]],\n" " ID[\"EPSG\",1884]]"; -- cgit v1.2.3 From ecf9cf0d975b3eb7630a314e8b32dd59658c3e2a Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 8 Oct 2020 17:31:13 +0200 Subject: getCRSInfoList(): make it use area description --- test/unit/test_factory.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 5ddc2387..37f546f1 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -3151,7 +3151,7 @@ TEST(factory, getCRSInfoList) { EXPECT_EQ(info.south_lat_degree, -90.0); EXPECT_EQ(info.east_lon_degree, 180.0); EXPECT_EQ(info.north_lat_degree, 90.0); - EXPECT_EQ(info.areaName, "World"); + EXPECT_EQ(info.areaName, "World."); EXPECT_TRUE(info.projectionMethodName.empty()); found4326 = true; } else if (info.code == "4296") { // Soudan - deprecated @@ -3180,9 +3180,10 @@ TEST(factory, getCRSInfoList) { EXPECT_EQ(info.south_lat_degree, 0.0); EXPECT_EQ(info.east_lon_degree, 6.0); EXPECT_EQ(info.north_lat_degree, 84.0); - EXPECT_EQ(info.areaName, "World - N hemisphere - 0\xC2\xB0" - "E to 6\xC2\xB0" - "E - by country"); + EXPECT_TRUE(info.areaName.find("Between 0\xC2\xB0" + "E and 6\xC2\xB0" + "E, northern hemisphere") == 0) + << info.areaName; EXPECT_EQ(info.projectionMethodName, "Transverse Mercator"); found32631 = true; } else if (info.code == "3855") { -- cgit v1.2.3 From ff9a386c72afb277aa79b86c7efb54e9843e810a Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 6 Oct 2020 17:08:29 +0200 Subject: Database: import datum ensemble accuracy and members (but do not use them) --- test/unit/test_factory.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 37f546f1..1d070a43 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -1456,7 +1456,7 @@ class FactoryWithTmpDatabase : public ::testing::Test { ASSERT_TRUE( execute("INSERT INTO geodetic_datum " "VALUES('EPSG','6326','World Geodetic System 1984',''," - "'EPSG','7030','EPSG','8901',NULL,NULL,0);")) + "'EPSG','7030','EPSG','8901',NULL,NULL,NULL,0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," "'geodetic_datum_6326_usage','geodetic_datum'," @@ -1464,7 +1464,7 @@ class FactoryWithTmpDatabase : public ::testing::Test { << last_error(); ASSERT_TRUE( execute("INSERT INTO vertical_datum VALUES('EPSG','1027','EGM2008 " - "geoid',NULL,NULL,0);")) + "geoid',NULL,NULL,NULL,0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," "'vertical_datum_1027_usage','vertical_datum'," @@ -1663,7 +1663,8 @@ class FactoryWithTmpDatabase : public ::testing::Test { "VALUES('FOO','" + val + "','" + val + "',''," - "'EPSG','7030','EPSG','8901',NULL,NULL,0);")) + "'EPSG','7030','EPSG','8901'," + "NULL,NULL,NULL,0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO usage VALUES('FOO'," "'geodetic_datum_" + -- cgit v1.2.3 From b5369cc79eccc625419d37bb97a5361731fd8f0f Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 6 Oct 2020 22:15:31 +0200 Subject: Add a AuthorityFactory::createDatumEnsemble() method, and make it inherit from ObjectUsage as mandated by ISO 19111:2019 --- test/unit/test_factory.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 1d070a43..6b87fba6 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -316,6 +316,48 @@ TEST(factory, AuthorityFactory_createDatum) { // --------------------------------------------------------------------------- +TEST(factory, AuthorityFactory_createDatumEnsembleGeodetic) { + auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + EXPECT_THROW(factory->createDatumEnsemble("-1"), + NoSuchAuthorityCodeException); + EXPECT_THROW(factory->createDatumEnsemble("6326", "vertical_datum"), + NoSuchAuthorityCodeException); + auto ensemble = factory->createDatumEnsemble("6326"); + EXPECT_EQ(ensemble->nameStr(), "World Geodetic System 1984 ensemble"); + ASSERT_EQ(ensemble->identifiers().size(), 1U); + EXPECT_EQ(ensemble->identifiers()[0]->code(), "6326"); + EXPECT_EQ(*(ensemble->identifiers()[0]->codeSpace()), "EPSG"); + EXPECT_EQ(ensemble->datums().size(), 6U); + EXPECT_EQ(ensemble->positionalAccuracy()->value(), "2.0"); + ASSERT_TRUE(!ensemble->domains().empty()); + auto domain = ensemble->domains()[0]; + auto extent = domain->domainOfValidity(); + ASSERT_TRUE(extent != nullptr); + EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("1262").get())); +} + +// --------------------------------------------------------------------------- + +TEST(factory, AuthorityFactory_createDatumEnsembleVertical) { + auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + EXPECT_THROW(factory->createDatumEnsemble("1288", "geodetic_datum"), + NoSuchAuthorityCodeException); + auto ensemble = factory->createDatumEnsemble("1288"); + EXPECT_EQ(ensemble->nameStr(), "British Isles height ensemble"); + ASSERT_EQ(ensemble->identifiers().size(), 1U); + EXPECT_EQ(ensemble->identifiers()[0]->code(), "1288"); + EXPECT_EQ(*(ensemble->identifiers()[0]->codeSpace()), "EPSG"); + EXPECT_EQ(ensemble->datums().size(), 9U); + EXPECT_EQ(ensemble->positionalAccuracy()->value(), "0.4"); + ASSERT_TRUE(!ensemble->domains().empty()); + auto domain = ensemble->domains()[0]; + auto extent = domain->domainOfValidity(); + ASSERT_TRUE(extent != nullptr); + EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("4606").get())); +} + +// --------------------------------------------------------------------------- + TEST(factory, AuthorityFactory_createCoordinateSystem_ellipsoidal_2_axis) { auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); EXPECT_THROW(factory->createCoordinateSystem("-1"), -- cgit v1.2.3 From 9dc3bf503b0455526a4d180930f8414621ea6187 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 6 Oct 2020 23:48:46 +0200 Subject: Add DatumEnsemble::asDatum() and use it in exportToWkt() to allow exporting DatumEnsemble to WKT < 2019. --- test/unit/test_factory.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 6b87fba6..b17a3077 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -334,6 +334,24 @@ TEST(factory, AuthorityFactory_createDatumEnsembleGeodetic) { auto extent = domain->domainOfValidity(); ASSERT_TRUE(extent != nullptr); EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("1262").get())); + + { + // Without using db + auto datum = ensemble->asDatum(nullptr); + EXPECT_EQ(datum->nameStr(), "World Geodetic System 1984"); + auto grf = dynamic_cast(datum.get()); + ASSERT_TRUE(grf != nullptr); + EXPECT_TRUE(grf->isEquivalentTo(factory->createDatum("6326").get())); + } + + { + // Using db + auto datum = ensemble->asDatum(DatabaseContext::create()); + EXPECT_EQ(datum->nameStr(), "World Geodetic System 1984"); + auto grf = dynamic_cast(datum.get()); + ASSERT_TRUE(grf != nullptr); + EXPECT_TRUE(grf->isEquivalentTo(factory->createDatum("6326").get())); + } } // --------------------------------------------------------------------------- @@ -354,6 +372,22 @@ TEST(factory, AuthorityFactory_createDatumEnsembleVertical) { auto extent = domain->domainOfValidity(); ASSERT_TRUE(extent != nullptr); EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("4606").get())); + + { + // Without using db + auto datum = ensemble->asDatum(nullptr); + auto vrf = dynamic_cast(datum.get()); + ASSERT_TRUE(vrf != nullptr); + EXPECT_TRUE(vrf->isEquivalentTo(factory->createDatum("1288").get())); + } + + { + // Using db + auto datum = ensemble->asDatum(DatabaseContext::create()); + auto vrf = dynamic_cast(datum.get()); + ASSERT_TRUE(vrf != nullptr); + EXPECT_TRUE(vrf->isEquivalentTo(factory->createDatum("1288").get())); + } } // --------------------------------------------------------------------------- -- cgit v1.2.3 From ad80dc88a70032e1d96812b574b2d4d22e223394 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 11 Oct 2020 19:50:09 +0200 Subject: Database: add a frame_reference_epoch column in vertical_datum to be able to handle dynamic vertical datums, and instanciate them properly from database --- test/unit/test_factory.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index b17a3077..366e3d9b 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -301,6 +301,18 @@ TEST(factory, AuthorityFactory_createVerticalDatum) { auto extent = domain->domainOfValidity(); ASSERT_TRUE(extent != nullptr); EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("1262").get())); + EXPECT_TRUE(vrf->publicationDate().has_value()); + EXPECT_EQ(vrf->publicationDate()->toString(), "2008-01-01"); +} + +// --------------------------------------------------------------------------- + +TEST(factory, AuthorityFactory_createDynamicVerticalDatum) { + auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + auto grf = factory->createVerticalDatum("1096"); // Norway Normal Null 2000 + auto dvrf = nn_dynamic_pointer_cast(grf); + ASSERT_TRUE(dvrf != nullptr); + EXPECT_EQ(dvrf->frameReferenceEpoch().value(), 2000.0); } // --------------------------------------------------------------------------- @@ -1540,7 +1552,7 @@ class FactoryWithTmpDatabase : public ::testing::Test { << last_error(); ASSERT_TRUE( execute("INSERT INTO vertical_datum VALUES('EPSG','1027','EGM2008 " - "geoid',NULL,NULL,NULL,0);")) + "geoid',NULL,NULL,NULL,NULL,0);")) << last_error(); ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," "'vertical_datum_1027_usage','vertical_datum'," -- cgit v1.2.3 From d1a0d95da549f7d32bcd8be408afe1fca62a6fb2 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 11 Oct 2020 20:01:29 +0200 Subject: Database query: add AuthorityFactory::ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME and DYNAMIC_VERTICAL_REFERENCE_FRAME, and make corresponding C API work --- test/unit/test_factory.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'test/unit/test_factory.cpp') diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 366e3d9b..2a9d2bd2 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -1337,11 +1337,29 @@ TEST(factory, AuthorityFactory_getAuthorityCodes) { ASSERT_TRUE(!setGeodeticDatum.empty()); factory->createGeodeticDatum(*(setGeodeticDatum.begin())); + auto setDynamicGeodeticDatum = factory->getAuthorityCodes( + AuthorityFactory::ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME); + ASSERT_TRUE(!setDynamicGeodeticDatum.empty()); + auto dgrf = + factory->createGeodeticDatum(*(setDynamicGeodeticDatum.begin())); + EXPECT_TRUE(dynamic_cast(dgrf.get()) != + nullptr); + EXPECT_LT(setDynamicGeodeticDatum.size(), setGeodeticDatum.size()); + auto setVerticalDatum = factory->getAuthorityCodes( AuthorityFactory::ObjectType::VERTICAL_REFERENCE_FRAME); ASSERT_TRUE(!setVerticalDatum.empty()); factory->createVerticalDatum(*(setVerticalDatum.begin())); + auto setDynamicVerticalDatum = factory->getAuthorityCodes( + AuthorityFactory::ObjectType::DYNAMIC_VERTICAL_REFERENCE_FRAME); + ASSERT_TRUE(!setDynamicVerticalDatum.empty()); + auto dvrf = + factory->createVerticalDatum(*(setDynamicVerticalDatum.begin())); + EXPECT_TRUE(dynamic_cast(dvrf.get()) != + nullptr); + EXPECT_LT(setDynamicVerticalDatum.size(), setVerticalDatum.size()); + std::set setMerged; for (const auto &v : setGeodeticDatum) { setMerged.insert(v); @@ -3128,12 +3146,34 @@ TEST(factory, createObjectsFromName) { .size(), 1U); + // Dynamic Geodetic datum + EXPECT_EQ(factoryEPSG + ->createObjectsFromName( + "International Terrestrial Reference Frame 2008", + {AuthorityFactory::ObjectType:: + DYNAMIC_GEODETIC_REFERENCE_FRAME}, + false, 2) + .size(), + 1U); + + // Dynamic Vertical datum + EXPECT_EQ( + factoryEPSG + ->createObjectsFromName("Norway Normal Null 2000", + {AuthorityFactory::ObjectType:: + DYNAMIC_VERTICAL_REFERENCE_FRAME}, + false, 2) + .size(), + 1U); + const auto types = std::vector{ AuthorityFactory::ObjectType::PRIME_MERIDIAN, AuthorityFactory::ObjectType::ELLIPSOID, AuthorityFactory::ObjectType::DATUM, AuthorityFactory::ObjectType::GEODETIC_REFERENCE_FRAME, + AuthorityFactory::ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME, AuthorityFactory::ObjectType::VERTICAL_REFERENCE_FRAME, + AuthorityFactory::ObjectType::DYNAMIC_VERTICAL_REFERENCE_FRAME, AuthorityFactory::ObjectType::CRS, AuthorityFactory::ObjectType::GEODETIC_CRS, AuthorityFactory::ObjectType::GEOCENTRIC_CRS, -- cgit v1.2.3