@@ -6772,19 +6772,30 @@ AuthorityFactory::createFromCoordinateReferenceSystemCodes(
6772
6772
const auto &auth_name = row[4 ];
6773
6773
const auto &code = row[5 ];
6774
6774
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
+ }
6788
6799
}
6789
6800
}
6790
6801
d->context ()->d ->cache (cacheKey, list);
@@ -7184,24 +7195,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
7184
7195
const auto &auth_name2 = row[5 ];
7185
7196
const auto &code2 = row[6 ];
7186
7197
// 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
+ }
7201
7215
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
+ }
7205
7228
}
7206
7229
7207
7230
// Case (source->intermediate) and (target->intermediate)
@@ -7228,24 +7251,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
7228
7251
const auto &auth_name2 = row[5 ];
7229
7252
const auto &code2 = row[6 ];
7230
7253
// 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
+ }
7245
7271
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
+ }
7249
7284
}
7250
7285
7251
7286
// Case (intermediate->source) and (intermediate->target)
@@ -7293,24 +7328,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
7293
7328
const auto &auth_name2 = row[5 ];
7294
7329
const auto &code2 = row[6 ];
7295
7330
// 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
+ }
7310
7348
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
+ }
7314
7361
}
7315
7362
7316
7363
// Case (intermediate->source) and (target->intermediate)
@@ -7337,24 +7384,36 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
7337
7384
const auto &auth_name2 = row[5 ];
7338
7385
const auto &code2 = row[6 ];
7339
7386
// 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
+ }
7354
7404
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
+ }
7358
7417
}
7359
7418
7360
7419
std::vector<operation::CoordinateOperationNNPtr> list;
0 commit comments