diff pkg/imports/sr.go @ 3487:fdb0439850d5 zpg-ldc

Generalized transformation of vertices during sounding result import a bit. Calculate p.Z = LDC - p.Z if ZPG reference system is given.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 27 May 2019 16:37:19 +0200
parents 83b58f6356e7
children 6e748f31777a
line wrap: on
line diff
--- a/pkg/imports/sr.go	Mon May 27 15:17:38 2019 +0200
+++ b/pkg/imports/sr.go	Mon May 27 16:37:19 2019 +0200
@@ -202,17 +202,22 @@
 	feedback.Info("Bottleneck: %s", m.Bottleneck)
 	feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat))
 
-	var heightDelta float64
+	var xform vertexTransform
+
 	if m.DepthReference == "ZPG" {
 		feedback.Info("Found ZPG as reference system -> translating Z values to LDC")
-		m.DepthReference = "LDC"
-		err := conn.QueryRowContext(ctx, selectGaugeLDCSQL, m.Bottleneck).Scan(&heightDelta)
+		var ldc float64
+		err := conn.QueryRowContext(ctx, selectGaugeLDCSQL, m.Bottleneck).Scan(&ldc)
 		switch {
 		case err == sql.ErrNoRows:
 			return nil, errors.New("Cannot load LDC value")
 		case err != nil:
 			return nil, err
 		}
+		xform = func(v octree.Vertex) octree.Vertex {
+			return octree.Vertex{X: v.X, Y: v.Y, Z: ldc - v.Z}
+		}
+		m.DepthReference = "LDC"
 	}
 
 	if err := m.Validate(ctx, conn); err != nil {
@@ -230,7 +235,7 @@
 		return nil, errors.New("Cannot find any *.xyz or *.txt file")
 	}
 
-	xyz, err := loadXYZ(xyzf, feedback, heightDelta)
+	xyz, err := loadXYZ(xyzf, feedback, xform)
 	if err != nil {
 		return nil, err
 	}
@@ -447,7 +452,9 @@
 	return &m, nil
 }
 
-func loadXYZReader(r io.Reader, feedback Feedback, heightDelta float64) (octree.MultiPointZ, error) {
+type vertexTransform func(octree.Vertex) octree.Vertex
+
+func loadXYZReader(r io.Reader, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) {
 	mpz := make(octree.MultiPointZ, 0, 250000)
 	s := bufio.NewScanner(r)
 
@@ -502,7 +509,9 @@
 				warn("Negative Z value found: Using -Z")
 			}
 		}
-		p.Z += heightDelta
+		if xform != nil {
+			p = xform(p)
+		}
 		mpz = append(mpz, p)
 	}
 
@@ -513,13 +522,13 @@
 	return mpz, nil
 }
 
-func loadXYZ(f *zip.File, feedback Feedback, heightDelta float64) (octree.MultiPointZ, error) {
+func loadXYZ(f *zip.File, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) {
 	r, err := f.Open()
 	if err != nil {
 		return nil, err
 	}
 	defer r.Close()
-	return loadXYZReader(r, feedback, heightDelta)
+	return loadXYZReader(r, feedback, xform)
 }
 
 func loadBoundary(z *zip.ReadCloser) (polygonSlice, error) {