aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-01-25 15:25:35 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-01-25 15:25:35 +0100
commita8e7ef45d132b44dd4096c6fe3703fe92b390d1e (patch)
treeefdb730f65de80aca679102a89201503c663f0bd
parent53e0934befd6078a21872d9b626dbe4ee9cf8ed4 (diff)
downloadPROJ-gdalbarn.tar.gz
PROJ-gdalbarn.zip
exportToWKT(): avoid excessive numeric precision (especially when roundtripping TOWGS84 scale difference)gdalbarn
-rw-r--r--src/iso19111/io.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index 5dc20f51..65667ab0 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -482,7 +482,7 @@ void WKTFormatter::add(int number) {
// ---------------------------------------------------------------------------
#ifdef __MINGW32__
-static std::string normalizeSerializedString(const std::string &in) {
+static std::string normalizeExponent(const std::string &in) {
// mingw will output 1e-0xy instead of 1e-xy. Fix that
auto pos = in.find("e-0");
if (pos == std::string::npos) {
@@ -494,11 +494,28 @@ static std::string normalizeSerializedString(const std::string &in) {
return in;
}
#else
-static inline std::string normalizeSerializedString(const std::string &in) {
+static inline std::string normalizeExponent(const std::string &in) {
return in;
}
#endif
+static inline std::string normalizeSerializedString(const std::string &in) {
+ auto ret(normalizeExponent(in));
+ auto dotPos = ret.find('.');
+ // Detect sequences like x.yz000000foo
+ if( dotPos != std::string::npos &&
+ ret.find('e', dotPos) == std::string::npos &&
+ ret.find('E', dotPos) == std::string::npos )
+ {
+ auto zeroesPos = ret.find("000000", dotPos);
+ if( zeroesPos != std::string::npos )
+ {
+ ret.resize(zeroesPos);
+ }
+ }
+ return ret;
+}
+
// ---------------------------------------------------------------------------
void WKTFormatter::add(double number, int precision) {