aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-01-17 10:40:12 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-01-17 10:40:12 +0100
commit3121d9bc309b439adcc2ab9743a3d2b3a8f48296 (patch)
tree9c6bb780646a9f074373e0acb18414b91ffc61a9
parent6d2af0904652baba69ec81261c914e9b68221dac (diff)
downloadPROJ-3121d9bc309b439adcc2ab9743a3d2b3a8f48296.tar.gz
PROJ-3121d9bc309b439adcc2ab9743a3d2b3a8f48296.zip
import/export PROJ strings from ISO19111 code: require/output +type=crs for CRS objects (refs #1214)
-rw-r--r--include/proj/io.hpp4
-rw-r--r--src/4D_api.cpp146
-rw-r--r--src/apps/cs2cs.cpp5
-rw-r--r--src/iso19111/crs.cpp9
-rw-r--r--src/iso19111/factory.cpp6
-rw-r--r--src/iso19111/io.cpp23
-rw-r--r--src/proj_internal.h2
-rw-r--r--test/cli/testprojinfo_out.dist10
-rw-r--r--test/unit/test_c_api.cpp26
-rw-r--r--test/unit/test_crs.cpp133
-rw-r--r--test/unit/test_factory.cpp24
-rw-r--r--test/unit/test_io.cpp356
-rw-r--r--test/unit/test_operation.cpp74
13 files changed, 463 insertions, 355 deletions
diff --git a/include/proj/io.hpp b/include/proj/io.hpp
index 7f7639cd..813b4bdb 100644
--- a/include/proj/io.hpp
+++ b/include/proj/io.hpp
@@ -526,7 +526,9 @@ class PROJ_GCC_DLL IPROJStringExportable {
*
* <li>For PROJStringFormatter::Convention::PROJ_4, format a string
* compatible with the OGRSpatialReference::exportToProj4() of GDAL
- * &lt;=2.3.
+ * &lt;=2.3. It is only compatible of a few CRS objects. The PROJ string
+ * will also contain a +type=crs parameter to disambiguish the nature of
+ * the string from a CoordinateOperation.
* <ul>
* <li>For a crs::GeographicCRS, returns a proj=longlat string, with
* ellipsoid / datum / prime meridian information, ignoring axis order
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index ba292262..710b59e3 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -27,6 +27,8 @@
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/
+#define FROM_PROJ_CPP
+
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
@@ -44,7 +46,9 @@
#include "proj/common.hpp"
#include "proj/coordinateoperation.hpp"
+#include "proj/internal/internal.hpp"
+using namespace NS_PROJ::internal;
/* Initialize PJ_COORD struct */
PJ_COORD proj_coord (double x, double y, double z, double t) {
@@ -726,6 +730,20 @@ int proj_context_get_use_proj4_init_rules(PJ_CONTEXT *ctx, int from_legacy_code_
return from_legacy_code_path;
}
+/** Adds a " +type=crs" suffix to a PROJ string (if it is a PROJ string) */
+std::string pj_add_type_crs_if_needed(const std::string& str)
+{
+ std::string ret(str);
+ if( (starts_with(str, "proj=") ||
+ starts_with(str, "+proj=") ||
+ starts_with(str, "+init=") ||
+ starts_with(str, "+title=")) &&
+ str.find("type=crs") == std::string::npos )
+ {
+ ret += " +type=crs";
+ }
+ return ret;
+}
/*****************************************************************************/
PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char *target_crs, PJ_AREA *area) {
@@ -763,79 +781,89 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char
const char* const* optionsImportCRS =
proj_context_get_use_proj4_init_rules(ctx, FALSE) ? optionsProj4Mode : nullptr;
- auto src = proj_create_from_user_input(ctx, source_crs, optionsImportCRS);
- if( !src ) {
- proj_context_log_debug(ctx, "Cannot instantiate source_crs");
- return nullptr;
- }
+ try
+ {
+ std::string source_crs_modified(pj_add_type_crs_if_needed(source_crs));
+ std::string target_crs_modified(pj_add_type_crs_if_needed(target_crs));
- auto dst = proj_create_from_user_input(ctx, target_crs, optionsImportCRS);
- if( !dst ) {
- proj_context_log_debug(ctx, "Cannot instantiate target_crs");
- proj_destroy(src);
- return nullptr;
- }
+ auto src = proj_create_from_user_input(ctx, source_crs_modified.c_str(), optionsImportCRS);
+ if( !src ) {
+ proj_context_log_debug(ctx, "Cannot instantiate source_crs");
+ return nullptr;
+ }
- auto operation_ctx = proj_create_operation_factory_context(ctx, nullptr);
- if( !operation_ctx ) {
- proj_destroy(src);
- proj_destroy(dst);
- return nullptr;
- }
+ auto dst = proj_create_from_user_input(ctx, target_crs_modified.c_str(), optionsImportCRS);
+ if( !dst ) {
+ proj_context_log_debug(ctx, "Cannot instantiate target_crs");
+ proj_destroy(src);
+ return nullptr;
+ }
- if( area && area->bbox_set ) {
- proj_operation_factory_context_set_area_of_interest(
- ctx,
- operation_ctx,
- area->west_lon_degree,
- area->south_lat_degree,
- area->east_lon_degree,
- area->north_lat_degree);
- }
+ auto operation_ctx = proj_create_operation_factory_context(ctx, nullptr);
+ if( !operation_ctx ) {
+ proj_destroy(src);
+ proj_destroy(dst);
+ return nullptr;
+ }
- proj_operation_factory_context_set_grid_availability_use(
- ctx, operation_ctx, PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID);
+ if( area && area->bbox_set ) {
+ proj_operation_factory_context_set_area_of_interest(
+ ctx,
+ operation_ctx,
+ area->west_lon_degree,
+ area->south_lat_degree,
+ area->east_lon_degree,
+ area->north_lat_degree);
+ }
- auto op_list = proj_create_operations(ctx, src, dst, operation_ctx);
+ proj_operation_factory_context_set_grid_availability_use(
+ ctx, operation_ctx, PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID);
- proj_operation_factory_context_destroy(operation_ctx);
- proj_destroy(src);
- proj_destroy(dst);
+ auto op_list = proj_create_operations(ctx, src, dst, operation_ctx);
- if( !op_list ) {
- return nullptr;
- }
+ proj_operation_factory_context_destroy(operation_ctx);
+ proj_destroy(src);
+ proj_destroy(dst);
- if( proj_list_get_count(op_list) == 0 ) {
+ if( !op_list ) {
+ return nullptr;
+ }
+
+ if( proj_list_get_count(op_list) == 0 ) {
+ proj_list_destroy(op_list);
+ proj_context_log_debug(ctx, "No operation found matching criteria");
+ return nullptr;
+ }
+
+ auto op = proj_list_get(ctx, op_list, 0);
proj_list_destroy(op_list);
- proj_context_log_debug(ctx, "No operation found matching criteria");
- return nullptr;
- }
+ if( !op ) {
+ return nullptr;
+ }
- auto op = proj_list_get(ctx, op_list, 0);
- proj_list_destroy(op_list);
- if( !op ) {
- return nullptr;
- }
+ proj_string = proj_as_proj_string(ctx, op, PJ_PROJ_5, nullptr);
+ if( !proj_string) {
+ proj_destroy(op);
+ proj_context_log_debug(ctx, "Cannot export operation as a PROJ string");
+ return nullptr;
+ }
+
+ PJ* P;
+ if( proj_string[0] == '\0' ) {
+ /* Null transform ? */
+ P = proj_create(ctx, "proj=affine");
+ } else {
+ P = proj_create(ctx, proj_string);
+ }
- proj_string = proj_as_proj_string(ctx, op, PJ_PROJ_5, nullptr);
- if( !proj_string) {
proj_destroy(op);
- proj_context_log_debug(ctx, "Cannot export operation as a PROJ string");
- return nullptr;
- }
- PJ* P;
- if( proj_string[0] == '\0' ) {
- /* Null transform ? */
- P = proj_create(ctx, "proj=affine");
- } else {
- P = proj_create(ctx, proj_string);
+ return P;
+ }
+ catch( const std::exception& )
+ {
+ return nullptr;
}
-
- proj_destroy(op);
-
- return P;
}
PJ *proj_destroy (PJ *P) {
diff --git a/src/apps/cs2cs.cpp b/src/apps/cs2cs.cpp
index af53a051..bde4f813 100644
--- a/src/apps/cs2cs.cpp
+++ b/src/apps/cs2cs.cpp
@@ -213,8 +213,9 @@ static PJ *instanciate_crs(const std::string &definition,
const char *const *optionsImportCRS,
bool &isGeog, double &toRadians,
bool &isLatFirst) {
- PJ *crs = proj_create_from_user_input(nullptr, definition.c_str(),
- optionsImportCRS);
+ PJ *crs = proj_create_from_user_input(nullptr,
+ pj_add_type_crs_if_needed(definition).c_str(),
+ optionsImportCRS);
if (!crs) {
return nullptr;
}
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp
index 81c70b7a..a003cd9c 100644
--- a/src/iso19111/crs.cpp
+++ b/src/iso19111/crs.cpp
@@ -1176,7 +1176,8 @@ void GeodeticCRS::_exportToPROJString(
{
const auto &extensionProj4 = CRS::getPrivate()->extensionProj4_;
if (!extensionProj4.empty()) {
- formatter->ingestPROJString(extensionProj4);
+ formatter->ingestPROJString(
+ replaceAll(extensionProj4, " +type=crs", ""));
formatter->addNoDefs(false);
return;
}
@@ -1907,7 +1908,8 @@ void GeographicCRS::_exportToPROJString(
{
const auto &extensionProj4 = CRS::getPrivate()->extensionProj4_;
if (!extensionProj4.empty()) {
- formatter->ingestPROJString(extensionProj4);
+ formatter->ingestPROJString(
+ replaceAll(extensionProj4, " +type=crs", ""));
formatter->addNoDefs(false);
return;
}
@@ -2719,7 +2721,8 @@ void ProjectedCRS::_exportToPROJString(
{
const auto &extensionProj4 = CRS::getPrivate()->extensionProj4_;
if (!extensionProj4.empty()) {
- formatter->ingestPROJString(extensionProj4);
+ formatter->ingestPROJString(
+ replaceAll(extensionProj4, " +type=crs", ""));
formatter->addNoDefs(false);
return;
}
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp
index 3b6563f3..565f43e3 100644
--- a/src/iso19111/factory.cpp
+++ b/src/iso19111/factory.cpp
@@ -2086,7 +2086,8 @@ AuthorityFactory::createGeodeticCRS(const std::string &code,
if (!text_definition.empty()) {
DatabaseContext::Private::RecursionDetector detector(d->context());
- auto obj = createFromUserInput(text_definition, d->context());
+ auto obj = createFromUserInput(
+ pj_add_type_crs_if_needed(text_definition), d->context());
auto geodCRS = util::nn_dynamic_pointer_cast<crs::GeodeticCRS>(obj);
if (geodCRS) {
return cloneWithProps(NN_NO_CHECK(geodCRS), props);
@@ -2333,7 +2334,8 @@ AuthorityFactory::createProjectedCRS(const std::string &code) const {
if (!text_definition.empty()) {
DatabaseContext::Private::RecursionDetector detector(d->context());
- auto obj = createFromUserInput(text_definition, d->context());
+ auto obj = createFromUserInput(
+ pj_add_type_crs_if_needed(text_definition), d->context());
auto projCRS = dynamic_cast<const crs::ProjectedCRS *>(obj.get());
if (projCRS) {
const auto &conv = projCRS->derivingConversionRef();
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index 5be02ffe..d403495b 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -3344,6 +3344,9 @@ ConversionNNPtr WKTParser::Private::buildProjectionStandard(
ci_equal(stripQuotes(extensionChildren[0]), "PROJ4")) {
std::string projString = stripQuotes(extensionChildren[1]);
if (starts_with(projString, "+proj=")) {
+ if (projString.find(" +type=crs") == std::string::npos) {
+ projString += " +type=crs";
+ }
try {
auto projObj =
PROJStringParser().createFromPROJString(projString);
@@ -4619,6 +4622,9 @@ std::string IPROJStringExportable::exportToPROJString(
}
}
if (bIsCRS) {
+ if (!formatter->hasParam("type")) {
+ formatter->addParam("type", "crs");
+ }
formatter->setCRSExport(false);
}
return formatter->toString();
@@ -5303,6 +5309,9 @@ PROJStringSyntaxParser(const std::string &projString, std::vector<Step> &steps,
vunits = word.substr(strlen("vunits="));
} else if (starts_with(word, "vto_meter=")) {
vto_meter = word.substr(strlen("vto_meter="));
+ } else if (word == "type=crs" &&
+ (!vunits.empty() || !vto_meter.empty())) {
+ // ok
} else if (starts_with(word, "title=")) {
title = word.substr(strlen("title="));
prevWasTitle = true;
@@ -6902,7 +6911,7 @@ CRSNNPtr PROJStringParser::Private::buildProjectedCRS(
param.key == "towgs84" || param.key == "nadgrids" ||
param.key == "geoidgrids" || param.key == "units" ||
param.key == "to_meter" || param.key == "vunits" ||
- param.key == "vto_meter") {
+ param.key == "vto_meter" || param.key == "type") {
continue;
}
if (param.value.empty()) {
@@ -7252,6 +7261,10 @@ static const metadata::ExtentPtr &getExtent(const crs::CRS *crs) {
// ---------------------------------------------------------------------------
/** \brief Instantiate a sub-class of BaseObject from a PROJ string.
+ *
+ * The projString must contain +type=crs for the object to be detected as a
+ * CRS instead of a CoordinateOperation.
+ *
* @throw ParsingException
*/
BaseObjectNNPtr
@@ -7300,7 +7313,8 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
// +init=xxxx:yyyy syntax
if (d->steps_.size() == 1 && d->steps_[0].isInit &&
- d->steps_[0].paramValues.size() == 0) {
+ (d->steps_[0].paramValues.size() == 0 ||
+ d->getParamValue(d->steps_[0], "type") == "crs")) {
// Those used to come from a text init file
// We only support them in compatibility mode
@@ -7483,6 +7497,11 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
}
}
+ if (d->steps_.size() == 1 && iHelmert < 0 && iMolodensky < 0 &&
+ d->getParamValue(d->steps_[0], "type") != "crs") {
+ unexpectedStructure = true;
+ }
+
if (!unexpectedStructure) {
if (iFirstGeogStep == 0 && iSecondGeogStep < 0 && iProjStep < 0 &&
iHelmert < 0 && iFirstCart < 0 && iMolodensky < 0 &&
diff --git a/src/proj_internal.h b/src/proj_internal.h
index bbadb376..0cc99c81 100644
--- a/src/proj_internal.h
+++ b/src/proj_internal.h
@@ -899,6 +899,8 @@ void pj_freeup_plain (PJ *P);
PJ* pj_init_ctx_with_allow_init_epsg( projCtx_t *ctx, int argc, char **argv, int allow_init_epsg );
+std::string PROJ_DLL pj_add_type_crs_if_needed(const std::string& str);
+
/* classic public API */
#include "proj_api.h"
diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist
index 462e8062..ebc59c40 100644
--- a/test/cli/testprojinfo_out.dist
+++ b/test/cli/testprojinfo_out.dist
@@ -1,6 +1,6 @@
Testing projinfo EPSG:4326
PROJ.4 string:
-+proj=longlat +datum=WGS84 +no_defs
++proj=longlat +datum=WGS84 +no_defs +type=crs
WKT2_2018 string:
GEOGCRS["WGS 84",
@@ -78,7 +78,7 @@ GEOGCRS["WGS 84",
Testing projinfo -o ALL EPSG:4326
PROJ.4 string:
-+proj=longlat +datum=WGS84 +no_defs
++proj=longlat +datum=WGS84 +no_defs +type=crs
WKT2_2015 string:
GEODCRS["WGS 84",
@@ -555,7 +555,7 @@ Alternative non-deprecated CRS:
EPSG:3003
PROJ.4 string:
-+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs
++proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs +type=crs
WKT2_2018 string:
PROJCRS["Monte Mario (Rome) / Italy zone 1",
@@ -602,7 +602,7 @@ Warning: Parsing error : syntax error, unexpected UNIT, expecting PRIMEM. Error
HEROID["WGS 84",6378137,298.257223563]],UNIT["degree",0.0174532925199433]]
^
PROJ.4 string:
-+proj=longlat +datum=WGS84 +no_defs
++proj=longlat +datum=WGS84 +no_defs +type=crs
WKT2_2018 string:
GEOGCRS["WGS 84",
@@ -623,5 +623,5 @@ GEOGCRS["WGS 84",
Testing CRS with towgs84: projinfo -o PROJ EPSG:25832
PROJ.4 string:
-+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
++proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index 6353d46f..4c13a5e2 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -492,12 +492,14 @@ TEST_F(CApi, proj_as_proj_string) {
{
auto proj_5 = proj_as_proj_string(m_ctxt, obj, PJ_PROJ_5, nullptr);
ASSERT_NE(proj_5, nullptr);
- EXPECT_EQ(std::string(proj_5), "+proj=longlat +datum=WGS84 +no_defs");
+ EXPECT_EQ(std::string(proj_5),
+ "+proj=longlat +datum=WGS84 +no_defs +type=crs");
}
{
auto proj_4 = proj_as_proj_string(m_ctxt, obj, PJ_PROJ_4, nullptr);
ASSERT_NE(proj_4, nullptr);
- EXPECT_EQ(std::string(proj_4), "+proj=longlat +datum=WGS84 +no_defs");
+ EXPECT_EQ(std::string(proj_4),
+ "+proj=longlat +datum=WGS84 +no_defs +type=crs");
}
}
@@ -518,22 +520,24 @@ TEST_F(CApi, proj_as_proj_string_incompatible_WKT1) {
// ---------------------------------------------------------------------------
TEST_F(CApi, proj_as_proj_string_etmerc_option_yes) {
- auto obj = proj_create_from_proj_string(m_ctxt, "+proj=tmerc", nullptr);
+ auto obj =
+ proj_create_from_proj_string(m_ctxt, "+proj=tmerc +type=crs", nullptr);
ObjectKeeper keeper(obj);
ASSERT_NE(obj, nullptr);
const char *options[] = {"USE_ETMERC=YES", nullptr};
auto str = proj_as_proj_string(m_ctxt, obj, PJ_PROJ_4, options);
ASSERT_NE(str, nullptr);
- EXPECT_EQ(str, std::string("+proj=etmerc +lat_0=0 +lon_0=0 +k=1 +x_0=0 "
- "+y_0=0 +datum=WGS84 +units=m +no_defs"));
+ EXPECT_EQ(str,
+ std::string("+proj=etmerc +lat_0=0 +lon_0=0 +k=1 +x_0=0 "
+ "+y_0=0 +datum=WGS84 +units=m +no_defs +type=crs"));
}
// ---------------------------------------------------------------------------
TEST_F(CApi, proj_as_proj_string_etmerc_option_no) {
- auto obj =
- proj_create_from_proj_string(m_ctxt, "+proj=utm +zone=31", nullptr);
+ auto obj = proj_create_from_proj_string(
+ m_ctxt, "+proj=utm +zone=31 +type=crs", nullptr);
ObjectKeeper keeper(obj);
ASSERT_NE(obj, nullptr);
@@ -542,7 +546,7 @@ TEST_F(CApi, proj_as_proj_string_etmerc_option_no) {
ASSERT_NE(str, nullptr);
EXPECT_EQ(str, std::string("+proj=tmerc +lat_0=0 +lon_0=3 +k=0.9996 "
"+x_0=500000 +y_0=0 +datum=WGS84 +units=m "
- "+no_defs"));
+ "+no_defs +type=crs"));
}
// ---------------------------------------------------------------------------
@@ -563,7 +567,7 @@ TEST_F(CApi, proj_crs_create_bound_crs_to_WGS84) {
"+proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 "
"+y_0=500000 +ellps=krass "
"+towgs84=2.329,-147.042,-92.08,-0.309,0.325,0.497,5.69 "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
auto base_crs = proj_get_source_crs(m_ctxt, res);
ObjectKeeper keeper_base_crs(base_crs);
@@ -2432,8 +2436,8 @@ TEST_F(CApi, proj_crs_alter_geodetic_crs) {
ObjectKeeper keeper(projCRS);
ASSERT_NE(projCRS, nullptr);
- auto newGeodCRS =
- proj_create_from_proj_string(m_ctxt, "+proj=longlat", nullptr);
+ auto newGeodCRS = proj_create_from_proj_string(
+ m_ctxt, "+proj=longlat +type=crs", nullptr);
ObjectKeeper keeper_newGeodCRS(newGeodCRS);
ASSERT_NE(newGeodCRS, nullptr);
diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp
index d3309fb2..b71fd248 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -388,7 +388,7 @@ TEST(crs, EPSG_4326_as_WKT1_ESRI_without_database) {
TEST(crs, EPSG_4326_as_PROJ_string) {
auto crs = GeographicCRS::EPSG_4326;
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +datum=WGS84 +no_defs");
+ "+proj=longlat +datum=WGS84 +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -588,7 +588,7 @@ TEST(crs, EPSG_4807_as_WKT1_ESRI_without_database) {
TEST(crs, EPSG_4807_as_PROJ_string) {
auto crs = GeographicCRS::EPSG_4807;
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +ellps=clrk80ign +pm=paris +no_defs");
+ "+proj=longlat +ellps=clrk80ign +pm=paris +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -611,7 +611,7 @@ TEST(crs, EPSG_4267) {
" ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
" ID[\"EPSG\",4267]]");
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +datum=NAD27 +no_defs");
+ "+proj=longlat +datum=NAD27 +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -647,7 +647,7 @@ TEST(crs, EPSG_4269) {
" ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
" ID[\"EPSG\",4269]]");
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +datum=NAD83 +no_defs");
+ "+proj=longlat +datum=NAD83 +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -703,10 +703,10 @@ TEST(crs, EPSG_27561_projected_with_geodetic_in_grad_as_PROJ_string_and_WKT1) {
" ID[\"EPSG\",27561]]");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
- EXPECT_EQ(
- crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=lcc +lat_1=49.5 +lat_0=49.5 +lon_0=0 +k_0=0.999877341 "
- "+x_0=600000 +y_0=200000 +ellps=clrk80ign +pm=paris +units=m +no_defs");
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=lcc +lat_1=49.5 +lat_0=49.5 +lon_0=0 +k_0=0.999877341 "
+ "+x_0=600000 +y_0=200000 +ellps=clrk80ign +pm=paris +units=m "
+ "+no_defs +type=crs");
auto nn_crs = NN_CHECK_ASSERT(crs);
EXPECT_TRUE(nn_crs->isEquivalentTo(nn_crs.get()));
@@ -782,7 +782,7 @@ TEST(crs, EPSG_3040_projected_northing_easting_as_PROJ_string) {
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=utm +zone=28 +ellps=GRS80 +units=m +no_defs");
+ "+proj=utm +zone=28 +ellps=GRS80 +units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -813,7 +813,7 @@ TEST(crs, EPSG_2222_projected_unit_foot_as_PROJ_string_and_WKT1) {
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=tmerc +lat_0=31 +lon_0=-110.166666666667 +k=0.9999 "
- "+x_0=213360 +y_0=0 +datum=NAD83 +units=ft +no_defs");
+ "+x_0=213360 +y_0=0 +datum=NAD83 +units=ft +no_defs +type=crs");
auto wkt1 = crs->exportToWKT(
WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
@@ -1109,7 +1109,7 @@ TEST(crs, EPSG_4978_as_WKT1_GDAL_with_database) {
TEST(crs, geocentricCRS_as_PROJ_string) {
auto crs = createGeocentric();
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=geocent +datum=WGS84 +units=m +no_defs");
+ "+proj=geocent +datum=WGS84 +units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -1404,7 +1404,8 @@ TEST(crs, geodeticcrs_identify_db) {
{
// Identify by ellipsoid description
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +a=6378521.049 +rf=298.257222100883 +axis=neu");
+ "+proj=longlat +a=6378521.049 +rf=298.257222100883 +axis=neu "
+ "+type=crs");
auto crs = nn_dynamic_pointer_cast<GeodeticCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto factoryAll = AuthorityFactory::create(dbContext, std::string());
@@ -1511,7 +1512,7 @@ TEST(crs, projectedCRS_shallowClone) {
}
EXPECT_EQ(clone->baseCRS()->exportToPROJString(
PROJStringFormatter::create().get()),
- "+proj=geocent +datum=WGS84 +units=m +no_defs");
+ "+proj=geocent +datum=WGS84 +units=m +no_defs +type=crs");
}
}
@@ -1749,7 +1750,7 @@ TEST(crs, projectedCRS_as_PROJ_string) {
"+proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=utm "
"+zone=31 +ellps=WGS84");
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs");
+ "+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -1776,7 +1777,8 @@ TEST(crs, projectedCRS_Krovak_with_approximate_alpha_as_PROJ_string) {
// 30deg 17' 17.303'' = 30.288139722222223 as used in GDAL WKT1
auto obj = PROJStringParser().createFromPROJString(
"+proj=krovak +lat_0=49.5 +lon_0=42.5 +alpha=30.28813972222222 "
- "+k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs");
+ "+k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs "
+ "+type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
auto op = CoordinateOperationFactory::create()->createOperation(
crs->baseCRS(), NN_NO_CHECK(crs));
@@ -1865,7 +1867,7 @@ TEST(crs, projectedCRS_identify_no_db) {
{
// Tolerance on axis order
auto obj = PROJStringParser().createFromPROJString(
- "+proj=utm +zone=31 +datum=WGS84");
+ "+proj=utm +zone=31 +datum=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(nullptr);
@@ -1993,7 +1995,7 @@ TEST(crs, projectedCRS_identify_db) {
auto obj = PROJStringParser().createFromPROJString(
"+proj=omerc +no_uoff +lat_0=4 +lonc=102.25 "
"+alpha=323.025796466667 +gamma=323.130102361111 +k=0.99984 "
- "+x_0=804671 +y_0=0 +ellps=GRS80");
+ "+x_0=804671 +y_0=0 +ellps=GRS80 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factoryEPSG);
@@ -2090,8 +2092,8 @@ TEST(crs, projectedCRS_identify_db) {
}
{
// No equivalent CRS to input one in result set
- auto obj =
- PROJStringParser().createFromPROJString("+proj=tmerc +datum=WGS84");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=tmerc +datum=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factoryEPSG);
@@ -2106,7 +2108,8 @@ TEST(crs, projectedCRS_identify_db) {
"+proj=lcc +lat_0=43.5 +lon_0=-93.95 "
"+lat_1=43.5666666666667 "
"+lat_2=43.8 +x_0=152400.30480061 +y_0=30480.0609601219 "
- "+a=6378521.049 +rf=298.257222100883 +units=us-ft");
+ "+a=6378521.049 +rf=298.257222100883 +units=us-ft "
+ "+type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto factoryAll = AuthorityFactory::create(dbContext, std::string());
@@ -2130,7 +2133,7 @@ TEST(crs, projectedCRS_identify_db) {
.attachDatabaseContext(dbContext)
.createFromPROJString(
"+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 "
- "+a=6378140 +b=6356755.288157528 +units=m");
+ "+a=6378140 +b=6356755.288157528 +units=m +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factoryEPSG);
@@ -2140,12 +2143,12 @@ TEST(crs, projectedCRS_identify_db) {
}
{
// EPSG:6646 as PROJ.4 string, using clrk80 which is pretty generic
- auto obj =
- PROJStringParser()
- .attachDatabaseContext(dbContext)
- .createFromPROJString(
- "+proj=tmerc +lat_0=29.02626833333333 +lon_0=46.5 "
- "+k=0.9994 +x_0=800000 +y_0=0 +ellps=clrk80 +units=m");
+ auto obj = PROJStringParser()
+ .attachDatabaseContext(dbContext)
+ .createFromPROJString(
+ "+proj=tmerc +lat_0=29.02626833333333 +lon_0=46.5 "
+ "+k=0.9994 +x_0=800000 +y_0=0 +ellps=clrk80 "
+ "+units=m +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factoryEPSG);
@@ -2161,7 +2164,7 @@ TEST(crs, mercator_1SP_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
"+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 "
- "+ellps=bessel");
+ "+ellps=bessel +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2188,7 +2191,7 @@ TEST(crs, mercator_1SP_as_WKT1_ESRI) {
TEST(crs, Plate_Carree_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+title=my Plate carree +proj=eqc");
+ "+title=my Plate carree +proj=eqc +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2212,7 +2215,7 @@ TEST(crs, Plate_Carree_as_WKT1_ESRI) {
TEST(crs, Equidistant_Cylindrical_as_WKT1_ESRI) {
- auto obj = PROJStringParser().createFromPROJString("+proj=eqc");
+ auto obj = PROJStringParser().createFromPROJString("+proj=eqc +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2238,7 +2241,7 @@ TEST(crs, Equidistant_Cylindrical_as_WKT1_ESRI) {
TEST(crs, Hotine_Oblique_Mercator_Azimuth_Natural_Origin_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=omerc +no_uoff +gamma=295 +alpha=295");
+ "+proj=omerc +no_uoff +gamma=295 +alpha=295 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2268,7 +2271,7 @@ TEST(crs, Hotine_Oblique_Mercator_Azimuth_Natural_Origin_as_WKT1_ESRI) {
TEST(crs, Rectified_Skew_Orthomorphic_Natural_Origin_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=omerc +no_uoff +gamma=3 +alpha=2");
+ "+proj=omerc +no_uoff +gamma=3 +alpha=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2298,7 +2301,7 @@ TEST(crs, Rectified_Skew_Orthomorphic_Natural_Origin_as_WKT1_ESRI) {
TEST(crs, Hotine_Oblique_Mercator_Azimuth_Center_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=omerc +gamma=2 +alpha=2");
+ "+proj=omerc +gamma=2 +alpha=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2327,7 +2330,7 @@ TEST(crs, Hotine_Oblique_Mercator_Azimuth_Center_as_WKT1_ESRI) {
TEST(crs, Rectified_Skew_Orthomorphic_Center_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=omerc +gamma=3 +alpha=2");
+ "+proj=omerc +gamma=3 +alpha=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2357,7 +2360,7 @@ TEST(crs, Rectified_Skew_Orthomorphic_Center_as_WKT1_ESRI) {
TEST(crs, Gauss_Kruger_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+title=my Gauss Kruger +proj=tmerc");
+ "+title=my Gauss Kruger +proj=tmerc +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2384,7 +2387,7 @@ TEST(crs, Gauss_Kruger_as_WKT1_ESRI) {
TEST(crs, Stereographic_North_Pole_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=stere +lat_0=90 +lat_ts=70");
+ "+proj=stere +lat_0=90 +lat_ts=70 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2410,7 +2413,7 @@ TEST(crs, Stereographic_North_Pole_as_WKT1_ESRI) {
TEST(crs, Stereographic_South_Pole_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=stere +lat_0=-90 +lat_ts=-70");
+ "+proj=stere +lat_0=-90 +lat_ts=-70 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2435,7 +2438,8 @@ TEST(crs, Stereographic_South_Pole_as_WKT1_ESRI) {
TEST(crs, Krovak_North_Orientated_as_WKT1_ESRI) {
- auto obj = PROJStringParser().createFromPROJString("+proj=krovak");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=krovak +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2466,8 +2470,8 @@ TEST(crs, Krovak_North_Orientated_as_WKT1_ESRI) {
TEST(crs, Krovak_as_WKT1_ESRI) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=krovak +axis=swu");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=krovak +axis=swu +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2499,7 +2503,7 @@ TEST(crs, Krovak_as_WKT1_ESRI) {
TEST(crs, LCC_1SP_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=lcc +lat_1=1 +lat_0=1 +k=0.9");
+ "+proj=lcc +lat_1=1 +lat_0=1 +k=0.9 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2527,7 +2531,7 @@ TEST(crs, LCC_1SP_as_WKT1_ESRI) {
TEST(crs, LCC_2SP_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=lcc +lat_0=1.5 +lat_1=1 +lat_2=2");
+ "+proj=lcc +lat_0=1.5 +lat_1=1 +lat_2=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -3122,7 +3126,8 @@ TEST(crs, compoundCRS_as_WKT1_GDAL) {
TEST(crs, compoundCRS_as_PROJ_string) {
auto crs = createCompoundCRS();
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=utm +zone=31 +datum=WGS84 +units=m +vunits=m +no_defs");
+ "+proj=utm +zone=31 +datum=WGS84 +units=m +vunits=m +no_defs "
+ "+type=crs");
}
// ---------------------------------------------------------------------------
@@ -3539,8 +3544,9 @@ TEST(crs, boundCRS_geographicCRS_to_PROJ_string) {
auto crs = BoundCRS::createFromTOWGS84(
basecrs, std::vector<double>{1, 2, 3, 4, 5, 6, 7});
- EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +ellps=WGS84 +towgs84=1,2,3,4,5,6,7 +no_defs");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=longlat +ellps=WGS84 +towgs84=1,2,3,4,5,6,7 +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -3561,7 +3567,7 @@ TEST(crs, boundCRS_projectedCRS_to_PROJ_string) {
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=utm +zone=31 +ellps=WGS84 +towgs84=1,2,3,4,5,6,7 +units=m "
- "+no_defs");
+ "+no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -3570,13 +3576,13 @@ TEST(crs, boundCRS_identify_db) {
auto dbContext = DatabaseContext::create();
auto factoryEPSG = AuthorityFactory::create(dbContext, "EPSG");
{
- auto obj =
- PROJStringParser()
- .attachDatabaseContext(dbContext)
- .createFromPROJString("+proj=tmerc +lat_0=-37.76111111111111 "
- "+lon_0=176.4661111111111 +k=1 "
- "+x_0=400000 +y_0=800000 +ellps=GRS80 "
- "+towgs84=0,0,0,0,0,0,0 +units=m");
+ auto obj = PROJStringParser()
+ .attachDatabaseContext(dbContext)
+ .createFromPROJString(
+ "+proj=tmerc +lat_0=-37.76111111111111 "
+ "+lon_0=176.4661111111111 +k=1 "
+ "+x_0=400000 +y_0=800000 +ellps=GRS80 "
+ "+towgs84=0,0,0,0,0,0,0 +units=m +type=crs");
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factoryEPSG);
@@ -3687,9 +3693,10 @@ TEST(crs, WKT1_DATUM_EXTENSION_to_WKT1_and_PROJ_string) {
WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get()),
wkt);
- EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 "
- "+ellps=intl +nadgrids=nzgd2kgrid0005.gsb +units=m +no_defs");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 "
+ "+ellps=intl +nadgrids=nzgd2kgrid0005.gsb +units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -3786,7 +3793,7 @@ TEST(crs, WKT1_VERT_DATUM_EXTENSION_to_PROJ_string) {
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+geoidgrids=egm08_25.gtx +vunits=m +no_defs");
+ "+geoidgrids=egm08_25.gtx +vunits=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -4747,7 +4754,7 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
"+proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 "
"+y_0=500000 +ellps=krass "
"+towgs84=2.329,-147.042,-92.08,-0.309,0.325,0.497,5.69 "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
}
{
// Pulkovo 42 Poland
@@ -4764,7 +4771,7 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
"+proj=sterea +lat_0=50.625 +lon_0=21.0833333333333 "
"+k=0.9998 +x_0=4637000 +y_0=5647000 +ellps=krass "
"+towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
}
{
// NTF (Paris)
@@ -4779,7 +4786,7 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
EXPECT_EQ(
boundCRS->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=longlat +ellps=clrk80ign +pm=paris "
- "+towgs84=-168,-60,320,0,0,0,0 +no_defs");
+ "+towgs84=-168,-60,320,0,0,0,0 +no_defs +type=crs");
}
{
// NTF (Paris) / Lambert zone II + NGF-IGN69 height
@@ -4796,7 +4803,7 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
"+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 "
"+x_0=600000 +y_0=2200000 +ellps=clrk80ign +pm=paris "
"+towgs84=-168,-60,320,0,0,0,0 +units=m "
- "+vunits=m +no_defs");
+ "+vunits=m +no_defs +type=crs");
}
{
auto crs = createVerticalCRS();
@@ -4814,7 +4821,7 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
boundCRS->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=stere +lat_0=-90 +lon_0=140 +k=0.960272946 "
"+x_0=300000 +y_0=-2299363.482 +ellps=intl "
- "+towgs84=324.8,153.6,172.1,0,0,0,0 +units=m +no_defs");
+ "+towgs84=324.8,153.6,172.1,0,0,0,0 +units=m +no_defs +type=crs");
}
{
auto factoryIGNF =
@@ -4827,7 +4834,7 @@ TEST(crs, crs_createBoundCRSToWGS84IfPossible) {
EXPECT_EQ(
boundCRS->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=geocent +ellps=intl "
- "+towgs84=324.8,153.6,172.1,0,0,0,0 +units=m +no_defs");
+ "+towgs84=324.8,153.6,172.1,0,0,0,0 +units=m +no_defs +type=crs");
}
{
auto crs = factory->createCoordinateReferenceSystem("4269"); // NAD83
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp
index e9b29728..027c0188 100644
--- a/test/unit/test_factory.cpp
+++ b/test/unit/test_factory.cpp
@@ -409,7 +409,7 @@ TEST(factory, AuthorityFactory_createGeodeticCRS_geographic2D) {
EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("1262").get()));
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +datum=WGS84 +no_defs");
+ "+proj=longlat +datum=WGS84 +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -972,7 +972,7 @@ TEST(factory, AuthorityFactory_test_uom_9110) {
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=sterea +lat_0=53.0019444444444 +lon_0=21.5027777777778 "
"+k=0.9998 +x_0=4603000 +y_0=5806000 +ellps=krass +units=m "
- "+no_defs");
+ "+no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -2324,7 +2324,8 @@ TEST_F(FactoryWithTmpDatabase, custom_projected_crs) {
EXPECT_EQ(crs->identifiers().size(), 1);
EXPECT_EQ(crs->derivingConversion()->targetCRS().get(), crs.get());
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=mbt_s +unused_flag +datum=WGS84 +units=m +no_defs");
+ "+proj=mbt_s +unused_flag +datum=WGS84 +units=m +no_defs "
+ "+type=crs");
EXPECT_TRUE(crs->canonicalBoundCRS() == nullptr);
}
{
@@ -2333,15 +2334,16 @@ TEST_F(FactoryWithTmpDatabase, custom_projected_crs) {
EXPECT_EQ(crs->identifiers().size(), 1);
EXPECT_EQ(crs->derivingConversion()->targetCRS().get(), crs.get());
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=mbt_s +unused_flag +datum=WGS84 +units=m +no_defs");
+ "+proj=mbt_s +unused_flag +datum=WGS84 +units=m +no_defs "
+ "+type=crs");
EXPECT_TRUE(crs->canonicalBoundCRS() != nullptr);
}
EXPECT_THROW(factory->createProjectedCRS("TEST_WRONG"), FactoryException);
{
- auto obj =
- PROJStringParser().createFromPROJString("+proj=merc +a=1 +b=1");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=merc +a=1 +b=1 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factory);
@@ -2352,8 +2354,8 @@ TEST_F(FactoryWithTmpDatabase, custom_projected_crs) {
}
{
- auto obj =
- PROJStringParser().createFromPROJString("+proj=merc +ellps=GRS80");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=merc +ellps=GRS80 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factory);
@@ -2365,7 +2367,7 @@ TEST_F(FactoryWithTmpDatabase, custom_projected_crs) {
{
auto obj = PROJStringParser().createFromPROJString(
- "+proj=merc +a=6378137 +rf=298.257222101");
+ "+proj=merc +a=6378137 +rf=298.257222101 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factory);
@@ -2376,8 +2378,8 @@ TEST_F(FactoryWithTmpDatabase, custom_projected_crs) {
}
{
- auto obj =
- PROJStringParser().createFromPROJString("+proj=merc +ellps=WGS84");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=merc +ellps=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factory);
diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp
index 43b74fd8..7b75cdc8 100644
--- a/test/unit/test_io.cpp
+++ b/test/unit/test_io.cpp
@@ -587,7 +587,7 @@ TEST(wkt_parse, wkt1_geographic_with_PROJ4_extension) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=longlat +foo=bar +wktext");
+ "+proj=longlat +foo=bar +wktext +type=crs");
EXPECT_TRUE(
crs->exportToWKT(WKTFormatter::create().get()).find("EXTENSION") ==
@@ -624,7 +624,7 @@ TEST(wkt_parse, wkt1_geocentric_with_PROJ4_extension) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=geocent +foo=bar +wktext");
+ "+proj=geocent +foo=bar +wktext +type=crs");
EXPECT_TRUE(
crs->exportToWKT(WKTFormatter::create().get()).find("EXTENSION") ==
@@ -1133,7 +1133,7 @@ TEST(wkt_parse, wkt1_projected_with_PROJ4_extension) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=merc +wktext");
+ "+proj=merc +wktext +type=crs");
EXPECT_TRUE(
crs->exportToWKT(WKTFormatter::create().get()).find("EXTENSION") ==
@@ -1256,7 +1256,7 @@ TEST(wkt_parse, wkt1_krovak_south_west) {
auto expectedPROJString = "+proj=krovak +axis=swu +lat_0=49.5 "
"+lon_0=24.8333333333333 +alpha=30.2881397222222 "
"+k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m "
- "+no_defs";
+ "+no_defs +type=crs";
EXPECT_EQ(projString, expectedPROJString);
obj = PROJStringParser().createFromPROJString(projString);
@@ -1369,7 +1369,7 @@ TEST(wkt_parse, wkt1_krovak_north_oriented) {
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=krovak +lat_0=49.5 +lon_0=24.8333333333333 "
"+alpha=30.2881397222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -1400,8 +1400,9 @@ TEST(wkt_parse, wkt1_polar_stereographic_latitude_of_origin_70) {
auto projString = crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get());
- auto expectedPROJString = "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=2 "
- "+x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs";
+ auto expectedPROJString =
+ "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=2 "
+ "+x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs +type=crs";
EXPECT_EQ(projString, expectedPROJString);
EXPECT_EQ(crs->coordinateSystem()->axisList()[0]->nameStr(), "Easting");
@@ -1473,8 +1474,9 @@ TEST(wkt_parse, wkt1_polar_stereographic_latitude_of_origin_90) {
auto projString = crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get());
- auto expectedPROJString = "+proj=stere +lat_0=90 +lat_ts=90 +lon_0=2 "
- "+x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs";
+ auto expectedPROJString =
+ "+proj=stere +lat_0=90 +lat_ts=90 +lon_0=2 "
+ "+x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs +type=crs";
EXPECT_EQ(projString, expectedPROJString);
}
@@ -1507,8 +1509,9 @@ TEST(wkt_parse, wkt1_polar_stereographic_latitude_of_origin_90_scale_factor_1) {
auto projString = crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get());
- auto expectedPROJString = "+proj=stere +lat_0=90 +lat_ts=90 +lon_0=2 "
- "+x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs";
+ auto expectedPROJString =
+ "+proj=stere +lat_0=90 +lat_ts=90 +lon_0=2 "
+ "+x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs +type=crs";
EXPECT_EQ(projString, expectedPROJString);
}
@@ -1542,7 +1545,7 @@ TEST(wkt_parse, wkt1_polar_stereographic_scale_factor) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get());
auto expectedPROJString = "+proj=stere +lat_0=90 +lon_0=2 +k=0.99 +x_0=3 "
- "+y_0=4 +datum=WGS84 +units=m +no_defs";
+ "+y_0=4 +datum=WGS84 +units=m +no_defs +type=crs";
EXPECT_EQ(projString, expectedPROJString);
}
@@ -1575,7 +1578,7 @@ TEST(wkt_parse, wkt1_Spherical_Cross_Track_Height) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get());
auto expectedPROJString = "+proj=sch +plat_0=1 +plon_0=2 +phdg_0=3 +h_0=4 "
- "+datum=WGS84 +units=m +no_defs";
+ "+datum=WGS84 +units=m +no_defs +type=crs";
EXPECT_EQ(projString, expectedPROJString);
}
@@ -1694,7 +1697,7 @@ TEST(wkt_parse, wkt2_2018_projected_3D) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
"+proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
EXPECT_THROW(
crs->exportToWKT(
@@ -1739,7 +1742,7 @@ TEST(wkt_parse, wkt2_2018_projected_utm_3D) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=utm +zone=31 +ellps=WGS84 +units=m +no_defs");
+ "+proj=utm +zone=31 +ellps=WGS84 +units=m +no_defs +type=crs");
EXPECT_THROW(
crs->exportToWKT(
@@ -6471,7 +6474,8 @@ TEST(io, projparse_longlat) {
" ANGLEUNIT[\"degree\",0.0174532925199433,\n"
" ID[\"EPSG\",9122]]]]";
{
- auto obj = PROJStringParser().createFromPROJString("+proj=longlat");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=longlat +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6481,7 +6485,7 @@ TEST(io, projparse_longlat) {
{
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +datum=WGS84");
+ "+proj=longlat +datum=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6493,8 +6497,8 @@ TEST(io, projparse_longlat) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_datum_NAD83) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +datum=NAD83");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +datum=NAD83 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6522,8 +6526,8 @@ TEST(io, projparse_longlat_datum_NAD83) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_datum_NAD27) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +datum=NAD27");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +datum=NAD27 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6552,7 +6556,7 @@ TEST(io, projparse_longlat_datum_NAD27) {
TEST(io, projparse_longlat_datum_other) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +datum=carthage");
+ "+proj=longlat +datum=carthage +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6580,8 +6584,8 @@ TEST(io, projparse_longlat_datum_other) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_ellps_WGS84) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +ellps=WGS84");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +ellps=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6606,8 +6610,8 @@ TEST(io, projparse_longlat_ellps_WGS84) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_ellps_GRS80) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +ellps=GRS80");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +ellps=GRS80 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6632,8 +6636,8 @@ TEST(io, projparse_longlat_ellps_GRS80) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a_b) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +a=2 +b=1.5");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +b=1.5 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6660,7 +6664,7 @@ TEST(io, projparse_longlat_a_b) {
TEST(io, projparse_longlat_a_rf_WGS84) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +a=6378137 +rf=298.257223563");
+ "+proj=longlat +a=6378137 +rf=298.257223563 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6686,8 +6690,8 @@ TEST(io, projparse_longlat_a_rf_WGS84) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a_rf) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +a=2 +rf=4");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +rf=4 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6712,8 +6716,8 @@ TEST(io, projparse_longlat_a_rf) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a_f_zero) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +a=2 +f=0");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +f=0 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6738,8 +6742,8 @@ TEST(io, projparse_longlat_a_f_zero) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a_f_non_zero) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +a=2 +f=0.5");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +f=0.5 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
@@ -6750,8 +6754,8 @@ TEST(io, projparse_longlat_a_f_non_zero) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a_e) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +a=2 +e=0.5");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +e=0.5 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
@@ -6762,8 +6766,8 @@ TEST(io, projparse_longlat_a_e) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a_es) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +a=2 +es=0.5");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +es=0.5 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
@@ -6774,7 +6778,8 @@ TEST(io, projparse_longlat_a_es) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_R) {
- auto obj = PROJStringParser().createFromPROJString("+proj=longlat +R=2");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=longlat +R=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_TRUE(crs->ellipsoid()->isSphere());
@@ -6784,7 +6789,8 @@ TEST(io, projparse_longlat_R) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_a) {
- auto obj = PROJStringParser().createFromPROJString("+proj=longlat +a=2");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=longlat +a=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_TRUE(crs->ellipsoid()->isSphere());
@@ -6795,7 +6801,7 @@ TEST(io, projparse_longlat_a) {
TEST(io, projparse_longlat_a_override_ellps) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +a=2 +ellps=WGS84");
+ "+proj=longlat +a=2 +ellps=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_TRUE(!crs->ellipsoid()->isSphere());
@@ -6807,8 +6813,8 @@ TEST(io, projparse_longlat_a_override_ellps) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_pm_paris) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=longlat +pm=paris");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +pm=paris +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6835,7 +6841,7 @@ TEST(io, projparse_longlat_pm_paris) {
TEST(io, projparse_longlat_pm_ferro) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=bessel +pm=ferro");
+ "+proj=longlat +ellps=bessel +pm=ferro +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6862,7 +6868,8 @@ TEST(io, projparse_longlat_pm_ferro) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_pm_numeric) {
- auto obj = PROJStringParser().createFromPROJString("+proj=longlat +pm=2.5");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +pm=2.5 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6894,7 +6901,7 @@ TEST(io, projparse_longlat_pm_overriding_datum) {
// of GDAL. So let's keep the ellipsoid part of the datum in that case and
// use the specified prime meridian.
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +datum=WGS84 +pm=ferro");
+ "+proj=longlat +datum=WGS84 +pm=ferro +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->datum()->nameStr(), "Unknown based on WGS 84 ellipsoid");
@@ -6925,7 +6932,7 @@ TEST(io, projparse_longlat_complex) {
TEST(io, projparse_longlat_towgs84_3_terms) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3");
+ "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3 +type=crs");
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6950,14 +6957,15 @@ TEST(io, projparse_longlat_towgs84_3_terms) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,0,0,0,0 +no_defs");
+ "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,0,0,0,0 +no_defs "
+ "+type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_towgs84_7_terms) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,4,5,6,7");
+ "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,4,5,6,7 +type=crs");
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -6985,14 +6993,15 @@ TEST(io, projparse_longlat_towgs84_7_terms) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,4,5,6,7 +no_defs");
+ "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,4,5,6,7 +no_defs "
+ "+type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_nadgrids) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +nadgrids=foo.gsb");
+ "+proj=longlat +ellps=GRS80 +nadgrids=foo.gsb +type=crs");
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7009,14 +7018,14 @@ TEST(io, projparse_longlat_nadgrids) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=longlat +ellps=GRS80 +nadgrids=foo.gsb +no_defs");
+ "+proj=longlat +ellps=GRS80 +nadgrids=foo.gsb +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_geoidgrids) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx");
+ "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +type=crs");
auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7037,14 +7046,15 @@ TEST(io, projparse_longlat_geoidgrids) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +vunits=m +no_defs");
+ "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +vunits=m +no_defs "
+ "+type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_geoidgrids_vunits) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +vunits=ft");
+ "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +vunits=ft +type=crs");
auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7063,7 +7073,7 @@ TEST(io, projparse_longlat_geoidgrids_vunits) {
TEST(io, projparse_longlat_vunits) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +vunits=ft");
+ "+proj=longlat +ellps=GRS80 +vunits=ft +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7081,28 +7091,29 @@ TEST(io, projparse_longlat_vunits) {
// ---------------------------------------------------------------------------
TEST(io, projparse_vunits) {
- auto obj = PROJStringParser().createFromPROJString("+vunits=ft");
+ auto obj = PROJStringParser().createFromPROJString("+vunits=ft +type=crs");
auto crs = nn_dynamic_pointer_cast<VerticalCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+vunits=ft +no_defs");
+ "+vunits=ft +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_vto_meter) {
- auto obj = PROJStringParser().createFromPROJString("+vto_meter=2");
+ auto obj =
+ PROJStringParser().createFromPROJString("+vto_meter=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<VerticalCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+vto_meter=2 +no_defs");
+ "+vto_meter=2 +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_axis_enu) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +axis=enu");
+ "+proj=longlat +ellps=GRS80 +axis=enu +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7129,7 +7140,7 @@ TEST(io, projparse_longlat_axis_enu) {
TEST(io, projparse_longlat_axis_neu) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +axis=neu");
+ "+proj=longlat +ellps=GRS80 +axis=neu +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7155,7 +7166,7 @@ TEST(io, projparse_longlat_axis_neu) {
TEST(io, projparse_longlat_axis_swu) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +axis=swu");
+ "+proj=longlat +ellps=GRS80 +axis=swu +type=crs");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7263,7 +7274,7 @@ TEST(io, projparse_longlat_axisswap) {
TEST(io, projparse_tmerc) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=tmerc +x_0=1 +lat_0=1 +k_0=2");
+ "+proj=tmerc +x_0=1 +lat_0=1 +k_0=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7309,7 +7320,7 @@ TEST(io, projparse_tmerc) {
TEST(io, projparse_tmerc_south_oriented) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=tmerc +axis=wsu +x_0=1 +lat_0=1 +k_0=2");
+ "+proj=tmerc +axis=wsu +x_0=1 +lat_0=1 +k_0=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7363,7 +7374,7 @@ TEST(io, projparse_tmerc_south_oriented) {
TEST(io, projparse_lcc_as_lcc1sp) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=lcc +lat_0=45 +lat_1=45");
+ "+proj=lcc +lat_0=45 +lat_1=45 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7379,7 +7390,7 @@ TEST(io, projparse_lcc_as_lcc1sp) {
TEST(io, projparse_lcc_as_lcc2sp) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=lcc +lat_0=45 +lat_1=46");
+ "+proj=lcc +lat_0=45 +lat_1=46 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7395,7 +7406,7 @@ TEST(io, projparse_lcc_as_lcc2sp) {
TEST(io, projparse_lcc_as_lcc2sp_michigan) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=lcc +lat_0=45 +lat_1=46 +k_0=1.02");
+ "+proj=lcc +lat_0=45 +lat_1=46 +k_0=1.02 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7411,7 +7422,8 @@ TEST(io, projparse_lcc_as_lcc2sp_michigan) {
// ---------------------------------------------------------------------------
TEST(io, projparse_aeqd_guam) {
- auto obj = PROJStringParser().createFromPROJString("+proj=aeqd +guam");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=aeqd +guam +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7425,8 +7437,8 @@ TEST(io, projparse_aeqd_guam) {
// ---------------------------------------------------------------------------
TEST(io, projparse_cea_ellipsoidal) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=cea +ellps=GRS80");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=cea +ellps=GRS80 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7444,7 +7456,8 @@ TEST(io, projparse_cea_ellipsoidal) {
// ---------------------------------------------------------------------------
TEST(io, projparse_geos_sweep_x) {
- auto obj = PROJStringParser().createFromPROJString("+proj=geos +sweep=x");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=geos +sweep=x +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7460,7 +7473,7 @@ TEST(io, projparse_geos_sweep_x) {
// ---------------------------------------------------------------------------
TEST(io, projparse_geos_sweep_y) {
- auto obj = PROJStringParser().createFromPROJString("+proj=geos");
+ auto obj = PROJStringParser().createFromPROJString("+proj=geos +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7477,7 +7490,7 @@ TEST(io, projparse_geos_sweep_y) {
TEST(io, projparse_omerc_nouoff) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=omerc +no_uoff +alpha=2 +gamma=3");
+ "+proj=omerc +no_uoff +alpha=2 +gamma=3 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7500,7 +7513,7 @@ TEST(io, projparse_omerc_nouoff) {
TEST(io, projparse_omerc_tpno) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=omerc +lat_1=1 +lat_2=2 +lon_1=3 +lon_2=4");
+ "+proj=omerc +lat_1=1 +lat_2=2 +lon_1=3 +lon_2=4 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7518,7 +7531,8 @@ TEST(io, projparse_omerc_tpno) {
// ---------------------------------------------------------------------------
TEST(io, projparse_omerc_variant_b) {
- auto obj = PROJStringParser().createFromPROJString("+proj=omerc +alpha=2");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=omerc +alpha=2 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7538,7 +7552,7 @@ TEST(io, projparse_omerc_variant_b) {
TEST(io, projparse_somerc) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=somerc +lat_0=1 +lon_0=2 +k_0=3 +x_0=4 +y_0=5");
+ "+proj=somerc +lat_0=1 +lon_0=2 +k_0=3 +x_0=4 +y_0=5 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7574,7 +7588,8 @@ TEST(io, projparse_somerc) {
// ---------------------------------------------------------------------------
TEST(io, projparse_krovak) {
- auto obj = PROJStringParser().createFromPROJString("+proj=krovak");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=krovak +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7591,8 +7606,8 @@ TEST(io, projparse_krovak) {
// ---------------------------------------------------------------------------
TEST(io, projparse_krovak_axis_swu) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=krovak +axis=swu");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=krovak +axis=swu +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7608,7 +7623,8 @@ TEST(io, projparse_krovak_axis_swu) {
// ---------------------------------------------------------------------------
TEST(io, projparse_etmerc) {
- auto obj = PROJStringParser().createFromPROJString("+proj=etmerc");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=etmerc +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto wkt2 = crs->exportToWKT(
@@ -7623,7 +7639,7 @@ TEST(io, projparse_etmerc) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
"+proj=etmerc +lat_0=0 +lon_0=0 +k=1 +x_0=0 +y_0=0 "
- "+datum=WGS84 +units=m +no_defs");
+ "+datum=WGS84 +units=m +no_defs +type=crs");
auto wkt1 = crs->exportToWKT(
WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
@@ -7636,7 +7652,8 @@ TEST(io, projparse_etmerc) {
// ---------------------------------------------------------------------------
TEST(io, projparse_merc_variant_B) {
- auto obj = PROJStringParser().createFromPROJString("+proj=merc +lat_ts=1");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=merc +lat_ts=1 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7658,7 +7675,7 @@ TEST(io, projparse_merc_variant_B) {
TEST(io, projparse_merc_google_mercator) {
auto obj = PROJStringParser().createFromPROJString(
"+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 "
- "+k=1 +units=m +nadgrids=@null");
+ "+k=1 +units=m +nadgrids=@null +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7675,7 +7692,7 @@ TEST(io, projparse_merc_google_mercator) {
TEST(io, projparse_merc_stere_polar_variant_B) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=stere +lat_0=90 +lat_ts=70");
+ "+proj=stere +lat_0=90 +lat_ts=70 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7694,7 +7711,7 @@ TEST(io, projparse_merc_stere_polar_variant_B) {
TEST(io, projparse_merc_stere_polar_variant_A) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=stere +lat_0=-90 +k=0.994");
+ "+proj=stere +lat_0=-90 +k=0.994 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7713,7 +7730,7 @@ TEST(io, projparse_merc_stere_polar_variant_A) {
TEST(io, projparse_merc_stere_polar_k_and_lat_ts) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=stere +lat_0=90 +lat_ts=90 +k=1");
+ "+proj=stere +lat_0=90 +lat_ts=90 +k=1 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto wkt = crs->exportToWKT(
@@ -7731,21 +7748,22 @@ TEST(io, projparse_merc_stere_polar_k_and_lat_ts) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
"+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
TEST(io, projparse_merc_stere_polar_k_and_lat_ts_incompatible) {
EXPECT_THROW(PROJStringParser().createFromPROJString(
- "+proj=stere +lat_0=90 +lat_ts=70 +k=0.994"),
+ "+proj=stere +lat_0=90 +lat_ts=70 +k=0.994 +type=crs"),
ParsingException);
}
// ---------------------------------------------------------------------------
TEST(io, projparse_merc_stere) {
- auto obj = PROJStringParser().createFromPROJString("+proj=stere +lat_0=30");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=stere +lat_0=30 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7760,7 +7778,8 @@ TEST(io, projparse_merc_stere) {
// ---------------------------------------------------------------------------
TEST(io, projparse_utm) {
- auto obj = PROJStringParser().createFromPROJString("+proj=utm +zone=1");
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=utm +zone=1 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7780,8 +7799,8 @@ TEST(io, projparse_utm) {
// ---------------------------------------------------------------------------
TEST(io, projparse_utm_south) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=utm +zone=1 +south");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=utm +zone=1 +south +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7802,7 +7821,8 @@ TEST(io, projparse_utm_south) {
// ---------------------------------------------------------------------------
TEST(io, projparse_laea_north_pole) {
- auto obj = PROJStringParser().createFromPROJString("+proj=laea +lat_0=90");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=laea +lat_0=90 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7817,7 +7837,8 @@ TEST(io, projparse_laea_north_pole) {
// ---------------------------------------------------------------------------
TEST(io, projparse_laea_south_pole) {
- auto obj = PROJStringParser().createFromPROJString("+proj=laea +lat_0=-90");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=laea +lat_0=-90 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7832,7 +7853,8 @@ TEST(io, projparse_laea_south_pole) {
// ---------------------------------------------------------------------------
TEST(io, projparse_laea_spherical) {
- auto obj = PROJStringParser().createFromPROJString("+proj=laea +R=6371228");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=laea +R=6371228 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->derivingConversion()->method()->getEPSGCode(),
@@ -7855,7 +7877,8 @@ TEST(io, projparse_laea_spherical) {
// ---------------------------------------------------------------------------
TEST(io, projparse_eqc_spherical) {
- auto obj = PROJStringParser().createFromPROJString("+proj=eqc +R=6371228");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=eqc +R=6371228 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->derivingConversion()->method()->getEPSGCode(),
@@ -7879,7 +7902,7 @@ TEST(io, projparse_eqc_spherical) {
TEST(io, projparse_non_earth_ellipsoid) {
std::string input("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +R=1 +units=m "
- "+no_defs");
+ "+no_defs +type=crs");
auto obj = PROJStringParser().createFromPROJString(input);
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -7979,7 +8002,7 @@ TEST(io, projparse_axisswap_unitconvert_proj_unitconvert_numeric_axisswap) {
TEST(io, projparse_projected_units) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=tmerc +x_0=0.304800609601219 +units=us-ft");
+ "+proj=tmerc +x_0=0.304800609601219 +units=us-ft +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -7999,7 +8022,7 @@ TEST(io, projparse_projected_units) {
TEST(io, projparse_projected_to_meter_known) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=tmerc +to_meter=0.304800609601219");
+ "+proj=tmerc +to_meter=0.304800609601219 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -8018,8 +8041,8 @@ TEST(io, projparse_projected_to_meter_known) {
// ---------------------------------------------------------------------------
TEST(io, projparse_projected_to_meter_unknown) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=tmerc +to_meter=0.1234");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=tmerc +to_meter=0.1234 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -8041,8 +8064,8 @@ TEST(io, projparse_projected_to_meter_unknown) {
// ---------------------------------------------------------------------------
TEST(io, projparse_projected_vunits) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=tmerc +vunits=ft");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=tmerc +vunits=ft +type=crs");
auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -8061,7 +8084,8 @@ TEST(io, projparse_projected_vunits) {
TEST(io, projparse_projected_unknown) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=mbt_s +unused_flag +lat_0=45 +lon_0=0 +k=1 +x_0=10 +y_0=0");
+ "+proj=mbt_s +unused_flag +lat_0=45 +lon_0=0 +k=1 +x_0=10 +y_0=0 "
+ "+type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -8106,7 +8130,7 @@ TEST(io, projparse_projected_unknown) {
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=mbt_s +unused_flag +lat_0=45 +lon_0=0 +k=1 +x_0=10 "
- "+y_0=0 +datum=WGS84 +units=m +no_defs");
+ "+y_0=0 +datum=WGS84 +units=m +no_defs +type=crs");
{
auto obj2 = WKTParser().createFromWKT(expected_wkt1);
@@ -8133,8 +8157,8 @@ TEST(io, projparse_projected_unknown) {
// ---------------------------------------------------------------------------
TEST(io, projparse_geocent) {
- auto obj =
- PROJStringParser().createFromPROJString("+proj=geocent +ellps=WGS84");
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=geocent +ellps=WGS84 +type=crs");
auto crs = nn_dynamic_pointer_cast<GeodeticCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -8156,7 +8180,7 @@ TEST(io, projparse_geocent) {
TEST(io, projparse_geocent_towgs84) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=geocent +ellps=WGS84 +towgs84=1,2,3");
+ "+proj=geocent +ellps=WGS84 +towgs84=1,2,3 +type=crs");
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
WKTFormatterNNPtr f(WKTFormatter::create());
@@ -8182,7 +8206,8 @@ TEST(io, projparse_geocent_towgs84) {
crs->exportToPROJString(
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
- "+proj=geocent +ellps=WGS84 +towgs84=1,2,3,0,0,0,0 +units=m +no_defs");
+ "+proj=geocent +ellps=WGS84 +towgs84=1,2,3,0,0,0,0 +units=m +no_defs "
+ "+type=crs");
}
// ---------------------------------------------------------------------------
@@ -8226,7 +8251,7 @@ TEST(io, projparse_cart_unit_numeric) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_wktext) {
- std::string input("+proj=longlat +foo +wktext");
+ std::string input("+proj=longlat +foo +wktext +type=crs");
auto obj = PROJStringParser().createFromPROJString(input);
auto crs = nn_dynamic_pointer_cast<GeodeticCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -8240,7 +8265,7 @@ TEST(io, projparse_longlat_wktext) {
// ---------------------------------------------------------------------------
TEST(io, projparse_geocent_wktext) {
- std::string input("+proj=geocent +foo +wktext");
+ std::string input("+proj=geocent +foo +wktext +type=crs");
auto obj = PROJStringParser().createFromPROJString(input);
auto crs = nn_dynamic_pointer_cast<GeodeticCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -8254,7 +8279,7 @@ TEST(io, projparse_geocent_wktext) {
// ---------------------------------------------------------------------------
TEST(io, projparse_projected_wktext) {
- std::string input("+proj=merc +foo +wktext");
+ std::string input("+proj=merc +foo +wktext +type=crs");
auto obj = PROJStringParser().createFromPROJString(input);
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -8587,7 +8612,7 @@ TEST(io, projparse_longlat_title) {
std::string projString("+title=Ile d'Amsterdam 1963 +proj=longlat "
"+towgs84=109.7530,-528.1330,-362.2440 "
"+a=6378388.0000 +rf=297.0000000000000 +units=m "
- "+no_defs");
+ "+no_defs +type=crs");
auto obj = PROJStringParser().createFromPROJString(projString);
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -8600,7 +8625,7 @@ TEST(io, projparse_longlat_title) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
"+proj=longlat +ellps=intl +towgs84=109.753,-528.133,-362.244,0,0,0,0 "
- "+no_defs");
+ "+no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -8610,7 +8635,8 @@ TEST(io, projparse_projected_title) {
"+title=Amsterdam 1963 +proj=tmerc "
"+towgs84=109.7530,-528.1330,-362.2440 +a=6378388.0000 "
"+rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 "
- "+k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs");
+ "+k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs "
+ "+type=crs");
auto obj = PROJStringParser().createFromPROJString(projString);
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -8623,7 +8649,8 @@ TEST(io, projparse_projected_title) {
PROJStringFormatter::create(PROJStringFormatter::Convention::PROJ_4)
.get()),
"+proj=utm +zone=43 +south +ellps=intl "
- "+towgs84=109.753,-528.133,-362.244,0,0,0,0 +units=m +no_defs");
+ "+towgs84=109.753,-528.133,-362.244,0,0,0,0 +units=m +no_defs "
+ "+type=crs");
}
// ---------------------------------------------------------------------------
@@ -8632,8 +8659,9 @@ TEST(io, projparse_init) {
auto dbContext = DatabaseContext::create();
// Not allowed in non-compatibillity mode
- EXPECT_THROW(PROJStringParser().createFromPROJString("init=epsg:4326"),
- ParsingException);
+ EXPECT_THROW(
+ PROJStringParser().createFromPROJString("init=epsg:4326 +type=crs"),
+ ParsingException);
{
// EPSG:4326 is normally latitude-longitude order with degree,
@@ -8649,7 +8677,8 @@ TEST(io, projparse_init) {
{
// EPSG:3040 is normally northing-easting order, but in compatibillity
// mode it will be easting-northing
- auto obj = createFromUserInput("init=epsg:3040", dbContext, true);
+ auto obj =
+ createFromUserInput("init=epsg:3040 +type=crs", dbContext, true);
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_TRUE(crs->coordinateSystem()->isEquivalentTo(
@@ -8691,11 +8720,12 @@ TEST(io, projparse_init) {
{
auto obj = createFromUserInput(
- "init=epsg:4326 proj=longlat ellps=GRS80", dbContext, true);
+ "init=epsg:4326 proj=longlat ellps=GRS80 +type=crs", dbContext,
+ true);
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=longlat +ellps=GRS80 +no_defs");
+ "+proj=longlat +ellps=GRS80 +no_defs +type=crs");
}
}
@@ -8713,8 +8743,9 @@ TEST(io, projparse_errors) {
EXPECT_THROW(PROJStringParser().createFromPROJString("step"),
ParsingException);
- EXPECT_THROW(PROJStringParser().createFromPROJString("proj=unknown"),
- ParsingException);
+ EXPECT_THROW(
+ PROJStringParser().createFromPROJString("proj=unknown +type=crs"),
+ ParsingException);
EXPECT_THROW(
PROJStringParser().createFromPROJString(
@@ -8733,61 +8764,64 @@ TEST(io, projparse_errors) {
// ---------------------------------------------------------------------------
TEST(io, projparse_longlat_errors) {
- EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=longlat +datum=unknown"),
- ParsingException);
-
- EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=longlat +ellps=unknown"),
- ParsingException);
-
EXPECT_THROW(PROJStringParser().createFromPROJString(
- "+proj=longlat +a=invalid +b=1"),
+ "+proj=longlat +datum=unknown +type=crs"),
ParsingException);
EXPECT_THROW(PROJStringParser().createFromPROJString(
- "+proj=longlat +a=1 +b=invalid"),
+ "+proj=longlat +ellps=unknown +type=crs"),
ParsingException);
EXPECT_THROW(PROJStringParser().createFromPROJString(
- "+proj=longlat +a=invalid +rf=1"),
+ "+proj=longlat +a=invalid +b=1 +type=crs"),
ParsingException);
EXPECT_THROW(PROJStringParser().createFromPROJString(
- "+proj=longlat +a=1 +rf=invalid"),
+ "+proj=longlat +a=1 +b=invalid +type=crs"),
ParsingException);
EXPECT_THROW(PROJStringParser().createFromPROJString(
- "+proj=longlat +a=1 +f=invalid"),
+ "+proj=longlat +a=invalid +rf=1 +type=crs"),
ParsingException);
- EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=longlat +R=invalid"),
- ParsingException);
-
- EXPECT_THROW(PROJStringParser().createFromPROJString("+proj=longlat +b=1"),
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=1 +rf=invalid +type=crs"),
ParsingException);
- EXPECT_THROW(PROJStringParser().createFromPROJString("+proj=longlat +rf=1"),
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=1 +f=invalid +type=crs"),
ParsingException);
- EXPECT_THROW(PROJStringParser().createFromPROJString("+proj=longlat +f=0"),
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +R=invalid +type=crs"),
ParsingException);
EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=longlat +pm=unknown"),
+ PROJStringParser().createFromPROJString("+proj=longlat +b=1 +type=crs"),
ParsingException);
- EXPECT_THROW(
- PROJStringParser().createFromPROJString(
- "+proj=longlat +ellps=GRS80 +towgs84=1.2,2,3,4,5,6,invalid"),
- ParsingException);
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +rf=1 +type=crs"),
+ ParsingException);
EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=longlat +axis=foo"),
+ PROJStringParser().createFromPROJString("+proj=longlat +f=0 +type=crs"),
ParsingException);
EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +pm=unknown +type=crs"),
+ ParsingException);
+
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +ellps=GRS80 "
+ "+towgs84=1.2,2,3,4,5,6,invalid +type=crs"),
+ ParsingException);
+
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=longlat +axis=foo +type=crs"),
+ ParsingException);
+
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
"+proj=pipeline +step +proj=longlat +ellps=GRS80 +step "
"+proj=unitconvert +xy_in=rad +xy_out=foo"),
ParsingException);
@@ -8806,15 +8840,15 @@ TEST(io, projparse_longlat_errors) {
// ---------------------------------------------------------------------------
TEST(io, projparse_projected_errors) {
- EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=tmerc +units=foo"),
- ParsingException);
- EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=tmerc +x_0=foo"),
- ParsingException);
- EXPECT_THROW(
- PROJStringParser().createFromPROJString("+proj=tmerc +lat_0=foo"),
- ParsingException);
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=tmerc +units=foo +type=crs"),
+ ParsingException);
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=tmerc +x_0=foo +type=crs"),
+ ParsingException);
+ EXPECT_THROW(PROJStringParser().createFromPROJString(
+ "+proj=tmerc +lat_0=foo +type=crs"),
+ ParsingException);
// Inconsistent pm values between geogCRS and projectedCRS
EXPECT_THROW(PROJStringParser().createFromPROJString(
"+proj=pipeline +step +proj=longlat +ellps=WGS84 "
@@ -8828,7 +8862,7 @@ TEST(io, createFromUserInput) {
auto dbContext = DatabaseContext::create();
EXPECT_THROW(createFromUserInput("foo", nullptr), ParsingException);
EXPECT_THROW(createFromUserInput("GEOGCRS", nullptr), ParsingException);
- EXPECT_THROW(createFromUserInput("+proj=unhandled", nullptr),
+ EXPECT_THROW(createFromUserInput("+proj=unhandled +type=crs", nullptr),
ParsingException);
EXPECT_THROW(createFromUserInput("EPSG:4326", nullptr), ParsingException);
EXPECT_THROW(
diff --git a/test/unit/test_operation.cpp b/test/unit/test_operation.cpp
index bdadd830..3cf633b6 100644
--- a/test/unit/test_operation.cpp
+++ b/test/unit/test_operation.cpp
@@ -1378,7 +1378,7 @@ TEST(operation, tmerc_south_oriented_export) {
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=tmerc +axis=wsu +lat_0=0 +lon_0=29 +k=1 +x_0=0 +y_0=0 "
- "+ellps=WGS84 +units=m +no_defs");
+ "+ellps=WGS84 +units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -1630,7 +1630,7 @@ TEST(operation, bonne_export) {
ASSERT_TRUE(crs != nullptr);
EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=bonne +lat_1=1 +lon_0=2 +x_0=3 +y_0=4 +ellps=WGS84 "
- "+units=m +no_defs");
+ "+units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -2127,7 +2127,7 @@ TEST(operation, createEquidistantCylindricalSpherical) {
TEST(operation, equidistant_cylindrical_lat_0) {
auto obj = PROJStringParser().createFromPROJString(
- "+proj=eqc +ellps=sphere +lat_0=-2 +lat_ts=1 +lon_0=-10");
+ "+proj=eqc +ellps=sphere +lat_0=-2 +lat_ts=1 +lon_0=-10 +type=crs");
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -2141,7 +2141,7 @@ TEST(operation, equidistant_cylindrical_lat_0) {
.get());
EXPECT_EQ(projString,
"+proj=eqc +lat_ts=1 +lat_0=-2 +lon_0=-10 +x_0=0 +y_0=0 "
- "+ellps=sphere +units=m +no_defs");
+ "+ellps=sphere +units=m +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -3073,9 +3073,10 @@ TEST(operation, webmerc_export) {
"+proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=webmerc "
"+lat_0=0 +lon_0=2 +x_0=3 +y_0=4 +ellps=WGS84");
- EXPECT_EQ(projCRS->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=2 +x_0=3 "
- "+y_0=4 +k=1 +units=m +nadgrids=@null +wktext +no_defs");
+ EXPECT_EQ(
+ projCRS->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=2 +x_0=3 "
+ "+y_0=4 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs");
}
// ---------------------------------------------------------------------------
@@ -3172,9 +3173,10 @@ TEST(operation, webmerc_import_from_GDAL_wkt1_EPSG_3785_deprecated) {
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
- EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 "
- "+y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 "
+ "+y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs");
auto convGot = crs->derivingConversion();
@@ -3237,9 +3239,10 @@ TEST(operation, webmerc_import_from_WKT2_EPSG_3785_deprecated) {
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
- EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
- "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 "
- "+y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 "
+ "+y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs");
EXPECT_EQ(
crs->exportToWKT(
@@ -4080,7 +4083,7 @@ TEST(operation, laborde_oblique_mercator) {
// Content of EPSG:29701 "Tananarive (Paris) / Laborde Grid"
auto projString = "+proj=labrd +lat_0=-18.9 +lon_0=44.1 +azi=18.9 "
"+k=0.9995 +x_0=400000 +y_0=800000 +ellps=intl +pm=paris "
- "+units=m +no_defs";
+ "+units=m +no_defs +type=crs";
auto obj = PROJStringParser().createFromPROJString(projString);
auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
ASSERT_TRUE(crs != nullptr);
@@ -4694,13 +4697,13 @@ TEST(operation, geogCRS_to_geogCRS_init_IGNF_to_init_IGNF_context) {
TEST(operation, geogCRS_to_geogCRS_3D) {
- auto geogcrs_m_obj =
- PROJStringParser().createFromPROJString("+proj=longlat +vunits=m");
+ auto geogcrs_m_obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +vunits=m +type=crs");
auto geogcrs_m = nn_dynamic_pointer_cast<CRS>(geogcrs_m_obj);
ASSERT_TRUE(geogcrs_m != nullptr);
- auto geogcrs_ft_obj =
- PROJStringParser().createFromPROJString("+proj=longlat +vunits=ft");
+ auto geogcrs_ft_obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +vunits=ft +type=crs");
auto geogcrs_ft = nn_dynamic_pointer_cast<CRS>(geogcrs_ft_obj);
ASSERT_TRUE(geogcrs_ft != nullptr);
@@ -4721,7 +4724,7 @@ TEST(operation, geogCRS_to_geogCRS_3D) {
}
auto geogcrs_m_with_pm_obj = PROJStringParser().createFromPROJString(
- "+proj=longlat +pm=paris +vunits=m");
+ "+proj=longlat +pm=paris +vunits=m +type=crs");
auto geogcrs_m_with_pm =
nn_dynamic_pointer_cast<CRS>(geogcrs_m_with_pm_obj);
ASSERT_TRUE(geogcrs_m_with_pm != nullptr);
@@ -5345,14 +5348,14 @@ TEST(operation, boundCRS_of_geogCRS_to_unrelated_geogCRS) {
// ---------------------------------------------------------------------------
TEST(operation, createOperation_boundCRS_identified_by_datum) {
- auto objSrc =
- PROJStringParser().createFromPROJString("+proj=longlat +datum=WGS84");
+ auto objSrc = PROJStringParser().createFromPROJString(
+ "+proj=longlat +datum=WGS84 +type=crs");
auto src = nn_dynamic_pointer_cast<GeographicCRS>(objSrc);
ASSERT_TRUE(src != nullptr);
auto objDest = PROJStringParser().createFromPROJString(
"+proj=utm +zone=32 +a=6378249.2 +b=6356515 "
- "+towgs84=-263.0,6.0,431.0 +no_defs");
+ "+towgs84=-263.0,6.0,431.0 +no_defs +type=crs");
auto dest = nn_dynamic_pointer_cast<BoundCRS>(objDest);
ASSERT_TRUE(dest != nullptr);
@@ -5379,12 +5382,12 @@ TEST(operation, createOperation_boundCRS_identified_by_datum) {
TEST(operation, boundCRS_of_clrk_66_geogCRS_to_nad83_geogCRS) {
auto objSrc = PROJStringParser().createFromPROJString(
- "+proj=latlong +ellps=clrk66 +nadgrids=ntv1_can.dat,conus");
+ "+proj=latlong +ellps=clrk66 +nadgrids=ntv1_can.dat,conus +type=crs");
auto src = nn_dynamic_pointer_cast<CRS>(objSrc);
ASSERT_TRUE(src != nullptr);
- auto objDest =
- PROJStringParser().createFromPROJString("+proj=latlong +datum=NAD83");
+ auto objDest = PROJStringParser().createFromPROJString(
+ "+proj=latlong +datum=NAD83 +type=crs");
auto dest = nn_dynamic_pointer_cast<CRS>(objDest);
ASSERT_TRUE(dest != nullptr);
@@ -5401,12 +5404,13 @@ TEST(operation, boundCRS_of_clrk_66_geogCRS_to_nad83_geogCRS) {
TEST(operation, boundCRS_of_clrk_66_projCRS_to_nad83_geogCRS) {
auto objSrc = PROJStringParser().createFromPROJString(
- "+proj=utm +zone=17 +ellps=clrk66 +nadgrids=ntv1_can.dat,conus");
+ "+proj=utm +zone=17 +ellps=clrk66 +nadgrids=ntv1_can.dat,conus "
+ "+type=crs");
auto src = nn_dynamic_pointer_cast<CRS>(objSrc);
ASSERT_TRUE(src != nullptr);
- auto objDest =
- PROJStringParser().createFromPROJString("+proj=latlong +datum=NAD83");
+ auto objDest = PROJStringParser().createFromPROJString(
+ "+proj=latlong +datum=NAD83 +type=crs");
auto dest = nn_dynamic_pointer_cast<CRS>(objDest);
ASSERT_TRUE(dest != nullptr);
@@ -5553,12 +5557,12 @@ TEST(operation, boundCRS_to_boundCRS_unralated_hub) {
TEST(operation, boundCRS_of_projCRS_towgs84_to_boundCRS_of_projCRS_nadgrids) {
auto objSrc = PROJStringParser().createFromPROJString(
"+proj=utm +zone=15 +datum=NAD83 +units=m +no_defs +ellps=GRS80 "
- "+towgs84=0,0,0");
+ "+towgs84=0,0,0 +type=crs");
auto src = nn_dynamic_pointer_cast<CRS>(objSrc);
ASSERT_TRUE(src != nullptr);
auto objDst = PROJStringParser().createFromPROJString(
"+proj=utm +zone=15 +datum=NAD27 +units=m +no_defs +ellps=clrk66 "
- "+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat");
+ "+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat +type=crs");
auto dst = nn_dynamic_pointer_cast<CRS>(objDst);
ASSERT_TRUE(dst != nullptr);
auto op = CoordinateOperationFactory::create()->createOperation(
@@ -6140,13 +6144,13 @@ TEST(operation, vertCRS_to_vertCRS) {
TEST(operation, compoundCRS_to_geogCRS_3D) {
- auto compoundcrs_ft_obj =
- PROJStringParser().createFromPROJString("+proj=merc +vunits=ft");
+ auto compoundcrs_ft_obj = PROJStringParser().createFromPROJString(
+ "+proj=merc +vunits=ft +type=crs");
auto compoundcrs_ft = nn_dynamic_pointer_cast<CRS>(compoundcrs_ft_obj);
ASSERT_TRUE(compoundcrs_ft != nullptr);
- auto geogcrs_m_obj =
- PROJStringParser().createFromPROJString("+proj=longlat +vunits=m");
+ auto geogcrs_m_obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +vunits=m +type=crs");
auto geogcrs_m = nn_dynamic_pointer_cast<CRS>(geogcrs_m_obj);
ASSERT_TRUE(geogcrs_m != nullptr);
@@ -6300,7 +6304,7 @@ TEST(operation, createOperation_on_crs_with_canonical_bound_crs) {
TEST(operation, createOperation_fallback_to_proj4_strings) {
auto objDest = PROJStringParser().createFromPROJString(
- "+proj=longlat +geoc +ellps=WGS84");
+ "+proj=longlat +geoc +ellps=WGS84 +type=crs");
auto dest = nn_dynamic_pointer_cast<GeographicCRS>(objDest);
ASSERT_TRUE(dest != nullptr);