aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-04-24 23:28:08 +0200
committerEven Rouault <even.rouault@spatialys.com>2020-04-24 23:28:08 +0200
commit4f1a05aa9589729b53a305353c30691aa733964f (patch)
tree9007d1031b76621ac4a49e1fe7ecaffc6728fa6b /src
parent8aba4d24b72631007c1c33b70bc1a908fa5d8319 (diff)
downloadPROJ-4f1a05aa9589729b53a305353c30691aa733964f.tar.gz
PROJ-4f1a05aa9589729b53a305353c30691aa733964f.zip
Tune support for WKT1_GDAL with netCDF rotated pole formulation. Follow-up to 40466db40499e003cc59957d7e245b6ce8f8e4a3
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/io.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index 86f21db7..21754a44 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -1285,6 +1285,8 @@ struct WKTParser::Private {
const UnitOfMeasure &defaultLinearUnit,
const UnitOfMeasure &defaultAngularUnit);
+ static std::string getExtensionProj4(const WKTNode::Private *nodeP);
+
static void addExtensionProj4ToProp(const WKTNode::Private *nodeP,
PropertyMap &props);
@@ -2665,15 +2667,26 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
// ---------------------------------------------------------------------------
-void WKTParser::Private::addExtensionProj4ToProp(const WKTNode::Private *nodeP,
- PropertyMap &props) {
+std::string
+WKTParser::Private::getExtensionProj4(const WKTNode::Private *nodeP) {
auto &extensionNode = nodeP->lookForChild(WKTConstants::EXTENSION);
const auto &extensionChildren = extensionNode->GP()->children();
if (extensionChildren.size() == 2) {
if (ci_equal(stripQuotes(extensionChildren[0]), "PROJ4")) {
- props.set("EXTENSION_PROJ4", stripQuotes(extensionChildren[1]));
+ return stripQuotes(extensionChildren[1]);
}
}
+ return std::string();
+}
+
+// ---------------------------------------------------------------------------
+
+void WKTParser::Private::addExtensionProj4ToProp(const WKTNode::Private *nodeP,
+ PropertyMap &props) {
+ const auto extensionProj4(getExtensionProj4(nodeP));
+ if (!extensionProj4.empty()) {
+ props.set("EXTENSION_PROJ4", extensionProj4);
+ }
}
// ---------------------------------------------------------------------------
@@ -4514,13 +4527,15 @@ CRSPtr WKTParser::Private::buildCRS(const WKTNodeNNPtr &node) {
if (ci_equal(name, WKTConstants::PROJCS) ||
ci_equal(name, WKTConstants::PROJCRS) ||
ci_equal(name, WKTConstants::PROJECTEDCRS)) {
- auto projCRS =
- util::nn_static_pointer_cast<CRS>(buildProjectedCRS(node));
- auto projString = projCRS->getExtensionProj4();
- if (starts_with(projString, "+proj=ob_tran +o_proj=longlat") ||
- starts_with(projString, "+proj=ob_tran +o_proj=lonlat") ||
- starts_with(projString, "+proj=ob_tran +o_proj=latlong") ||
- starts_with(projString, "+proj=ob_tran +o_proj=latlon")) {
+ // Get the EXTENSION "PROJ4" node before attempting to call
+ // buildProjectedCRS() since formulations of WKT1_GDAL from GDAL 2.x
+ // with the netCDF driver and the lack the required UNIT[] node
+ std::string projString = getExtensionProj4(nodeP);
+ if (!projString.empty() &&
+ (starts_with(projString, "+proj=ob_tran +o_proj=longlat") ||
+ starts_with(projString, "+proj=ob_tran +o_proj=lonlat") ||
+ starts_with(projString, "+proj=ob_tran +o_proj=latlong") ||
+ starts_with(projString, "+proj=ob_tran +o_proj=latlon"))) {
// Those are not a projected CRS, but a DerivedGeographic one...
if (projString.find(" +type=crs") == std::string::npos) {
projString += " +type=crs";
@@ -4535,7 +4550,7 @@ CRSPtr WKTParser::Private::buildCRS(const WKTNodeNNPtr &node) {
} catch (const io::ParsingException &) {
}
}
- return projCRS.as_nullable();
+ return util::nn_static_pointer_cast<CRS>(buildProjectedCRS(node));
}
if (ci_equal(name, WKTConstants::VERT_CS) ||