gdal/autotest/cpp/test_osr.cpp

645 строки
22 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Project: C++ Test Suite for GDAL/OGR
// Purpose: OGR Spatial Reference general features test.
// Author: Mateusz Loskot <mateusz@loskot.net>
//
///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2006, Mateusz Loskot <mateusz@loskot.net>
/*
* 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 <algorithm>
#include <cmath>
#include <string>
#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