changeset 1772:70c4dc694d61

Gauge measurement import: Added a rescale function that brings all numerical values into cm.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 11 Jan 2019 11:36:34 +0100
parents 88b8da513944
children bd72d1a7ffe6
files pkg/imports/agm.go pkg/imports/gm.go
diffstat 2 files changed, 44 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/agm.go	Fri Jan 11 11:33:34 2019 +0100
+++ b/pkg/imports/agm.go	Fri Jan 11 11:36:34 2019 +0100
@@ -18,6 +18,7 @@
 	"context"
 	"database/sql"
 	"encoding/csv"
+	"errors"
 	"log"
 	"os"
 	"path/filepath"
@@ -112,5 +113,5 @@
 		log.Printf("%d: %s\n", i, f)
 	}
 
-	return nil, nil
+	return nil, errors.New("Not implemented, yet!")
 }
--- a/pkg/imports/gm.go	Fri Jan 11 11:33:34 2019 +0100
+++ b/pkg/imports/gm.go	Fri Jan 11 11:36:34 2019 +0100
@@ -17,6 +17,8 @@
 	"context"
 	"database/sql"
 	"errors"
+	"fmt"
+	"strings"
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/common"
@@ -173,6 +175,32 @@
 	return &summary, err
 }
 
+// rescale returns a scaling function to bring the unit all to cm.
+func rescale(unit string) (func(float32) float32, error) {
+
+	var scale float32
+
+	switch strings.ToLower(unit) {
+	case "mm":
+		scale = 0.1
+	case "cm":
+		scale = 1.0
+	case "dm":
+		scale = 10.0
+	case "m":
+		scale = 100.0
+	case "hm":
+		scale = 10000.0
+	case "km":
+		scale = 100000.0
+	default:
+		return nil, fmt.Errorf("unknown unit '%s'", unit)
+	}
+
+	fn := func(x float32) float32 { return scale * x }
+	return fn, nil
+}
+
 func (gm *GaugeMeasurement) doForGM(
 	ctx context.Context,
 	gauges []models.GaugeMeasurement,
@@ -235,6 +263,17 @@
 				continue
 			}
 			for _, measure := range wrm.Measure {
+				var unit string
+				if measure.Unit == nil {
+					feedback.Info("'Unit' not specified. Assuming 'cm'")
+					unit = "cm"
+				} else {
+					unit = string(*measure.Unit)
+				}
+				convert, err := rescale(unit)
+				if err != nil {
+					return nil, err
+				}
 				isWaterlevel := *measure.Measure_code == nts.Measure_code_enumWAL
 				err = insertStmt.QueryRowContext(
 					ctx,
@@ -248,11 +287,11 @@
 					msg.Identification.Language_code,
 					msg.Identification.Country_code,
 					msg.Identification.Date_issue,
-					measure.Value,
+					convert(measure.Value),
 					measure.Predicted,
 					isWaterlevel,
-					measure.Value_min,
-					measure.Value_max,
+					convert(measure.Value_min),
+					convert(measure.Value_max),
 					msg.Identification.Date_issue,
 					msg.Identification.Originator,
 				).Scan(&gid)