/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: OGR Spatial Reference general features test. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot /* * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "gdal_unit_test.h" #include "cpl_string.h" #include "ogr_srs_api.h" #include "ogr_spatialref.h" #include #include #include #include "gtest_include.h" namespace { // Common fixture with test data struct test_osr : public ::testing::Test { OGRErr err_ = OGRERR_NONE; OGRSpatialReferenceH srs_ = nullptr; void SetUp() override { srs_ = OSRNewSpatialReference(nullptr); ASSERT_TRUE(nullptr != srs_); } void TearDown() override { OSRDestroySpatialReference(srs_); srs_ = nullptr; } }; // Test UTM WGS84 coordinate system and its various items TEST_F(test_osr, UTM_WGS84) { err_ = OSRSetUTM(srs_, 11, TRUE); ASSERT_EQ(err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_, "WGS84"); ASSERT_EQ(err_, OGRERR_NONE); double val = 0; val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_); EXPECT_NEAR(val, -117.0, .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_); EXPECT_NEAR(val, 0.0, .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_SCALE_FACTOR, -1111, &err_); EXPECT_NEAR(val, 0.9996, .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); EXPECT_NEAR(val, 500000, .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); EXPECT_NEAR(val, 0.0, .00000000000010); EXPECT_STREQ(OSRGetAuthorityName(srs_, "GEOGCS"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "GEOGCS"), "4326"); EXPECT_STREQ(OSRGetAuthorityName(srs_, "DATUM"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "DATUM"), "6326"); } // Simple default NAD83 State Plane zone TEST_F(test_osr, NAD83_State_Plane) { // California III NAD83 OSRSetStatePlane(srs_, 403, 1); double val = 0; val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_); EXPECT_NEAR(val, 38.43333333333333, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_); EXPECT_NEAR(val, 37.06666666666667, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_); EXPECT_NEAR(val, 36.5, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_); EXPECT_NEAR(val, -120.5, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); EXPECT_NEAR(val, 2000000.0, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); EXPECT_NEAR(val, 500000.0, 1e-12); EXPECT_STREQ(OSRGetAuthorityName(srs_, "GEOGCS"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "GEOGCS"), "4269"); EXPECT_STREQ(OSRGetAuthorityName(srs_, "DATUM"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "DATUM"), "6269"); EXPECT_STREQ(OSRGetAuthorityName(srs_, "PROJCS"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "PROJCS"), "26943"); EXPECT_STREQ(OSRGetAuthorityName(srs_, "PROJCS|UNIT"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "PROJCS|UNIT"), "9001"); } // NAD83 State Plane zone, but overridden to be in Feet TEST_F(test_osr, NAD83_State_Plane_Feet) { // California III NAD83 (feet) OSRSetStatePlaneWithUnits(srs_, 403, 1, "Foot", 0.3048006096012192); double val = 0; val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_); EXPECT_NEAR(val, 38.43333333333333, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_); EXPECT_NEAR(val, 37.06666666666667, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_); EXPECT_NEAR(val, 36.5, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_); EXPECT_NEAR(val, -120.5, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); EXPECT_NEAR(val, 6561666.666666667, 1e-12); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); EXPECT_NEAR(val, 1640416.666666667, 1e-12); EXPECT_STREQ(OSRGetAuthorityName(srs_, "GEOGCS"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "GEOGCS"), "4269"); EXPECT_STREQ(OSRGetAuthorityName(srs_, "DATUM"), "EPSG"); EXPECT_STREQ(OSRGetAuthorityCode(srs_, "DATUM"), "6269"); EXPECT_TRUE(nullptr == OSRGetAuthorityName(srs_, "PROJCS")); EXPECT_TRUE(nullptr == OSRGetAuthorityCode(srs_, "PROJCS|UNIT")); char *unitsName = nullptr; val = OSRGetLinearUnits(srs_, &unitsName); ASSERT_TRUE(nullptr != unitsName); EXPECT_STREQ(unitsName, "Foot"); } // Translate a coordinate system with NAD shift into to PROJ.4 and back. // Also, verify that the TOWGS84 parameters are preserved. TEST_F(test_osr, NAD_shift) { err_ = OSRSetGS(srs_, -117.0, 100000.0, 100000); EXPECT_EQ(err_, OGRERR_NONE); err_ = OSRSetGeogCS(srs_, "Test GCS", "Test Datum", "WGS84", SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING, nullptr, 0, nullptr, 0); EXPECT_EQ(err_, OGRERR_NONE); err_ = OSRSetTOWGS84(srs_, 1, 2, 3, 0, 0, 0, 0); EXPECT_EQ(err_, OGRERR_NONE); const int coeffSize = 7; double coeff[coeffSize] = {0}; const double expect[coeffSize] = {1, 2, 3, 0, 0, 0, 0}; err_ = OSRGetTOWGS84(srs_, coeff, 7); EXPECT_EQ(err_, OGRERR_NONE); EXPECT_TRUE(std::equal(coeff, coeff + coeffSize, expect)); OSRSetLinearUnits(srs_, "Metre", 1); char *proj4 = nullptr; err_ = OSRExportToProj4(srs_, &proj4); EXPECT_EQ(err_, OGRERR_NONE); OGRSpatialReferenceH srs2 = nullptr; srs2 = OSRNewSpatialReference(nullptr); err_ = OSRImportFromProj4(srs2, proj4); EXPECT_EQ(err_, OGRERR_NONE); err_ = OSRGetTOWGS84(srs2, coeff, 7); EXPECT_EQ(err_, OGRERR_NONE); EXPECT_TRUE(std::equal(coeff, coeff + coeffSize, expect)); OSRDestroySpatialReference(srs2); CPLFree(proj4); } // Test URN support for OGC:CRS84 TEST_F(test_osr, URN_OGC_CRS84) { err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:OGC:1.3:CRS84"); ASSERT_EQ(err_, OGRERR_NONE); char *wkt1 = nullptr; err_ = OSRExportToWkt(srs_, &wkt1); EXPECT_EQ(err_, OGRERR_NONE); EXPECT_TRUE(nullptr != wkt1); CPLFree(wkt1); } // Test URN support for EPSG TEST_F(test_osr, URN_EPSG) { err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:EPSG::4326"); ASSERT_EQ(err_, OGRERR_NONE); char *wkt1 = nullptr; err_ = OSRExportToWkt(srs_, &wkt1); EXPECT_EQ(err_, OGRERR_NONE); EXPECT_TRUE(nullptr != wkt1); err_ = OSRSetFromUserInput(srs_, "EPSGA:4326"); EXPECT_EQ(err_, OGRERR_NONE); char *wkt2 = nullptr; err_ = OSRExportToWkt(srs_, &wkt2); EXPECT_EQ(err_, OGRERR_NONE); EXPECT_TRUE(nullptr != wkt2); EXPECT_STREQ(wkt1, wkt2); CPLFree(wkt1); CPLFree(wkt2); } // Test URN support for auto projection TEST_F(test_osr, URN_AUTO) { err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:OGC::AUTO42001:-117:33"); ASSERT_EQ(err_, OGRERR_NONE); OGRSpatialReference oSRS; oSRS.importFromEPSG(32611); EXPECT_TRUE(oSRS.IsSame(OGRSpatialReference::FromHandle(srs_))); } // Test StripTOWGS84IfKnownDatum TEST_F(test_osr, StripTOWGS84IfKnownDatum) { // Not a boundCRS { OGRSpatialReference oSRS; oSRS.importFromEPSG(4326); EXPECT_TRUE(!oSRS.StripTOWGS84IfKnownDatum()); } // Custom boundCRS --> do not strip TOWGS84 { OGRSpatialReference oSRS; oSRS.SetFromUserInput( "+proj=longlat +ellps=GRS80 +towgs84=1,2,3,4,5,6,7"); EXPECT_TRUE(!oSRS.StripTOWGS84IfKnownDatum()); double vals[7] = {0}; EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) == OGRERR_NONE); } // BoundCRS whose base CRS has a known code --> strip TOWGS84 { OGRSpatialReference oSRS; oSRS.importFromEPSG(4326); oSRS.SetTOWGS84(1, 2, 3, 4, 5, 6, 7); EXPECT_TRUE(oSRS.StripTOWGS84IfKnownDatum()); double vals[7] = {0}; EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) != OGRERR_NONE); } // BoundCRS whose datum code is known --> strip TOWGS84 { OGRSpatialReference oSRS; oSRS.SetFromUserInput("GEOGCS[\"bar\"," "DATUM[\"foo\"," "SPHEROID[\"WGS 84\",6378137,298.257223563]," "TOWGS84[1,2,3,4,5,6,7]," "AUTHORITY[\"FOO\",\"1\"]]," "PRIMEM[\"Greenwich\",0]," "UNIT[\"degree\",0.0174532925199433]]"); EXPECT_TRUE(oSRS.StripTOWGS84IfKnownDatum()); double vals[7] = {0}; EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) != OGRERR_NONE); } // BoundCRS whose datum name is known --> strip TOWGS84 { OGRSpatialReference oSRS; oSRS.SetFromUserInput("GEOGCS[\"WGS 84\"," "DATUM[\"WGS_1984\"," "SPHEROID[\"WGS 84\",6378137,298.257223563]," "TOWGS84[1,2,3,4,5,6,7]]," "PRIMEM[\"Greenwich\",0]," "UNIT[\"degree\",0.0174532925199433]]"); EXPECT_TRUE(oSRS.StripTOWGS84IfKnownDatum()); double vals[7] = {0}; EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) != OGRERR_NONE); } // BoundCRS whose datum name is unknown --> do not strip TOWGS84 { OGRSpatialReference oSRS; oSRS.SetFromUserInput("GEOGCS[\"WGS 84\"," "DATUM[\"i am unknown\"," "SPHEROID[\"WGS 84\",6378137,298.257223563]," "TOWGS84[1,2,3,4,5,6,7]]," "PRIMEM[\"Greenwich\",0]," "UNIT[\"degree\",0.0174532925199433]]"); EXPECT_TRUE(!oSRS.StripTOWGS84IfKnownDatum()); double vals[7] = {0}; EXPECT_TRUE(oSRS.GetTOWGS84(vals, 7) == OGRERR_NONE); } } // Test GetEPSGGeogCS TEST_F(test_osr, GetEPSGGeogCS) { // When export to WKT1 is not possible OGRSpatialReference oSRS; oSRS.SetFromUserInput( "PROJCRS[\"World_Vertical_Perspective\",\n" " BASEGEOGCRS[\"WGS 84\",\n" " DATUM[\"World Geodetic System 1984\",\n" " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" " LENGTHUNIT[\"metre\",1]]],\n" " PRIMEM[\"Greenwich\",0,\n" " ANGLEUNIT[\"Degree\",0.0174532925199433]]],\n" " CONVERSION[\"World_Vertical_Perspective\",\n" " METHOD[\"Vertical Perspective\",\n" " ID[\"EPSG\",9838]],\n" " PARAMETER[\"Latitude of topocentric origin\",0,\n" " ANGLEUNIT[\"Degree\",0.0174532925199433],\n" " ID[\"EPSG\",8834]],\n" " PARAMETER[\"Longitude of topocentric origin\",0,\n" " ANGLEUNIT[\"Degree\",0.0174532925199433],\n" " ID[\"EPSG\",8835]],\n" " PARAMETER[\"Viewpoint height\",35800000,\n" " LENGTHUNIT[\"metre\",1],\n" " ID[\"EPSG\",8840]]],\n" " CS[Cartesian,2],\n" " AXIS[\"(E)\",east,\n" " ORDER[1],\n" " LENGTHUNIT[\"metre\",1]],\n" " AXIS[\"(N)\",north,\n" " ORDER[2],\n" " LENGTHUNIT[\"metre\",1]],\n" " USAGE[\n" " SCOPE[\"Not known.\"],\n" " AREA[\"World.\"],\n" " BBOX[-90,-180,90,180]],\n" " ID[\"ESRI\",54049]]"); EXPECT_EQ(oSRS.GetEPSGGeogCS(), 4326); } // Test GetOGCURN TEST_F(test_osr, GetOGCURN) { { OGRSpatialReference oSRS; char *pszRet = oSRS.GetOGCURN(); EXPECT_TRUE(pszRet == nullptr); CPLFree(pszRet); } { OGRSpatialReference oSRS; oSRS.SetFromUserInput("+proj=longlat"); char *pszRet = oSRS.GetOGCURN(); EXPECT_TRUE(pszRet == nullptr); CPLFree(pszRet); } { OGRSpatialReference oSRS; oSRS.importFromEPSG(32631); char *pszRet = oSRS.GetOGCURN(); EXPECT_TRUE(pszRet != nullptr); if (pszRet) { EXPECT_STREQ(pszRet, "urn:ogc:def:crs:EPSG::32631"); } CPLFree(pszRet); } { OGRSpatialReference oSRS; oSRS.SetFromUserInput("EPSG:32631+5773"); char *pszRet = oSRS.GetOGCURN(); EXPECT_TRUE(pszRet != nullptr); if (pszRet) { EXPECT_STREQ(pszRet, "urn:ogc:def:crs,crs:EPSG::32631,crs:EPSG::5773"); } CPLFree(pszRet); } } // Test constructors and assignment operators TEST_F(test_osr, constructors_assignment_operators) { OGRSpatialReference oSRS; oSRS.importFromEPSG(32631); OGRSpatialReference oSRS2(oSRS); ASSERT_TRUE(oSRS2.GetAuthorityCode(nullptr) != nullptr); OGRSpatialReference oSRS3; OGRSpatialReference &oSRSRef(oSRS); oSRS = oSRSRef; ASSERT_TRUE(oSRS.GetAuthorityCode(nullptr) != nullptr); oSRS3 = oSRS; ASSERT_TRUE(oSRS3.GetAuthorityCode(nullptr) != nullptr); OGRSpatialReference oSRS4(std::move(oSRS)); ASSERT_TRUE(oSRS4.GetAuthorityCode(nullptr) != nullptr); OGRSpatialReference oSRS5; OGRSpatialReference &oSRS4Ref(oSRS4); oSRS4 = std::move(oSRS4Ref); ASSERT_TRUE(oSRS4.GetAuthorityCode(nullptr) != nullptr); oSRS5 = std::move(oSRS4); ASSERT_TRUE(oSRS5.GetAuthorityCode(nullptr) != nullptr); } static int GetEPSGCode(OGRSpatialReference &oSRS) { int nEPSG = 0; auto pszEPSG = oSRS.GetAuthorityCode("PROJCS"); if (pszEPSG == nullptr) { pszEPSG = oSRS.GetAuthorityCode("GEOGCS"); } if (pszEPSG == nullptr) { pszEPSG = oSRS.GetAuthorityCode("VERT_CS"); } if (pszEPSG != nullptr) { nEPSG = atoi(pszEPSG); } return nEPSG; } // Test exportVertCSToPanorama TEST_F(test_osr, exportVertCSToPanorama) { OGRSpatialReference oSRS; oSRS.importFromEPSG(28407); OGRSpatialReference oVertSRS; oVertSRS.importFromEPSG(5705); EXPECT_TRUE(oVertSRS.IsVertical() == TRUE); EXPECT_STRNE(oVertSRS.GetAttrValue("VERT_CS"), ""); EXPECT_STRNE(oVertSRS.GetAttrValue("VERT_DATUM"), ""); EXPECT_EQ(GetEPSGCode(oVertSRS), 5705); oSRS.SetVertCS(oVertSRS.GetAttrValue("VERT_CS"), oVertSRS.GetAttrValue("VERT_DATUM")); int nVertID = 0; oSRS.exportVertCSToPanorama(&nVertID); EXPECT_EQ(nVertID, 25); } // Test importFromPanorama TEST_F(test_osr, importFromPanorama) { OGRSpatialReference oSRS; oSRS.importFromPanorama(35, 0, 45, nullptr); EXPECT_EQ(GetEPSGCode(oSRS), 3857); oSRS.importFromPanorama(35, 0, 9, nullptr); EXPECT_EQ(GetEPSGCode(oSRS), 3395); constexpr double TO_RADIANS = 0.017453292519943295769; { // WGS 84 / UTM zone 1 double adfPrjParams[8] = {0.0, 0.0, 0.0, -177 * TO_RADIANS, 0.9996, 500000.0, 0.0, 0.0}; oSRS.importFromPanorama(17, 2, 9, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 32601); oSRS.importFromPanorama(17, 2, 9, adfPrjParams, FALSE); EXPECT_EQ(GetEPSGCode(oSRS), 32701); } { // WGS 84 / UTM zone 37 double adfPrjParams[8] = {0.0, 0.0, 0.0, 39 * TO_RADIANS, 0.9996, 500000.0, 0.0, 0.0}; oSRS.importFromPanorama(17, 2, 9, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 32637); oSRS.importFromPanorama(17, 2, 9, adfPrjParams, FALSE); EXPECT_EQ(GetEPSGCode(oSRS), 32737); } { // Pulkovo 1942 / Gauss-Kruger zone 4 double adfPrjParams[8] = {0.0, 0.0, 0.0, 21 * TO_RADIANS, 1.0, 4500000.0, 0.0, 0.0}; oSRS.importFromPanorama(1, 1, 1, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 28404); oSRS.importFromPanorama(1, 0, 0, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 28404); adfPrjParams[7] = 4; oSRS.importFromPanorama(1, 1, 1, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 28404); } { // Pulkovo 1942 / Gauss-Kruger zone 31 double adfPrjParams[8] = {0.0, 0.0, 0.0, -177 * TO_RADIANS, 1.0, 31500000.0, 0.0, 0.0}; oSRS.importFromPanorama(1, 1, 1, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 28431); oSRS.importFromPanorama(1, 0, 0, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 28431); adfPrjParams[7] = 31; oSRS.importFromPanorama(1, 1, 1, adfPrjParams); EXPECT_EQ(GetEPSGCode(oSRS), 28431); } { // Invalid data double adfPrjParams[8] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; oSRS.importFromPanorama(0, 0, 0, adfPrjParams); EXPECT_EQ(oSRS.IsLocal(), true); EXPECT_EQ(GetEPSGCode(oSRS), 0); } } // Test exportToPanorama TEST_F(test_osr, exportToPanorama) { constexpr double RAD = 0.017453292519943295769; constexpr double EPS = 1e-12; { OGRSpatialReference oSRS; oSRS.importFromEPSG(32601); // WGS 84 / UTM zone 1N EXPECT_EQ(GetEPSGCode(oSRS), 32601); long iProjSys = 0; long iDatum = 0; long iEllips = 0; long iZone = 0; double adfParams[7] = {0}; oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams); EXPECT_EQ(iProjSys, 17); EXPECT_EQ(iDatum, 6); EXPECT_EQ(iEllips, 9); EXPECT_EQ(iZone, 1); EXPECT_NEAR(adfParams[2], 0.0, EPS); //latitude_of_origin EXPECT_NEAR(adfParams[3], -177 * RAD, EPS); //central_meridian EXPECT_NEAR(adfParams[4], 0.9996, EPS); //scale_factor EXPECT_NEAR(adfParams[5], 500000, EPS); //false_easting EXPECT_NEAR(adfParams[6], 0, EPS); //false_northing } { OGRSpatialReference oSRS; oSRS.importFromEPSG(32660); // WGS 84 / UTM zone 1N EXPECT_EQ(GetEPSGCode(oSRS), 32660); long iProjSys = 0; long iDatum = 0; long iEllips = 0; long iZone = 0; double adfParams[7] = {0}; oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams); EXPECT_EQ(iProjSys, 17); EXPECT_EQ(iDatum, 6); EXPECT_EQ(iEllips, 9); EXPECT_EQ(iZone, 60); EXPECT_NEAR(adfParams[2], 0.0, EPS); //latitude_of_origin EXPECT_NEAR(adfParams[3], 177 * RAD, EPS); //central_meridian EXPECT_NEAR(adfParams[4], 0.9996, EPS); //scale_factor EXPECT_NEAR(adfParams[5], 500000, EPS); //false_easting EXPECT_NEAR(adfParams[6], 0, EPS); //false_northing } { OGRSpatialReference oSRS; oSRS.importFromEPSG(28404); // Pulkovo 1942 / Gauss-Kruger zone 4 EXPECT_EQ(GetEPSGCode(oSRS), 28404); long iProjSys = 0; long iDatum = 0; long iEllips = 0; long iZone = 0; double adfParams[7] = {0}; oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams); EXPECT_EQ(iProjSys, 1); EXPECT_EQ(iDatum, 1); EXPECT_EQ(iEllips, 1); EXPECT_EQ(iZone, 4); EXPECT_NEAR(adfParams[2], 0.0, EPS); //latitude_of_origin EXPECT_NEAR(adfParams[3], 21 * RAD, EPS); //central_meridian EXPECT_NEAR(adfParams[4], 1.0, EPS); //scale_factor EXPECT_NEAR(adfParams[5], 4500000, EPS); //false_easting EXPECT_NEAR(adfParams[6], 0, EPS); //false_northing } { OGRSpatialReference oSRS; oSRS.importFromEPSG(28431); // Pulkovo 1942 / Gauss-Kruger zone 31 EXPECT_EQ(GetEPSGCode(oSRS), 28431); long iProjSys = 0; long iDatum = 0; long iEllips = 0; long iZone = 0; double adfParams[7] = {0}; oSRS.exportToPanorama(&iProjSys, &iDatum, &iEllips, &iZone, adfParams); EXPECT_EQ(iProjSys, 1); EXPECT_EQ(iDatum, 1); EXPECT_EQ(iEllips, 1); EXPECT_EQ(iZone, 31); EXPECT_NEAR(adfParams[2], 0.0, EPS); //latitude_of_origin EXPECT_NEAR(adfParams[3], -177 * RAD, EPS); //central_meridian EXPECT_NEAR(adfParams[4], 1.0, EPS); //scale_factor EXPECT_NEAR(adfParams[5], 31500000, EPS); //false_easting EXPECT_NEAR(adfParams[6], 0, EPS); //false_northing } } } // namespace