diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-11-03 10:46:36 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-11-03 11:38:39 +0100 |
| commit | ff69c7e4535e869d0d9c6831c50d2f0fd2d288ca (patch) | |
| tree | 24b5426266ea44ec5ed40f60a058d5db6b2f0330 /src | |
| parent | 0923704ba34100643b7bce270c332fa2c430224c (diff) | |
| download | PROJ-ff69c7e4535e869d0d9c6831c50d2f0fd2d288ca.tar.gz PROJ-ff69c7e4535e869d0d9c6831c50d2f0fd2d288ca.zip | |
Import from WKT: add tweaks for Lidar WKT1 VERT_CS that embeds geoid model in CRS name
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/io.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 116a8b78..d4e6132f 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -3821,6 +3821,64 @@ CRSNNPtr WKTParser::Private::buildVerticalCRS(const WKTNodeNNPtr &node) { } auto &props = buildProperties(node); + + // Deal with Lidar WKT1 VertCRS that embeds geoid model in CRS name, + // following conventions from + // https://pubs.usgs.gov/tm/11b4/pdf/tm11-B4.pdf + // page 9 + if (ci_equal(nodeValue, WKTConstants::VERT_CS)) { + std::string name; + if (props.getStringValue(IdentifiedObject::NAME_KEY, name)) { + std::string geoidName; + for (const char *prefix : + {"NAVD88 - ", "NAVD88 via ", "NAVD88 height - ", + "NAVD88 height (ftUS) - "}) { + if (starts_with(name, prefix)) { + geoidName = name.substr(strlen(prefix)); + auto pos = geoidName.find_first_of(" ("); + if (pos != std::string::npos) { + geoidName.resize(pos); + } + break; + } + } + if (!geoidName.empty()) { + const auto &axis = verticalCS->axisList()[0]; + const auto &dir = axis->direction(); + if (dir == cs::AxisDirection::UP) { + if (axis->unit() == common::UnitOfMeasure::METRE) { + props.set(IdentifiedObject::NAME_KEY, "NAVD88 height"); + props.set(Identifier::CODE_KEY, 5703); + props.set(Identifier::CODESPACE_KEY, Identifier::EPSG); + } else if (axis->unit().name() == "US survey foot") { + props.set(IdentifiedObject::NAME_KEY, + "NAVD88 height (ftUS)"); + props.set(Identifier::CODE_KEY, 6360); + props.set(Identifier::CODESPACE_KEY, Identifier::EPSG); + } + } + PropertyMap propsModel; + propsModel.set(IdentifiedObject::NAME_KEY, toupper(geoidName)); + PropertyMap propsDatum; + propsDatum.set(IdentifiedObject::NAME_KEY, + "North American Vertical Datum 1988"); + propsDatum.set(Identifier::CODE_KEY, 5103); + propsDatum.set(Identifier::CODESPACE_KEY, Identifier::EPSG); + datum = + VerticalReferenceFrame::create(propsDatum).as_nullable(); + const auto dummyCRS = + VerticalCRS::create(PropertyMap(), datum, datumEnsemble, + NN_NO_CHECK(verticalCS)); + const auto model(Transformation::create( + propsModel, dummyCRS, dummyCRS, nullptr, + OperationMethod::create( + PropertyMap(), std::vector<OperationParameterNNPtr>()), + {}, {})); + props.set("GEOID_MODEL", model); + } + } + } + auto &geoidModelNode = nodeP->lookForChild(WKTConstants::GEOIDMODEL); if (!isNull(geoidModelNode)) { auto &propsModel = buildProperties(geoidModelNode); |
