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

Method buildGeodeticReferenceFrame

src/iso19111/io.cpp:2297–2536  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2295// ---------------------------------------------------------------------------
2296
2297GeodeticReferenceFrameNNPtr WKTParser::Private::buildGeodeticReferenceFrame(
2298 const WKTNodeNNPtr &node, const PrimeMeridianNNPtr &primeMeridian,
2299 const WKTNodeNNPtr &dynamicNode) {
2300 const auto *nodeP = node->GP();
2301 auto &ellipsoidNode =
2302 nodeP->lookForChild(WKTConstants::ELLIPSOID, WKTConstants::SPHEROID);
2303 if (isNull(ellipsoidNode)) {
2304 ThrowMissing(WKTConstants::ELLIPSOID);
2305 }
2306 auto &properties = buildProperties(node);
2307
2308 // do that before buildEllipsoid() so that esriStyle_ can be set
2309 auto name = stripQuotes(nodeP->children()[0]);
2310
2311 const auto identifyFromName = [&](const std::string &l_name) {
2312 if (dbContext_) {
2313 auto authFactory = AuthorityFactory::create(NN_NO_CHECK(dbContext_),
2314 std::string());
2315 auto res = authFactory->createObjectsFromName(
2316 l_name,
2317 {AuthorityFactory::ObjectType::GEODETIC_REFERENCE_FRAME}, true,
2318 1);
2319 if (!res.empty()) {
2320 bool foundDatumName = false;
2321 const auto &refDatum = res.front();
2322 if (metadata::Identifier::isEquivalentName(
2323 l_name.c_str(), refDatum->nameStr().c_str())) {
2324 foundDatumName = true;
2325 } else if (refDatum->identifiers().size() == 1) {
2326 const auto &id = refDatum->identifiers()[0];
2327 const auto aliases =
2328 authFactory->databaseContext()->getAliases(
2329 *id->codeSpace(), id->code(), refDatum->nameStr(),
2330 "geodetic_datum", "not EPSG_OLD");
2331 for (const auto &alias : aliases) {
2332 if (metadata::Identifier::isEquivalentName(
2333 l_name.c_str(), alias.c_str())) {
2334 foundDatumName = true;
2335 break;
2336 }
2337 }
2338 }
2339 if (foundDatumName) {
2340 properties.set(IdentifiedObject::NAME_KEY,
2341 refDatum->nameStr());
2342 if (!properties.get(Identifier::CODESPACE_KEY) &&
2343 refDatum->identifiers().size() == 1) {
2344 const auto &id = refDatum->identifiers()[0];
2345 auto identifiers = ArrayOfBaseObject::create();
2346 identifiers->add(Identifier::create(
2347 id->code(), PropertyMap()
2348 .set(Identifier::CODESPACE_KEY,
2349 *id->codeSpace())
2350 .set(Identifier::AUTHORITY_KEY,
2351 *id->codeSpace())));
2352 properties.set(IdentifiedObject::IDENTIFIERS_KEY,
2353 identifiers);
2354 }

Callers 1

createFromWKTMethod · 0.80

Calls 15

isNullFunction · 0.85
ThrowMissingFunction · 0.85
stripQuotesFunction · 0.85
PropertyMapClass · 0.85
ends_withFunction · 0.85
starts_withFunction · 0.85
asDoubleFunction · 0.85
ci_equalFunction · 0.85
MeasureClass · 0.85
createObjectsFromNameMethod · 0.80
sizeMethod · 0.80
getAliasesMethod · 0.80

Tested by

no test coverage detected