Skip to content

Commit 28e35de

Browse files
committed
Add a way to skip inconsistently defined operations in createFromCoordinateReferenceSystemCodes() and createFromCRSCodesWithIntermediates()
1 parent 9ecb3a4 commit 28e35de

File tree

1 file changed

+140
-81
lines changed

1 file changed

+140
-81
lines changed

src/iso19111/factory.cpp

Lines changed: 140 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -6772,19 +6772,30 @@ AuthorityFactory::createFromCoordinateReferenceSystemCodes(
67726772
const auto &auth_name = row[4];
67736773
const auto &code = row[5];
67746774
const auto &table_name = row[6];
6775-
auto op = d->createFactory(auth_name)->createCoordinateOperation(
6776-
code, true, usePROJAlternativeGridNames, table_name);
6777-
if (tryReverseOrder &&
6778-
(!sourceCRSAuthName.empty()
6779-
? (source_crs_auth_name != sourceCRSAuthName ||
6780-
source_crs_code != sourceCRSCode)
6781-
: (target_crs_auth_name != targetCRSAuthName ||
6782-
target_crs_code != targetCRSCode))) {
6783-
op = op->inverse();
6784-
}
6785-
if (!discardIfMissingGrid ||
6786-
!d->rejectOpDueToMissingGrid(op, considerKnownGridsAsAvailable)) {
6787-
list.emplace_back(op);
6775+
try {
6776+
auto op = d->createFactory(auth_name)->createCoordinateOperation(
6777+
code, true, usePROJAlternativeGridNames, table_name);
6778+
if (tryReverseOrder &&
6779+
(!sourceCRSAuthName.empty()
6780+
? (source_crs_auth_name != sourceCRSAuthName ||
6781+
source_crs_code != sourceCRSCode)
6782+
: (target_crs_auth_name != targetCRSAuthName ||
6783+
target_crs_code != targetCRSCode))) {
6784+
op = op->inverse();
6785+
}
6786+
if (!discardIfMissingGrid ||
6787+
!d->rejectOpDueToMissingGrid(op,
6788+
considerKnownGridsAsAvailable)) {
6789+
list.emplace_back(op);
6790+
}
6791+
} catch (const std::exception &e) {
6792+
// Mostly for debugging purposes when using an inconsistent
6793+
// database
6794+
if (getenv("PROJ_IGNORE_INSTANTIATION_ERRORS")) {
6795+
fprintf(stderr, "Ignoring invalid operation: %s\n", e.what());
6796+
} else {
6797+
throw;
6798+
}
67886799
}
67896800
}
67906801
d->context()->d->cache(cacheKey, list);
@@ -7184,24 +7195,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
71847195
const auto &auth_name2 = row[5];
71857196
const auto &code2 = row[6];
71867197
// const auto &accuracy2 = row[7];
7187-
auto op1 = d->createFactory(auth_name1)
7188-
->createCoordinateOperation(
7189-
code1, true, usePROJAlternativeGridNames, table1);
7190-
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7191-
targetCRSAuthName, targetCRSCode)) {
7192-
continue;
7193-
}
7194-
auto op2 = d->createFactory(auth_name2)
7195-
->createCoordinateOperation(
7196-
code2, true, usePROJAlternativeGridNames, table2);
7197-
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7198-
targetCRSAuthName, targetCRSCode)) {
7199-
continue;
7200-
}
7198+
try {
7199+
auto op1 =
7200+
d->createFactory(auth_name1)
7201+
->createCoordinateOperation(
7202+
code1, true, usePROJAlternativeGridNames, table1);
7203+
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7204+
targetCRSAuthName, targetCRSCode)) {
7205+
continue;
7206+
}
7207+
auto op2 =
7208+
d->createFactory(auth_name2)
7209+
->createCoordinateOperation(
7210+
code2, true, usePROJAlternativeGridNames, table2);
7211+
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7212+
targetCRSAuthName, targetCRSCode)) {
7213+
continue;
7214+
}
72017215

7202-
listTmp.emplace_back(
7203-
operation::ConcatenatedOperation::createComputeMetadata({op1, op2},
7204-
false));
7216+
listTmp.emplace_back(
7217+
operation::ConcatenatedOperation::createComputeMetadata(
7218+
{op1, op2}, false));
7219+
} catch (const std::exception &e) {
7220+
// Mostly for debugging purposes when using an inconsistent
7221+
// database
7222+
if (getenv("PROJ_IGNORE_INSTANTIATION_ERRORS")) {
7223+
fprintf(stderr, "Ignoring invalid operation: %s\n", e.what());
7224+
} else {
7225+
throw;
7226+
}
7227+
}
72057228
}
72067229

72077230
// Case (source->intermediate) and (target->intermediate)
@@ -7228,24 +7251,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
72287251
const auto &auth_name2 = row[5];
72297252
const auto &code2 = row[6];
72307253
// const auto &accuracy2 = row[7];
7231-
auto op1 = d->createFactory(auth_name1)
7232-
->createCoordinateOperation(
7233-
code1, true, usePROJAlternativeGridNames, table1);
7234-
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7235-
targetCRSAuthName, targetCRSCode)) {
7236-
continue;
7237-
}
7238-
auto op2 = d->createFactory(auth_name2)
7239-
->createCoordinateOperation(
7240-
code2, true, usePROJAlternativeGridNames, table2);
7241-
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7242-
targetCRSAuthName, targetCRSCode)) {
7243-
continue;
7244-
}
7254+
try {
7255+
auto op1 =
7256+
d->createFactory(auth_name1)
7257+
->createCoordinateOperation(
7258+
code1, true, usePROJAlternativeGridNames, table1);
7259+
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7260+
targetCRSAuthName, targetCRSCode)) {
7261+
continue;
7262+
}
7263+
auto op2 =
7264+
d->createFactory(auth_name2)
7265+
->createCoordinateOperation(
7266+
code2, true, usePROJAlternativeGridNames, table2);
7267+
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7268+
targetCRSAuthName, targetCRSCode)) {
7269+
continue;
7270+
}
72457271

