| 3400 | // --------------------------------------------------------------------------- |
| 3401 | |
| 3402 | static GeodeticReferenceFrameNNPtr createGeodeticReferenceFrame( |
| 3403 | PJ_CONTEXT *ctx, const char *datum_name, const char *ellps_name, |
| 3404 | double semi_major_metre, double inv_flattening, |
| 3405 | const char *prime_meridian_name, double prime_meridian_offset, |
| 3406 | const char *angular_units, double angular_units_conv) { |
| 3407 | const UnitOfMeasure angUnit( |
| 3408 | createAngularUnit(angular_units, angular_units_conv)); |
| 3409 | auto dbContext = getDBcontextNoException(ctx, __FUNCTION__); |
| 3410 | auto body = Ellipsoid::guessBodyName(dbContext, semi_major_metre); |
| 3411 | auto ellpsName = createPropertyMapName(ellps_name); |
| 3412 | auto ellps = inv_flattening != 0.0 |
| 3413 | ? Ellipsoid::createFlattenedSphere( |
| 3414 | ellpsName, Length(semi_major_metre), |
| 3415 | Scale(inv_flattening), body) |
| 3416 | : Ellipsoid::createSphere(ellpsName, |
| 3417 | Length(semi_major_metre), body); |
| 3418 | auto pm = PrimeMeridian::create( |
| 3419 | PropertyMap().set( |
| 3420 | common::IdentifiedObject::NAME_KEY, |
| 3421 | prime_meridian_name ? prime_meridian_name |
| 3422 | : prime_meridian_offset == 0.0 |
| 3423 | ? (ellps->celestialBody() == Ellipsoid::EARTH |
| 3424 | ? PrimeMeridian::GREENWICH->nameStr().c_str() |
| 3425 | : PrimeMeridian::REFERENCE_MERIDIAN->nameStr().c_str()) |
| 3426 | : "unnamed"), |
| 3427 | Angle(prime_meridian_offset, angUnit)); |
| 3428 | |
| 3429 | std::string datumName(datum_name ? datum_name : "unnamed"); |
| 3430 | if (datumName == "WGS_1984") { |
| 3431 | datumName = GeodeticReferenceFrame::EPSG_6326->nameStr(); |
| 3432 | } else if (datumName.find('_') != std::string::npos) { |
| 3433 | // Likely coming from WKT1 |
| 3434 | if (dbContext) { |
| 3435 | auto authFactory = |
| 3436 | AuthorityFactory::create(NN_NO_CHECK(dbContext), std::string()); |
| 3437 | auto res = authFactory->createObjectsFromName( |
| 3438 | datumName, |
| 3439 | {AuthorityFactory::ObjectType::GEODETIC_REFERENCE_FRAME}, true, |
| 3440 | 1); |
| 3441 | if (!res.empty()) { |
| 3442 | const auto &refDatum = res.front(); |
| 3443 | if (metadata::Identifier::isEquivalentName( |
| 3444 | datumName.c_str(), refDatum->nameStr().c_str())) { |
| 3445 | datumName = refDatum->nameStr(); |
| 3446 | } else if (refDatum->identifiers().size() == 1) { |
| 3447 | const auto &id = refDatum->identifiers()[0]; |
| 3448 | const auto aliases = |
| 3449 | authFactory->databaseContext()->getAliases( |
| 3450 | *id->codeSpace(), id->code(), refDatum->nameStr(), |
| 3451 | "geodetic_datum", std::string()); |
| 3452 | for (const auto &alias : aliases) { |
| 3453 | if (metadata::Identifier::isEquivalentName( |
| 3454 | datumName.c_str(), alias.c_str())) { |
| 3455 | datumName = refDatum->nameStr(); |
| 3456 | break; |
| 3457 | } |
| 3458 | } |
| 3459 | } |
no test coverage detected