LCOV - code coverage report
Current view: top level - autotest/cpp - test_osr.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 351 351 100.0 %
Date: 2024-05-13 13:33:37 Functions: 59 59 100.0 %

          Line data    Source code
       1             : ///////////////////////////////////////////////////////////////////////////////
       2             : //
       3             : // Project:  C++ Test Suite for GDAL/OGR
       4             : // Purpose:  OGR Spatial Reference general features test.
       5             : // Author:   Mateusz Loskot <mateusz@loskot.net>
       6             : //
       7             : ///////////////////////////////////////////////////////////////////////////////
       8             : // Copyright (c) 2006, Mateusz Loskot <mateusz@loskot.net>
       9             : /*
      10             :  * Permission is hereby granted, free of charge, to any person obtaining a
      11             :  * copy of this software and associated documentation files (the "Software"),
      12             :  * to deal in the Software without restriction, including without limitation
      13             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      14             :  * and/or sell copies of the Software, and to permit persons to whom the
      15             :  * Software is furnished to do so, subject to the following conditions:
      16             :  *
      17             :  * The above copyright notice and this permission notice shall be included
      18             :  * in all copies or substantial portions of the Software.
      19             :  *
      20             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      21             :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      22             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      23             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      24             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      25             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      26             :  * DEALINGS IN THE SOFTWARE.
      27             :  ****************************************************************************/
      28             : 
      29             : #include "gdal_unit_test.h"
      30             : 
      31             : #include "cpl_string.h"
      32             : #include "ogr_srs_api.h"
      33             : #include "ogr_spatialref.h"
      34             : 
      35             : #include <algorithm>
      36             : #include <cmath>
      37             : #include <string>
      38             : 
      39             : #include "gtest_include.h"
      40             : 
      41             : namespace
      42             : {
      43             : 
      44             : // Common fixture with test data
      45             : struct test_osr : public ::testing::Test
      46             : {
      47             :     OGRErr err_ = OGRERR_NONE;
      48             :     OGRSpatialReferenceH srs_ = nullptr;
      49             : 
      50          14 :     void SetUp() override
      51             :     {
      52          14 :         srs_ = OSRNewSpatialReference(nullptr);
      53          14 :         ASSERT_TRUE(nullptr != srs_);
      54             :     }
      55             : 
      56          14 :     void TearDown() override
      57             :     {
      58          14 :         OSRDestroySpatialReference(srs_);
      59          14 :         srs_ = nullptr;
      60          14 :     }
      61             : };
      62             : 
      63             : // Test UTM WGS84 coordinate system and its various items
      64           4 : TEST_F(test_osr, UTM_WGS84)
      65             : {
      66           1 :     err_ = OSRSetUTM(srs_, 11, TRUE);
      67           1 :     ASSERT_EQ(err_, OGRERR_NONE);
      68             : 
      69           1 :     err_ = OSRSetWellKnownGeogCS(srs_, "WGS84");
      70           1 :     ASSERT_EQ(err_, OGRERR_NONE);
      71             : 
      72           1 :     double val = 0;
      73             : 
      74           1 :     val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_);
      75           1 :     EXPECT_NEAR(val, -117.0, .00000000000010);
      76             : 
      77           1 :     val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_);
      78           1 :     EXPECT_NEAR(val, 0.0, .00000000000010);
      79             : 
      80           1 :     val = OSRGetProjParm(srs_, SRS_PP_SCALE_FACTOR, -1111, &err_);
      81           1 :     EXPECT_NEAR(val, 0.9996, .00000000000010);
      82             : 
      83           1 :     val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_);
      84           1 :     EXPECT_NEAR(val, 500000, .00000000000010);
      85             : 
      86           1 :     val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_);
      87           1 :     EXPECT_NEAR(val, 0.0, .00000000000010);
      88             : 
      89           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "GEOGCS"), "EPSG");
      90           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "GEOGCS"), "4326");
      91             : 
      92           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "DATUM"), "EPSG");
      93           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "DATUM"), "6326");
      94             : }
      95             : 
      96             : // Simple default NAD83 State Plane zone
      97           4 : TEST_F(test_osr, NAD83_State_Plane)
      98             : {
      99             :     // California III NAD83
     100           1 :     OSRSetStatePlane(srs_, 403, 1);
     101             : 
     102           1 :     double val = 0;
     103             : 
     104           1 :     val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_);
     105           1 :     EXPECT_NEAR(val, 38.43333333333333, 1e-12);
     106             : 
     107           1 :     val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_);
     108           1 :     EXPECT_NEAR(val, 37.06666666666667, 1e-12);
     109             : 
     110           1 :     val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_);
     111           1 :     EXPECT_NEAR(val, 36.5, 1e-12);
     112             : 
     113           1 :     val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_);
     114           1 :     EXPECT_NEAR(val, -120.5, 1e-12);
     115             : 
     116           1 :     val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_);
     117           1 :     EXPECT_NEAR(val, 2000000.0, 1e-12);
     118             : 
     119           1 :     val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_);
     120           1 :     EXPECT_NEAR(val, 500000.0, 1e-12);
     121             : 
     122           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "GEOGCS"), "EPSG");
     123           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "GEOGCS"), "4269");
     124             : 
     125           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "DATUM"), "EPSG");
     126           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "DATUM"), "6269");
     127             : 
     128           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "PROJCS"), "EPSG");
     129           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "PROJCS"), "26943");
     130             : 
     131           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "PROJCS|UNIT"), "EPSG");
     132           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "PROJCS|UNIT"), "9001");
     133           1 : }
     134             : 
     135             : // NAD83 State Plane zone, but overridden to be in Feet
     136           4 : TEST_F(test_osr, NAD83_State_Plane_Feet)
     137             : {
     138             :     // California III NAD83 (feet)
     139           1 :     OSRSetStatePlaneWithUnits(srs_, 403, 1, "Foot", 0.3048006096012192);
     140             : 
     141           1 :     double val = 0;
     142             : 
     143           1 :     val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_);
     144           1 :     EXPECT_NEAR(val, 38.43333333333333, 1e-12);
     145             : 
     146           1 :     val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_);
     147           1 :     EXPECT_NEAR(val, 37.06666666666667, 1e-12);
     148             : 
     149           1 :     val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_);
     150           1 :     EXPECT_NEAR(val, 36.5, 1e-12);
     151             : 
     152           1 :     val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_);
     153           1 :     EXPECT_NEAR(val, -120.5, 1e-12);
     154             : 
     155           1 :     val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_);
     156           1 :     EXPECT_NEAR(val, 6561666.666666667, 1e-12);
     157             : 
     158           1 :     val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_);
     159           1 :     EXPECT_NEAR(val, 1640416.666666667, 1e-12);
     160             : 
     161           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "GEOGCS"), "EPSG");
     162           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "GEOGCS"), "4269");
     163             : 
     164           1 :     EXPECT_STREQ(OSRGetAuthorityName(srs_, "DATUM"), "EPSG");
     165           1 :     EXPECT_STREQ(OSRGetAuthorityCode(srs_, "DATUM"), "6269");
     166             : 
     167           1 :     EXPECT_TRUE(nullptr == OSRGetAuthorityName(srs_, "PROJCS"));
     168           1 :     EXPECT_TRUE(nullptr == OSRGetAuthorityCode(srs_, "PROJCS|UNIT"));
     169             : 
     170           1 :     char *unitsName = nullptr;
     171           1 :     val = OSRGetLinearUnits(srs_, &unitsName);
     172           1 :     ASSERT_TRUE(nullptr != unitsName);
     173           1 :     EXPECT_STREQ(unitsName, "Foot");
     174             : }
     175             : 
     176             : // Translate a coordinate system with NAD shift into to PROJ.4 and back.
     177             : // Also, verify that the TOWGS84 parameters are preserved.
     178           4 : TEST_F(test_osr, NAD_shift)
     179             : {
     180           1 :     err_ = OSRSetGS(srs_, -117.0, 100000.0, 100000);
     181           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     182             : 
     183           1 :     err_ = OSRSetGeogCS(srs_, "Test GCS", "Test Datum", "WGS84",
     184             :                         SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING, nullptr,
     185             :                         0, nullptr, 0);
     186           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     187             : 
     188           1 :     err_ = OSRSetTOWGS84(srs_, 1, 2, 3, 0, 0, 0, 0);
     189           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     190             : 
     191           1 :     const int coeffSize = 7;
     192           1 :     double coeff[coeffSize] = {0};
     193           1 :     const double expect[coeffSize] = {1, 2, 3, 0, 0, 0, 0};
     194             : 
     195           1 :     err_ = OSRGetTOWGS84(srs_, coeff, 7);
     196           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     197           1 :     EXPECT_TRUE(std::equal(coeff, coeff + coeffSize, expect));
     198           1 :     OSRSetLinearUnits(srs_, "Metre", 1);
     199             : 
     200           1 :     char *proj4 = nullptr;
     201           1 :     err_ = OSRExportToProj4(srs_, &proj4);
     202           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     203             : 
     204           1 :     OGRSpatialReferenceH srs2 = nullptr;
     205           1 :     srs2 = OSRNewSpatialReference(nullptr);
     206             : 
     207           1 :     err_ = OSRImportFromProj4(srs2, proj4);
     208           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     209             : 
     210           1 :     err_ = OSRGetTOWGS84(srs2, coeff, 7);
     211           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     212           1 :     EXPECT_TRUE(std::equal(coeff, coeff + coeffSize, expect));
     213             : 
     214           1 :     OSRDestroySpatialReference(srs2);
     215           1 :     CPLFree(proj4);
     216           1 : }
     217             : 
     218             : // Test URN support for OGC:CRS84
     219           4 : TEST_F(test_osr, URN_OGC_CRS84)
     220             : {
     221           1 :     err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:OGC:1.3:CRS84");
     222           1 :     ASSERT_EQ(err_, OGRERR_NONE);
     223             : 
     224           1 :     char *wkt1 = nullptr;
     225           1 :     err_ = OSRExportToWkt(srs_, &wkt1);
     226           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     227           1 :     EXPECT_TRUE(nullptr != wkt1);
     228             : 
     229           1 :     CPLFree(wkt1);
     230             : }
     231             : 
     232             : // Test URN support for EPSG
     233           4 : TEST_F(test_osr, URN_EPSG)
     234             : {
     235           1 :     err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:EPSG::4326");
     236           1 :     ASSERT_EQ(err_, OGRERR_NONE);
     237             : 
     238           1 :     char *wkt1 = nullptr;
     239           1 :     err_ = OSRExportToWkt(srs_, &wkt1);
     240           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     241           1 :     EXPECT_TRUE(nullptr != wkt1);
     242             : 
     243           1 :     err_ = OSRSetFromUserInput(srs_, "EPSGA:4326");
     244           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     245             : 
     246           1 :     char *wkt2 = nullptr;
     247           1 :     err_ = OSRExportToWkt(srs_, &wkt2);
     248           1 :     EXPECT_EQ(err_, OGRERR_NONE);
     249           1 :     EXPECT_TRUE(nullptr != wkt2);
     250             : 
     251           1 :     EXPECT_STREQ(wkt1, wkt2);
     252           1 :     CPLFree(wkt1);
     253           1 :     CPLFree(wkt2);
     254             : }
     255             : 
     256             : // Test URN support for auto projection
     257           4 : TEST_F(test_osr, URN_AUTO)
     258             : {
     259           1 :     err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:OGC::AUTO42001:-117:33");
     260           1 :     ASSERT_EQ(err_, OGRERR_NONE);
     261             : 
     262           2 :     OGRSpatialReference oSRS;
     263           1 :     oSRS.importFromEPSG(32611);
     264             : 
     265           1 :     EXPECT_TRUE(oSRS.IsSame(OGRSpatialReference::FromHandle(srs_)));
     266             : }
     267             : 
     268             : // Test StripTOWGS84IfKnownDatum
     269           4 : TEST_F(test_osr, StripTOWGS84IfKnownDatum)
     270             : {
     271             :     // Not a boundCRS
     272             :     {
     273           2 :         OGRSpatialReference oSRS;
     274           1 :         oSRS.importFromEPSG(4326);
     275           1 :         EXPECT_TRUE(!oSRS.StripTOWGS84IfKnownDatum());
     276             :     }
     277             :     // Custom boundCRS --> do not strip TOWGS84
     278             :     {
     279           2 :         OGRSpatialReference oSRS;
     280           1 :         oSRS.SetFromUserInput(
     281             :             "+proj=longlat +ellps=GRS80 +towgs84=1,2,3,4,5,6,7");
     282           1 :         EXPECT_TRUE(!oSRS.StripTOWGS84IfKnownDatum());
     283           1 :         double vals[7] = {0};
     284           1 :         EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) == OGRERR_NONE);
     285             :     }
     286             :     // BoundCRS whose base CRS has a known code --> strip TOWGS84
     287             :     {
     288           2 :         OGRSpatialReference oSRS;
     289           1 :         oSRS.importFromEPSG(4326);
     290           1 :         oSRS.SetTOWGS84(1, 2, 3, 4, 5, 6, 7);
     291           1 :         EXPECT_TRUE(oSRS.StripTOWGS84IfKnownDatum());
     292           1 :         double vals[7] = {0};
     293           1 :         EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) != OGRERR_NONE);
     294             :     }
     295             :     // BoundCRS whose datum code is known --> strip TOWGS84
     296             :     {
     297           2 :         OGRSpatialReference oSRS;
     298           1 :         oSRS.SetFromUserInput("GEOGCS[\"bar\","
     299             :                               "DATUM[\"foo\","
     300             :                               "SPHEROID[\"WGS 84\",6378137,298.257223563],"
     301             :                               "TOWGS84[1,2,3,4,5,6,7],"
     302             :                               "AUTHORITY[\"FOO\",\"1\"]],"
     303             :                               "PRIMEM[\"Greenwich\",0],"
     304             :                               "UNIT[\"degree\",0.0174532925199433]]");
     305           1 :         EXPECT_TRUE(oSRS.StripTOWGS84IfKnownDatum());
     306           1 :         double vals[7] = {0};
     307           1 :         EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) != OGRERR_NONE);
     308             :     }
     309             :     // BoundCRS whose datum name is known --> strip TOWGS84
     310             :     {
     311           2 :         OGRSpatialReference oSRS;
     312           1 :         oSRS.SetFromUserInput("GEOGCS[\"WGS 84\","
     313             :                               "DATUM[\"WGS_1984\","
     314             :                               "SPHEROID[\"WGS 84\",6378137,298.257223563],"
     315             :                               "TOWGS84[1,2,3,4,5,6,7]],"
     316             :                               "PRIMEM[\"Greenwich\",0],"
     317             :                               "UNIT[\"degree\",0.0174532925199433]]");
     318           1 :         EXPECT_TRUE(oSRS.StripTOWGS84IfKnownDatum());
     319           1 :         double vals[7] = {0};
     320           1 :         EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) != OGRERR_NONE);
     321             :     }
     322             :     // BoundCRS whose datum name is unknown --> do not strip TOWGS84
     323             :     {
     324           2 :         OGRSpatialReference oSRS;
     325           1 :         oSRS.SetFromUserInput("GEOGCS[\"WGS 84\","
     326             :                               "DATUM[\"i am unknown\","
     327             :                               "SPHEROID[\"WGS 84\",6378137,298.257223563],"
     328             :                               "TOWGS84[1,2,3,4,5,6,7]],"
     329             :                               "PRIMEM[\"Greenwich\",0],"
     330             :                               "UNIT[\"degree\",0.0174532925199433]]");
     331           1 :         EXPECT_TRUE(!oSRS.StripTOWGS84IfKnownDatum());
     332           1 :         double vals[7] = {0};
     333           1 :         EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) == OGRERR_NONE);
     334             :     }
     335           1 : }
     336             : 
     337             : // Test GetEPSGGeogCS
     338           4 : TEST_F(test_osr, GetEPSGGeogCS)
     339             : {
     340             :     // When export to WKT1 is not possible
     341           2 :     OGRSpatialReference oSRS;
     342           1 :     oSRS.SetFromUserInput(
     343             :         "PROJCRS[\"World_Vertical_Perspective\",\n"
     344             :         "    BASEGEOGCRS[\"WGS 84\",\n"
     345             :         "        DATUM[\"World Geodetic System 1984\",\n"
     346             :         "            ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n"
     347             :         "                LENGTHUNIT[\"metre\",1]]],\n"
     348             :         "        PRIMEM[\"Greenwich\",0,\n"
     349             :         "            ANGLEUNIT[\"Degree\",0.0174532925199433]]],\n"
     350             :         "    CONVERSION[\"World_Vertical_Perspective\",\n"
     351             :         "        METHOD[\"Vertical Perspective\",\n"
     352             :         "            ID[\"EPSG\",9838]],\n"
     353             :         "        PARAMETER[\"Latitude of topocentric origin\",0,\n"
     354             :         "            ANGLEUNIT[\"Degree\",0.0174532925199433],\n"
     355             :         "            ID[\"EPSG\",8834]],\n"
     356             :         "        PARAMETER[\"Longitude of topocentric origin\",0,\n"
     357             :         "            ANGLEUNIT[\"Degree\",0.0174532925199433],\n"
     358             :         "            ID[\"EPSG\",8835]],\n"
     359             :         "        PARAMETER[\"Viewpoint height\",35800000,\n"
     360             :         "            LENGTHUNIT[\"metre\",1],\n"
     361             :         "            ID[\"EPSG\",8840]]],\n"
     362             :         "    CS[Cartesian,2],\n"
     363             :         "        AXIS[\"(E)\",east,\n"
     364             :         "            ORDER[1],\n"
     365             :         "            LENGTHUNIT[\"metre\",1]],\n"
     366             :         "        AXIS[\"(N)\",north,\n"
     367             :         "            ORDER[2],\n"
     368             :         "            LENGTHUNIT[\"metre\",1]],\n"
     369             :         "    USAGE[\n"
     370             :         "        SCOPE[\"Not known.\"],\n"
     371             :         "        AREA[\"World.\"],\n"
     372             :         "        BBOX[-90,-180,90,180]],\n"
     373             :         "    ID[\"ESRI\",54049]]");
     374           1 :     EXPECT_EQ(oSRS.GetEPSGGeogCS(), 4326);
     375           1 : }
     376             : 
     377             : // Test GetOGCURN
     378           4 : TEST_F(test_osr, GetOGCURN)
     379             : {
     380             :     {
     381           2 :         OGRSpatialReference oSRS;
     382           1 :         char *pszRet = oSRS.GetOGCURN();
     383           1 :         EXPECT_TRUE(pszRet == nullptr);
     384           1 :         CPLFree(pszRet);
     385             :     }
     386             :     {
     387           2 :         OGRSpatialReference oSRS;
     388           1 :         oSRS.SetFromUserInput("+proj=longlat");
     389           1 :         char *pszRet = oSRS.GetOGCURN();
     390           1 :         EXPECT_TRUE(pszRet == nullptr);
     391           1 :         CPLFree(pszRet);
     392             :     }
     393             : 
     394             :     {
     395           2 :         OGRSpatialReference oSRS;
     396           1 :         oSRS.importFromEPSG(32631);
     397           1 :         char *pszRet = oSRS.GetOGCURN();
     398           1 :         EXPECT_TRUE(pszRet != nullptr);
     399           1 :         if (pszRet)
     400             :         {
     401           1 :             EXPECT_STREQ(pszRet, "urn:ogc:def:crs:EPSG::32631");
     402             :         }
     403           1 :         CPLFree(pszRet);
     404             :     }
     405             : 
     406             :     {
     407           2 :         OGRSpatialReference oSRS;
     408           1 :         oSRS.SetFromUserInput("EPSG:32631+5773");
     409           1 :         char *pszRet = oSRS.GetOGCURN();
     410           1 :         EXPECT_TRUE(pszRet != nullptr);
     411           1 :         if (pszRet)
     412             :         {
     413           1 :             EXPECT_STREQ(pszRet,
     414             :                          "urn:ogc:def:crs,crs:EPSG::32631,crs:EPSG::5773");
     415             :         }
     416           1 :         CPLFree(pszRet);
     417             :     }
     418           1 : }
     419             : 
     420             : // Test constructors and assignment operators
     421           4 : TEST_F(test_osr, constructors_assignment_operators)
     422             : {
     423           1 :     OGRSpatialReference oSRS;
     424           1 :     oSRS.importFromEPSG(32631);
     425             : 
     426           1 :     OGRSpatialReference oSRS2(oSRS);
     427           1 :     ASSERT_TRUE(oSRS2.GetAuthorityCode(nullptr) != nullptr);
     428             : 
     429           1 :     OGRSpatialReference oSRS3;
     430           1 :     OGRSpatialReference &oSRSRef(oSRS);
     431           1 :     oSRS = oSRSRef;
     432           1 :     ASSERT_TRUE(oSRS.GetAuthorityCode(nullptr) != nullptr);
     433           1 :     oSRS3 = oSRS;
     434           1 :     ASSERT_TRUE(oSRS3.GetAuthorityCode(nullptr) != nullptr);
     435             : 
     436           1 :     OGRSpatialReference oSRS4(std::move(oSRS));
     437           1 :     ASSERT_TRUE(oSRS4.GetAuthorityCode(nullptr) != nullptr);
     438             : 
     439           1 :     OGRSpatialReference oSRS5;
     440           1 :     OGRSpatialReference &oSRS4Ref(oSRS4);
     441           1 :     oSRS4 = std::move(oSRS4Ref);
     442           1 :     ASSERT_TRUE(oSRS4.GetAuthorityCode(nullptr) != nullptr);
     443           1 :     oSRS5 = std::move(oSRS4);
     444           1 :     ASSERT_TRUE(oSRS5.GetAuthorityCode(nullptr) != nullptr);
     445             : }
     446             : 
     447          18 : static int GetEPSGCode(OGRSpatialReference &oSRS)
     448             : {
     449          18 :     int nEPSG = 0;
     450          18 :     auto pszEPSG = oSRS.GetAuthorityCode("PROJCS");
     451          18 :     if (pszEPSG == nullptr)
     452             :     {
     453           2 :         pszEPSG = oSRS.GetAuthorityCode("GEOGCS");
     454             :     }
     455          18 :     if (pszEPSG == nullptr)
     456             :     {
     457           2 :         pszEPSG = oSRS.GetAuthorityCode("VERT_CS");
     458             :     }
     459          18 :     if (pszEPSG != nullptr)
     460             :     {
     461          17 :         nEPSG = atoi(pszEPSG);
     462             :     }
     463          18 :     return nEPSG;
     464             : }
     465             : 
     466             : // Test exportVertCSToPanorama
     467           4 : TEST_F(test_osr, exportVertCSToPanorama)
     468             : {
     469           2 :     OGRSpatialReference oSRS;
     470           1 :     oSRS.importFromEPSG(28407);
     471             : 
     472           2 :     OGRSpatialReference oVertSRS;
     473           1 :     oVertSRS.importFromEPSG(5705);
     474           1 :     EXPECT_TRUE(oVertSRS.IsVertical() == TRUE);
     475           1 :     EXPECT_STRNE(oVertSRS.GetAttrValue("VERT_CS"), "");
     476           1 :     EXPECT_STRNE(oVertSRS.GetAttrValue("VERT_DATUM"), "");
     477           1 :     EXPECT_EQ(GetEPSGCode(oVertSRS), 5705);
     478             : 
     479           1 :     oSRS.SetVertCS(oVertSRS.GetAttrValue("VERT_CS"),
     480             :                    oVertSRS.GetAttrValue("VERT_DATUM"));
     481             : 
     482           1 :     int nVertID = 0;
     483           1 :     oSRS.exportVertCSToPanorama(&nVertID);
     484           1 :     EXPECT_EQ(nVertID, 25);
     485           1 : }
     486             : 
     487             : // Test importFromPanorama
     488           4 : TEST_F(test_osr, importFromPanorama)
     489             : {
     490           2 :     OGRSpatialReference oSRS;
     491           1 :     oSRS.importFromPanorama(35, 0, 45, nullptr);
     492           1 :     EXPECT_EQ(GetEPSGCode(oSRS), 3857);
     493             : 
     494           1 :     oSRS.importFromPanorama(35, 0, 9, nullptr);
     495           1 :     EXPECT_EQ(GetEPSGCode(oSRS), 3395);
     496             : 
     497           1 :     constexpr double TO_RADIANS = 0.017453292519943295769;
     498             :     {
     499             :         // WGS 84 / UTM zone 1
     500           1 :         double adfPrjParams[8] = {0.0,    0.0,      0.0, -177 * TO_RADIANS,
     501             :                                   0.9996, 500000.0, 0.0, 0.0};
     502           1 :         oSRS.importFromPanorama(17, 2, 9, adfPrjParams);
     503           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 32601);
     504             : 
     505           1 :         oSRS.importFromPanorama(17, 2, 9, adfPrjParams, FALSE);
     506           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 32701);
     507             :     }
     508             :     {
     509             :         // WGS 84 / UTM zone 37
     510           1 :         double adfPrjParams[8] = {0.0,    0.0,      0.0, 39 * TO_RADIANS,
     511             :                                   0.9996, 500000.0, 0.0, 0.0};
     512           1 :         oSRS.importFromPanorama(17, 2, 9, adfPrjParams);
     513           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 32637);
     514             : 
     515           1 :         oSRS.importFromPanorama(17, 2, 9, adfPrjParams, FALSE);
     516           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 32737);
     517             :     }
     518             :     {
     519             :         // Pulkovo 1942 / Gauss-Kruger zone 4
     520           1 :         double adfPrjParams[8] = {0.0, 0.0,       0.0, 21 * TO_RADIANS,
     521             :                                   1.0, 4500000.0, 0.0, 0.0};
     522           1 :         oSRS.importFromPanorama(1, 1, 1, adfPrjParams);
     523           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28404);
     524           1 :         oSRS.importFromPanorama(1, 0, 0, adfPrjParams);
     525           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28404);
     526           1 :         adfPrjParams[7] = 4;
     527           1 :         oSRS.importFromPanorama(1, 1, 1, adfPrjParams);
     528           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28404);
     529             :     }
     530             :     {
     531             :         // Pulkovo 1942 / Gauss-Kruger zone 31
     532           1 :         double adfPrjParams[8] = {0.0, 0.0,        0.0, -177 * TO_RADIANS,
     533             :                                   1.0, 31500000.0, 0.0, 0.0};
     534           1 :         oSRS.importFromPanorama(1, 1, 1, adfPrjParams);
     535           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28431);
     536           1 :         oSRS.importFromPanorama(1, 0, 0, adfPrjParams);
     537           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28431);
     538           1 :         adfPrjParams[7] = 31;
     539           1 :         oSRS.importFromPanorama(1, 1, 1, adfPrjParams);
     540           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28431);
     541             :     }
     542             :     {
     543             :         // Invalid data
     544           1 :         double adfPrjParams[8] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
     545           1 :         oSRS.importFromPanorama(0, 0, 0, adfPrjParams);
     546           1 :         EXPECT_EQ(oSRS.IsLocal(), true);
     547           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 0);
     548             :     }
     549           1 : }
     550             : 
     551             : // Test exportToPanorama
     552           4 : TEST_F(test_osr, exportToPanorama)
     553             : {
     554           1 :     constexpr double RAD = 0.017453292519943295769;
     555           1 :     constexpr double EPS = 1e-12;
     556             : 
     557             :     {
     558           2 :         OGRSpatialReference oSRS;
     559           1 :         oSRS.importFromEPSG(32601);  // WGS 84 / UTM zone 1N
     560           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 32601);
     561             : 
     562           1 :         long iProjSys = 0;
     563           1 :         long iDatum = 0;
     564           1 :         long iEllips = 0;
     565           1 :         long iZone = 0;
     566           1 :         double adfParams[7] = {0};
     567           1 :         oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams);
     568           1 :         EXPECT_EQ(iProjSys, 17);
     569           1 :         EXPECT_EQ(iDatum, 6);
     570           1 :         EXPECT_EQ(iEllips, 9);
     571           1 :         EXPECT_EQ(iZone, 1);
     572           1 :         EXPECT_NEAR(adfParams[2], 0.0, EPS);         //latitude_of_origin
     573           1 :         EXPECT_NEAR(adfParams[3], -177 * RAD, EPS);  //central_meridian
     574           1 :         EXPECT_NEAR(adfParams[4], 0.9996, EPS);      //scale_factor
     575           1 :         EXPECT_NEAR(adfParams[5], 500000, EPS);      //false_easting
     576           1 :         EXPECT_NEAR(adfParams[6], 0, EPS);           //false_northing
     577             :     }
     578             : 
     579             :     {
     580           2 :         OGRSpatialReference oSRS;
     581           1 :         oSRS.importFromEPSG(32660);  // WGS 84 / UTM zone 1N
     582           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 32660);
     583             : 
     584           1 :         long iProjSys = 0;
     585           1 :         long iDatum = 0;
     586           1 :         long iEllips = 0;
     587           1 :         long iZone = 0;
     588           1 :         double adfParams[7] = {0};
     589           1 :         oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams);
     590           1 :         EXPECT_EQ(iProjSys, 17);
     591           1 :         EXPECT_EQ(iDatum, 6);
     592           1 :         EXPECT_EQ(iEllips, 9);
     593           1 :         EXPECT_EQ(iZone, 60);
     594           1 :         EXPECT_NEAR(adfParams[2], 0.0, EPS);        //latitude_of_origin
     595           1 :         EXPECT_NEAR(adfParams[3], 177 * RAD, EPS);  //central_meridian
     596           1 :         EXPECT_NEAR(adfParams[4], 0.9996, EPS);     //scale_factor
     597           1 :         EXPECT_NEAR(adfParams[5], 500000, EPS);     //false_easting
     598           1 :         EXPECT_NEAR(adfParams[6], 0, EPS);          //false_northing
     599             :     }
     600             : 
     601             :     {
     602           2 :         OGRSpatialReference oSRS;
     603           1 :         oSRS.importFromEPSG(28404);  // Pulkovo 1942 / Gauss-Kruger zone 4
     604           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28404);
     605             : 
     606           1 :         long iProjSys = 0;
     607           1 :         long iDatum = 0;
     608           1 :         long iEllips = 0;
     609           1 :         long iZone = 0;
     610           1 :         double adfParams[7] = {0};
     611           1 :         oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams);
     612           1 :         EXPECT_EQ(iProjSys, 1);
     613           1 :         EXPECT_EQ(iDatum, 1);
     614           1 :         EXPECT_EQ(iEllips, 1);
     615           1 :         EXPECT_EQ(iZone, 4);
     616           1 :         EXPECT_NEAR(adfParams[2], 0.0, EPS);       //latitude_of_origin
     617           1 :         EXPECT_NEAR(adfParams[3], 21 * RAD, EPS);  //central_meridian
     618           1 :         EXPECT_NEAR(adfParams[4], 1.0, EPS);       //scale_factor
     619           1 :         EXPECT_NEAR(adfParams[5], 4500000, EPS);   //false_easting
     620           1 :         EXPECT_NEAR(adfParams[6], 0, EPS);         //false_northing
     621             :     }
     622             :     {
     623           2 :         OGRSpatialReference oSRS;
     624           1 :         oSRS.importFromEPSG(28431);  // Pulkovo 1942 / Gauss-Kruger zone 31
     625           1 :         EXPECT_EQ(GetEPSGCode(oSRS), 28431);
     626             : 
     627           1 :         long iProjSys = 0;
     628           1 :         long iDatum = 0;
     629           1 :         long iEllips = 0;
     630           1 :         long iZone = 0;
     631           1 :         double adfParams[7] = {0};
     632           1 :         oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams);
     633           1 :         EXPECT_EQ(iProjSys, 1);
     634           1 :         EXPECT_EQ(iDatum, 1);
     635           1 :         EXPECT_EQ(iEllips, 1);
     636           1 :         EXPECT_EQ(iZone, 31);
     637           1 :         EXPECT_NEAR(adfParams[2], 0.0, EPS);         //latitude_of_origin
     638           1 :         EXPECT_NEAR(adfParams[3], -177 * RAD, EPS);  //central_meridian
     639           1 :         EXPECT_NEAR(adfParams[4], 1.0, EPS);         //scale_factor
     640           1 :         EXPECT_NEAR(adfParams[5], 31500000, EPS);    //false_easting
     641           1 :         EXPECT_NEAR(adfParams[6], 0, EPS);           //false_northing
     642             :     }
     643           1 : }
     644             : }  // namespace

Generated by: LCOV version 1.14