aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-03-13 10:52:42 +0100
committerEven Rouault <even.rouault@spatialys.com>2021-03-15 16:16:31 +0100
commite33f6b5eccdb0c66f5ff81c07a619708ebf9ec31 (patch)
tree38f43949bb7a63eab6db5fe0dd146ba951a4ccf3
parenta234207957043503814a6a3eebc497d2e471dda3 (diff)
downloadPROJ-e33f6b5eccdb0c66f5ff81c07a619708ebf9ec31.tar.gz
PROJ-e33f6b5eccdb0c66f5ff81c07a619708ebf9ec31.zip
CRS::identify(): take into account allowed authority to identify hard-coded WGS84-based CRSs
-rw-r--r--src/iso19111/crs.cpp69
1 files changed, 41 insertions, 28 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp
index 65f2087d..7c58640e 100644
--- a/src/iso19111/crs.cpp
+++ b/src/iso19111/crs.cpp
@@ -39,6 +39,7 @@
#include "proj/coordinateoperation.hpp"
#include "proj/coordinatesystem.hpp"
#include "proj/io.hpp"
+#include "proj/metadata.hpp"
#include "proj/util.hpp"
#include "proj/internal/coordinatesystem_internal.hpp"
@@ -446,7 +447,8 @@ CRSNNPtr CRS::createBoundCRSToWGS84IfPossible(
crs_authority = *(l_identifiers[0]->codeSpace());
}
- auto authorities = dbContext->getAllowedAuthorities(crs_authority, "EPSG");
+ auto authorities = dbContext->getAllowedAuthorities(
+ crs_authority, metadata::Identifier::EPSG);
if (authorities.empty()) {
authorities.emplace_back();
}
@@ -1686,8 +1688,8 @@ void GeodeticCRS::_exportToWKT(io::WKTFormatter *formatter) const {
auto geogCRS2D = demoteTo2D(std::string(), dbContext);
if (dbContext) {
- const auto res = geogCRS2D->identify(
- io::AuthorityFactory::create(NN_NO_CHECK(dbContext), "EPSG"));
+ const auto res = geogCRS2D->identify(io::AuthorityFactory::create(
+ NN_NO_CHECK(dbContext), metadata::Identifier::EPSG));
if (res.size() == 1) {
const auto &front = res.front();
if (front.second == 100) {
@@ -2086,26 +2088,31 @@ GeodeticCRS::identify(const io::AuthorityFactoryPtr &authorityFactory) const {
? util::IComparable::Criterion::EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS
: util::IComparable::Criterion::EQUIVALENT;
- const GeographicCRSNNPtr candidatesCRS[] = {GeographicCRS::EPSG_4326,
- GeographicCRS::EPSG_4267,
- GeographicCRS::EPSG_4269};
- for (const auto &crs : candidatesCRS) {
- const bool nameEquivalent = metadata::Identifier::isEquivalentName(
- thisName.c_str(), crs->nameStr().c_str());
- const bool nameEqual = thisName == crs->nameStr();
- const bool isEq = _isEquivalentTo(crs.get(), crsCriterion, dbContext);
- if (nameEquivalent && isEq && (!authorityFactory || nameEqual)) {
- res.emplace_back(util::nn_static_pointer_cast<GeodeticCRS>(crs),
- nameEqual ? 100 : 90);
- return res;
- } else if (nameEqual && !isEq && !authorityFactory) {
- res.emplace_back(util::nn_static_pointer_cast<GeodeticCRS>(crs),
- 25);
- return res;
- } else if (isEq && !authorityFactory) {
- res.emplace_back(util::nn_static_pointer_cast<GeodeticCRS>(crs),
- 70);
- return res;
+ if (authorityFactory == nullptr ||
+ authorityFactory->getAuthority().empty() ||
+ authorityFactory->getAuthority() == metadata::Identifier::EPSG) {
+ const GeographicCRSNNPtr candidatesCRS[] = {GeographicCRS::EPSG_4326,
+ GeographicCRS::EPSG_4267,
+ GeographicCRS::EPSG_4269};
+ for (const auto &crs : candidatesCRS) {
+ const bool nameEquivalent = metadata::Identifier::isEquivalentName(
+ thisName.c_str(), crs->nameStr().c_str());
+ const bool nameEqual = thisName == crs->nameStr();
+ const bool isEq =
+ _isEquivalentTo(crs.get(), crsCriterion, dbContext);
+ if (nameEquivalent && isEq && (!authorityFactory || nameEqual)) {
+ res.emplace_back(util::nn_static_pointer_cast<GeodeticCRS>(crs),
+ nameEqual ? 100 : 90);
+ return res;
+ } else if (nameEqual && !isEq && !authorityFactory) {
+ res.emplace_back(util::nn_static_pointer_cast<GeodeticCRS>(crs),
+ 25);
+ return res;
+ } else if (isEq && !authorityFactory) {
+ res.emplace_back(util::nn_static_pointer_cast<GeodeticCRS>(crs),
+ 70);
+ return res;
+ }
}
}
@@ -3645,8 +3652,8 @@ void ProjectedCRS::_exportToWKT(io::WKTFormatter *formatter) const {
if (axisList.size() == 3 && !(isWKT2 && formatter->use2019Keywords())) {
auto projCRS2D = demoteTo2D(std::string(), dbContext);
if (dbContext) {
- const auto res = projCRS2D->identify(
- io::AuthorityFactory::create(NN_NO_CHECK(dbContext), "EPSG"));
+ const auto res = projCRS2D->identify(io::AuthorityFactory::create(
+ NN_NO_CHECK(dbContext), metadata::Identifier::EPSG));
if (res.size() == 1) {
const auto &front = res.front();
if (front.second == 100) {
@@ -4164,19 +4171,25 @@ ProjectedCRS::identify(const io::AuthorityFactoryPtr &authorityFactory) const {
? 90
: 70;
};
- auto computeUTMCRSName = [](const char *base, int l_zone, bool l_north) {
- return base + toString(l_zone) + (l_north ? "N" : "S");
- };
const auto &conv = derivingConversionRef();
const auto &cs = coordinateSystem();
if (baseRes.size() == 1 && baseRes.front().second >= 70 &&
+ (authorityFactory == nullptr ||
+ authorityFactory->getAuthority().empty() ||
+ authorityFactory->getAuthority() == metadata::Identifier::EPSG) &&
conv->isUTM(zone, north) &&
cs->_isEquivalentTo(
cs::CartesianCS::createEastingNorthing(common::UnitOfMeasure::METRE)
.get(),
util::IComparable::Criterion::EQUIVALENT, dbContext)) {
+
+ auto computeUTMCRSName = [](const char *base, int l_zone,
+ bool l_north) {
+ return base + toString(l_zone) + (l_north ? "N" : "S");
+ };
+
if (baseRes.front().first->_isEquivalentTo(
GeographicCRS::EPSG_4326.get(),
util::IComparable::Criterion::EQUIVALENT, dbContext)) {