changeset 3945:3bdbaf1b282a

SR import: Negate the Z values in the XYZ files if the flag `negate-z` is set.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 14 Jul 2019 17:19:22 +0200
parents 0ed8af02d5a9
children d668742c8978
files pkg/controllers/srimports.go pkg/imports/sr.go pkg/models/sr.go
diffstat 3 files changed, 39 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/srimports.go	Fri Jul 12 11:58:20 2019 +0200
+++ b/pkg/controllers/srimports.go	Sun Jul 14 17:19:22 2019 +0200
@@ -97,6 +97,19 @@
 		sr.Bottleneck = &v
 	}
 
+	if v := req.FormValue("negate-z"); v != "" {
+		var negateZ bool
+		switch strings.ToLower(v) {
+		case "true", "1":
+			negateZ = true
+		case "false", "0":
+			negateZ = false
+		default:
+			return fmt.Errorf("Unknown negate-z '%s'", v)
+		}
+		sr.NegateZ = negateZ
+	}
+
 	if v := req.FormValue("single-beam"); v != "" {
 		var singleBeam bool
 		switch strings.ToLower(v) {
--- a/pkg/imports/sr.go	Fri Jul 12 11:58:20 2019 +0200
+++ b/pkg/imports/sr.go	Sun Jul 14 17:19:22 2019 +0200
@@ -60,6 +60,9 @@
 	DepthReference *string `json:"depth-reference,omitempty"`
 	// SingleBeam indicates that the sounding is a single beam scan.
 	SingleBeam *bool `json:"single-beam,omitempty"`
+	// NegateZ indicated that the Z values of thy XYZ input should be
+	// multiplied by -1.
+	NegateZ bool `json:"negate-z,omitempty"`
 }
 
 const (
@@ -249,6 +252,12 @@
 
 	var xform vertexTransform
 
+	if m.NegateZ {
+		xform = negateZTransform
+	} else {
+		xform = identityTransform
+	}
+
 	if m.DepthReference == "ZPG" {
 		feedback.Info("Found ZPG as reference system -> translating Z values to LDC")
 		var ldc float64
@@ -270,9 +279,11 @@
 
 		// LDC is cm. The data is in m.
 		ldc /= 100
-		xform = func(v octree.Vertex) octree.Vertex {
-			return octree.Vertex{X: v.X, Y: v.Y, Z: v.Z + ldc}
-		}
+		xform = chainTransforms(
+			xform,
+			func(v octree.Vertex) octree.Vertex {
+				return octree.Vertex{X: v.X, Y: v.Y, Z: v.Z + ldc}
+			})
 		m.DepthReference = depthReference
 	}
 
@@ -705,12 +716,20 @@
 
 type vertexTransform func(octree.Vertex) octree.Vertex
 
+func identityTransform(v octree.Vertex) octree.Vertex { return v }
+
+func negateZTransform(v octree.Vertex) octree.Vertex {
+	return octree.Vertex{X: v.X, Y: v.Y, Z: -v.Z}
+}
+
+func chainTransforms(a, b vertexTransform) vertexTransform {
+	return func(v octree.Vertex) octree.Vertex { return b(a(v)) }
+}
+
 func loadXYZReader(r io.Reader, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) {
 	mpz := make(octree.MultiPointZ, 0, 250000)
 	s := bufio.NewScanner(r)
 
-	var hasNegZ bool
-
 	warnLimiter := misc.WarningLimiter{Log: feedback.Warn, MaxWarnings: 100}
 	warn := warnLimiter.Warn
 	defer warnLimiter.Close()
@@ -743,16 +762,7 @@
 			warn("format error in line %d: %v", line, err)
 			continue
 		}
-		if p.Z < 0 {
-			p.Z = -p.Z
-			if !hasNegZ {
-				hasNegZ = true
-				warn("Negative Z value found: Using -Z")
-			}
-		}
-		if xform != nil {
-			p = xform(p)
-		}
+		p = xform(p)
 		mpz = append(mpz, p)
 	}
 
--- a/pkg/models/sr.go	Fri Jul 12 11:58:20 2019 +0200
+++ b/pkg/models/sr.go	Sun Jul 14 17:19:22 2019 +0200
@@ -32,6 +32,7 @@
 		EPSG           uint   `json:"epsg"`
 		DepthReference string `json:"depth-reference"`
 		SingleBeam     bool   `json:"single-beam"`
+		NegateZ        bool   `json:"negate-z,omitempty"`
 	}
 )