MCPcopy Create free account
hub / github.com/OSGeo/PROJ / createGeodeticReferenceFrame

Function createGeodeticReferenceFrame

src/iso19111/c_api.cpp:3402–3467  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3400// ---------------------------------------------------------------------------
3401
3402static 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 }

Callers 2

Calls 11

createAngularUnitFunction · 0.85
createPropertyMapNameFunction · 0.85
LengthClass · 0.85
ScaleClass · 0.85
PropertyMapClass · 0.85
AngleClass · 0.85
setMethod · 0.80
createObjectsFromNameMethod · 0.80
sizeMethod · 0.80
getAliasesMethod · 0.80
emptyMethod · 0.45

Tested by

no test coverage detected