aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-11-17 20:11:17 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-11-17 20:13:28 +0100
commita8c1588d43fccdbc3b65448f2c7af6472fa6519b (patch)
tree1a678f146a94d1a3d859dcde291b29c40e447f33
parent940bb7447647631676b90b03431aa88cb88fdd2d (diff)
downloadPROJ-a8c1588d43fccdbc3b65448f2c7af6472fa6519b.tar.gz
PROJ-a8c1588d43fccdbc3b65448f2c7af6472fa6519b.zip
createOperations(): remove the concept of geodetic_datum_preferred_hub
This was introduced in 63857c92b271bbcd10df0a032304982011acb2a9. Due to the fix done in the previous commit, we can mostly revert the above commit. We just keep the added tests and the custom WGS 84<-->WGS 84 (Gxxxx) null transformations.
-rw-r--r--data/sql/customizations.sql9
-rw-r--r--data/sql/proj_db_table_defs.sql13
-rw-r--r--include/proj/io.hpp4
-rw-r--r--src/iso19111/coordinateoperation.cpp129
-rw-r--r--src/iso19111/factory.cpp23
5 files changed, 0 insertions, 178 deletions
diff --git a/data/sql/customizations.sql b/data/sql/customizations.sql
index 6301bda9..8003c921 100644
--- a/data/sql/customizations.sql
+++ b/data/sql/customizations.sql
@@ -66,15 +66,6 @@ INSERT INTO "axis" VALUES('PROJ','1','Easting','E','east','PROJ','ENh',1,'EPSG',
INSERT INTO "axis" VALUES('PROJ','2','Northing','N','north','PROJ','ENh',2,'EPSG','9001');
INSERT INTO "axis" VALUES('PROJ','3','Ellipsoidal height','h','up','PROJ','ENh',2,'EPSG','9001');
----- Preferred hub for geodetic datum -----
-
-INSERT INTO "geodetic_datum_preferred_hub" VALUES('EPSG','1152','EPSG','6326'); -- WGS84 (G730) to WGS84
-INSERT INTO "geodetic_datum_preferred_hub" VALUES('EPSG','1153','EPSG','6326'); -- WGS84 (G873) to WGS84
-INSERT INTO "geodetic_datum_preferred_hub" VALUES('EPSG','1154','EPSG','6326'); -- WGS84 (G1150) to WGS84
-INSERT INTO "geodetic_datum_preferred_hub" VALUES('EPSG','1155','EPSG','6326'); -- WGS84 (G1674) to WGS84
-INSERT INTO "geodetic_datum_preferred_hub" VALUES('EPSG','1156','EPSG','6326'); -- WGS84 (G1762) to WGS84
-INSERT INTO "geodetic_datum_preferred_hub" VALUES('EPSG','1166','EPSG','6326'); -- WGS84 (Transit) to WGS84
-
-- Consider all WGS84 related CRS are equivalent with an accuracy of 2m
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G730','WGS 84 to WGS 84 (G730)','','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9053','EPSG','1262',2.0,0,0,0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'',0);
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G873','WGS 84 to WGS 84 (G873)','','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9054','EPSG','1262',2.0,0,0,0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'',0);
diff --git a/data/sql/proj_db_table_defs.sql b/data/sql/proj_db_table_defs.sql
index a97e75a8..ee91aa3d 100644
--- a/data/sql/proj_db_table_defs.sql
+++ b/data/sql/proj_db_table_defs.sql
@@ -126,19 +126,6 @@ FOR EACH ROW BEGIN
WHERE EXISTS(SELECT 1 FROM area WHERE area.auth_name = NEW.area_of_use_auth_name AND area.code = NEW.area_of_use_code AND area.deprecated != 0) AND NEW.deprecated = 0;
END;
--- indicates that if there is no transformation from/into (src_auth_name, src_code),
--- a research going through (hub_auth_name, hub_code) should be made
-CREATE TABLE geodetic_datum_preferred_hub(
- src_auth_name TEXT NOT NULL CHECK (length(src_auth_name) >= 1),
- src_code TEXT NOT NULL CHECK (length(src_code) >= 1),
- hub_auth_name TEXT NOT NULL CHECK (length(hub_auth_name) >= 1),
- hub_code TEXT NOT NULL CHECK (length(hub_code) >= 1),
-
- CONSTRAINT unique_geodetic_datum_preferred_hub UNIQUE (src_auth_name, src_code, hub_auth_name, hub_code),
- CONSTRAINT fk_geodetic_datum_preferred_hub_src FOREIGN KEY (src_auth_name, src_code) REFERENCES geodetic_datum(auth_name, code),
- CONSTRAINT fk_geodetic_datum_preferred_hub_src FOREIGN KEY (hub_auth_name, hub_code) REFERENCES geodetic_datum(auth_name, code)
-);
-
CREATE TABLE vertical_datum (
auth_name TEXT NOT NULL CHECK (length(auth_name) >= 1),
code TEXT NOT NULL CHECK (length(code) >= 1),
diff --git a/include/proj/io.hpp b/include/proj/io.hpp
index 060ab128..52ffebad 100644
--- a/include/proj/io.hpp
+++ b/include/proj/io.hpp
@@ -1116,10 +1116,6 @@ class PROJ_GCC_DLL AuthorityFactory {
createCoordinateReferenceSystem(const std::string &code,
bool allowCompound) const;
- PROJ_INTERNAL std::list<datum::GeodeticReferenceFrameNNPtr>
- getPreferredHubGeodeticReferenceFrames(
- const std::string &geodeticReferenceFrameCode) const;
-
PROJ_INTERNAL std::vector<operation::CoordinateOperationNNPtr>
getTransformationsForGeoid(const std::string &geoidName,
bool usePROJAlternativeGridNames) const;
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index 872ef047..937ba34f 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -10428,7 +10428,6 @@ struct CoordinateOperationFactory::Private {
const metadata::ExtentPtr &extent2;
const CoordinateOperationContextNNPtr &context;
bool inCreateOperationsWithDatumPivotAntiRecursion = false;
- bool inCreateOperationsThroughPreferredHub = false;
bool inCreateOperationsGeogToVertWithAlternativeGeog = false;
bool inCreateOperationsGeogToVertWithIntermediateVert = false;
bool skipHorizontalTransformation = false;
@@ -10579,12 +10578,6 @@ struct CoordinateOperationFactory::Private {
const crs::GeodeticCRS *geodSrc, const crs::GeodeticCRS *geodDst,
Context &context);
- static void createOperationsThroughPreferredHub(
- std::vector<CoordinateOperationNNPtr> &res,
- const crs::CRSNNPtr &sourceCRS, const crs::CRSNNPtr &targetCRS,
- const crs::GeodeticCRS *geodSrc, const crs::GeodeticCRS *geodDst,
- Context &context);
-
static bool
hasPerfectAccuracyResult(const std::vector<CoordinateOperationNNPtr> &res,
const Context &context);
@@ -12451,118 +12444,6 @@ void CoordinateOperationFactory::Private::createOperationsWithDatumPivot(
// ---------------------------------------------------------------------------
-void CoordinateOperationFactory::Private::createOperationsThroughPreferredHub(
- std::vector<CoordinateOperationNNPtr> &res, const crs::CRSNNPtr &sourceCRS,
- const crs::CRSNNPtr &targetCRS, const crs::GeodeticCRS *geodSrc,
- const crs::GeodeticCRS *geodDst, Private::Context &context) {
-
- const auto &srcDatum = geodSrc->datum();
- const auto &dstDatum = geodDst->datum();
-
- if (!srcDatum || !dstDatum)
- return;
- const auto &srcDatumIds = srcDatum->identifiers();
- const auto &dstDatumIds = dstDatum->identifiers();
- if (srcDatumIds.empty() || dstDatumIds.empty())
- return;
-
- const auto &authFactory = context.context->getAuthorityFactory();
-
- const auto srcAuthFactory = io::AuthorityFactory::create(
- authFactory->databaseContext(), *(srcDatumIds.front()->codeSpace()));
- const auto srcPreferredHubs =
- srcAuthFactory->getPreferredHubGeodeticReferenceFrames(
- srcDatumIds.front()->code());
-
- const auto dstAuthFactory = io::AuthorityFactory::create(
- authFactory->databaseContext(), *(dstDatumIds.front()->codeSpace()));
- const auto dstPreferredHubs =
- dstAuthFactory->getPreferredHubGeodeticReferenceFrames(
- dstDatumIds.front()->code());
- if (srcPreferredHubs.empty() && dstPreferredHubs.empty())
- return;
-
- // Currently if we have prefered hubs for both source and target, we
- // will use only the one for target, arbitrarily... We could use boths
- // but that would complicate things.
- if (!srcPreferredHubs.empty() && dstPreferredHubs.empty()) {
- std::vector<CoordinateOperationNNPtr> resTmp;
- createOperationsThroughPreferredHub(resTmp, targetCRS, sourceCRS,
- geodDst, geodSrc, context);
- if (!resTmp.empty()) {
- resTmp = applyInverse(resTmp);
- res.insert(res.end(), resTmp.begin(), resTmp.end());
- }
- return;
- }
- assert(!dstPreferredHubs.empty());
-
-#ifdef TRACE_CREATE_OPERATIONS
- ENTER_BLOCK("createOperationsThroughPreferredHub(" +
- objectAsStr(sourceCRS.get()) + " --> " +
- objectAsStr(targetCRS.get()) + ")");
-#endif
-
- struct AntiRecursionGuard {
- Context &context;
-
- explicit AntiRecursionGuard(Context &contextIn) : context(contextIn) {
- assert(!context.inCreateOperationsThroughPreferredHub);
- context.inCreateOperationsThroughPreferredHub = true;
- }
-
- ~AntiRecursionGuard() {
- context.inCreateOperationsThroughPreferredHub = false;
- }
- };
- AntiRecursionGuard guard(context);
-
- std::vector<crs::CRSNNPtr> candidatesIntermCRS;
- for (const auto &datumHub : dstPreferredHubs) {
- auto candidates =
- findCandidateGeodCRSForDatum(authFactory, geodDst, datumHub.get());
- bool addedGeog2D = false;
- for (const auto &intermCRS : candidates) {
- auto geogCRS = dynamic_cast<crs::GeographicCRS *>(intermCRS.get());
- if (geogCRS &&
- geogCRS->coordinateSystem()->axisList().size() == 2) {
- candidatesIntermCRS.emplace_back(intermCRS);
- addedGeog2D = true;
- break;
- }
- }
- if (!addedGeog2D) {
- candidatesIntermCRS.insert(candidatesIntermCRS.end(),
- candidates.begin(), candidates.end());
- }
- }
-
- for (const auto &intermCRS : candidatesIntermCRS) {
-#ifdef TRACE_CREATE_OPERATIONS
- ENTER_BLOCK("try " + objectAsStr(sourceCRS.get()) + "->" +
- objectAsStr(intermCRS.get()) + "->" +
- objectAsStr(targetCRS.get()) + ")");
-#endif
- const auto opsFirst = createOperations(sourceCRS, intermCRS, context);
- const auto opsLast = createOperations(intermCRS, targetCRS, context);
- for (const auto &opFirst : opsFirst) {
- for (const auto &opLast : opsLast) {
- if (!opFirst->hasBallparkTransformation() ||
- !opLast->hasBallparkTransformation()) {
- try {
- res.emplace_back(
- ConcatenatedOperation::createComputeMetadata(
- {opFirst, opLast}, !allowEmptyIntersection));
- } catch (const InvalidOperationEmptyIntersection &) {
- }
- }
- }
- }
- }
-}
-
-// ---------------------------------------------------------------------------
-
static CoordinateOperationNNPtr
createBallparkGeocentricTranslation(const crs::CRSNNPtr &sourceCRS,
const crs::CRSNNPtr &targetCRS) {
@@ -12895,16 +12776,6 @@ bool CoordinateOperationFactory::Private::createOperationsFromDatabase(
res.insert(res.end(), resWithIntermediate.begin(),
resWithIntermediate.end());
doFilterAndCheckPerfectOp = !res.empty();
-
- // If transforming from/to WGS84 (Gxxxx), try through 'neutral'
- // WGS84
- if (res.empty() && geodSrc && geodDst &&
- !context.inCreateOperationsThroughPreferredHub &&
- !context.inCreateOperationsWithDatumPivotAntiRecursion) {
- createOperationsThroughPreferredHub(res, sourceCRS, targetCRS,
- geodSrc, geodDst, context);
- doFilterAndCheckPerfectOp = !res.empty();
- }
}
if (doFilterAndCheckPerfectOp) {
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp
index b55efb3c..309e778a 100644
--- a/src/iso19111/factory.cpp
+++ b/src/iso19111/factory.cpp
@@ -5384,29 +5384,6 @@ AuthorityFactory::createCompoundCRSFromExisting(
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
-std::list<datum::GeodeticReferenceFrameNNPtr>
-AuthorityFactory::getPreferredHubGeodeticReferenceFrames(
- const std::string &geodeticReferenceFrameCode) const {
- std::list<datum::GeodeticReferenceFrameNNPtr> res;
-
- const std::string sql("SELECT hub_auth_name, hub_code FROM "
- "geodetic_datum_preferred_hub WHERE "
- "src_auth_name = ? AND src_code = ?");
- auto sqlRes = d->run(sql, {d->authority(), geodeticReferenceFrameCode});
- for (const auto &row : sqlRes) {
- const auto &auth_name = row[0];
- const auto &code = row[1];
- res.emplace_back(
- d->createFactory(auth_name)->createGeodeticDatum(code));
- }
-
- return res;
-}
-//! @endcond
-
-// ---------------------------------------------------------------------------
-
-//! @cond Doxygen_Suppress
std::vector<operation::CoordinateOperationNNPtr>
AuthorityFactory::getTransformationsForGeoid(
const std::string &geoidName, bool usePROJAlternativeGridNames) const {