7246-
listTmp.emplace_back(
7247-
operation::ConcatenatedOperation::createComputeMetadata(
7248-
{op1, op2->inverse()}, false));
7272+
listTmp.emplace_back(
7273+
operation::ConcatenatedOperation::createComputeMetadata(
7274+
{op1, op2->inverse()}, false));
7275+
} catch (const std::exception &e) {
7276+
// Mostly for debugging purposes when using an inconsistent
7277+
// database
7278+
if (getenv("PROJ_IGNORE_INSTANTIATION_ERRORS")) {
7279+
fprintf(stderr, "Ignoring invalid operation: %s\n", e.what());
7280+
} else {
7281+
throw;
7282+
}
7283+
}
72497284
}
72507285

72517286
// Case (intermediate->source) and (intermediate->target)
@@ -7293,24 +7328,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
72937328
const auto &auth_name2 = row[5];
72947329
const auto &code2 = row[6];
72957330
// const auto &accuracy2 = row[7];
7296-
auto op1 = d->createFactory(auth_name1)
7297-
->createCoordinateOperation(
7298-
code1, true, usePROJAlternativeGridNames, table1);
7299-
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7300-
targetCRSAuthName, targetCRSCode)) {
7301-
continue;
7302-
}
7303-
auto op2 = d->createFactory(auth_name2)
7304-
->createCoordinateOperation(
7305-
code2, true, usePROJAlternativeGridNames, table2);
7306-
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7307-
targetCRSAuthName, targetCRSCode)) {
7308-
continue;
7309-
}
7331+
try {
7332+
auto op1 =
7333+
d->createFactory(auth_name1)
7334+
->createCoordinateOperation(
7335+
code1, true, usePROJAlternativeGridNames, table1);
7336+
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7337+
targetCRSAuthName, targetCRSCode)) {
7338+
continue;
7339+
}
7340+
auto op2 =
7341+
d->createFactory(auth_name2)
7342+
->createCoordinateOperation(
7343+
code2, true, usePROJAlternativeGridNames, table2);
7344+
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7345+
targetCRSAuthName, targetCRSCode)) {
7346+
continue;
7347+
}
73107348

7311-
listTmp.emplace_back(
7312-
operation::ConcatenatedOperation::createComputeMetadata(
7313-
{op1->inverse(), op2}, false));
7349+
listTmp.emplace_back(
7350+
operation::ConcatenatedOperation::createComputeMetadata(
7351+
{op1->inverse(), op2}, false));
7352+
} catch (const std::exception &e) {
7353+
// Mostly for debugging purposes when using an inconsistent
7354+
// database
7355+
if (getenv("PROJ_IGNORE_INSTANTIATION_ERRORS")) {
7356+
fprintf(stderr, "Ignoring invalid operation: %s\n", e.what());
7357+
} else {
7358+
throw;
7359+
}
7360+
}
73147361
}
73157362

73167363
// Case (intermediate->source) and (target->intermediate)
@@ -7337,24 +7384,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
73377384
const auto &auth_name2 = row[5];
73387385
const auto &code2 = row[6];
73397386
// const auto &accuracy2 = row[7];
7340-
auto op1 = d->createFactory(auth_name1)
7341-
->createCoordinateOperation(
7342-
code1, true, usePROJAlternativeGridNames, table1);
7343-
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7344-
targetCRSAuthName, targetCRSCode)) {
7345-
continue;
7346-
}
7347-
auto op2 = d->createFactory(auth_name2)
7348-
->createCoordinateOperation(
7349-
code2, true, usePROJAlternativeGridNames, table2);
7350-
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7351-
targetCRSAuthName, targetCRSCode)) {
7352-
continue;
7353-
}
7387+
try {
7388+
auto op1 =
7389+
d->createFactory(auth_name1)
7390+
->createCoordinateOperation(
7391+
code1, true, usePROJAlternativeGridNames, table1);
7392+
if (useIrrelevantPivot(op1, sourceCRSAuthName, sourceCRSCode,
7393+
targetCRSAuthName, targetCRSCode)) {
7394+
continue;
7395+
}
7396+
auto op2 =
7397+
d->createFactory(auth_name2)
7398+
->createCoordinateOperation(
7399+
code2, true, usePROJAlternativeGridNames, table2);
7400+
if (useIrrelevantPivot(op2, sourceCRSAuthName, sourceCRSCode,
7401+
targetCRSAuthName, targetCRSCode)) {
7402+
continue;
7403+
}
73547404

7355-
listTmp.emplace_back(
7356-
operation::ConcatenatedOperation::createComputeMetadata(
7357-
{op1->inverse(), op2->inverse()}, false));
7405+
listTmp.emplace_back(
7406+
operation::ConcatenatedOperation::createComputeMetadata(
7407+
{op1->inverse(), op2->inverse()}, false));
7408+
} catch (const std::exception &e) {
7409+
// Mostly for debugging purposes when using an inconsistent
7410+
// database
7411+
if (getenv("PROJ_IGNORE_INSTANTIATION_ERRORS")) {
7412+
fprintf(stderr, "Ignoring invalid operation: %s\n", e.what());
7413+
} else {
7414+
throw;
7415+
}
7416+
}
73587417
}
73597418

73607419
std::vector<operation::CoordinateOperationNNPtr> list;

0 commit comments

Comments
 (0)