# HG changeset patch # User Sascha L. Teichmann # Date 1547202994 -3600 # Node ID 70c4dc694d614ff87837fc0aa1625bb08ab7d1ec # Parent 88b8da51394451d1194c2a24251d1abf7145cd5e Gauge measurement import: Added a rescale function that brings all numerical values into cm. diff -r 88b8da513944 -r 70c4dc694d61 pkg/imports/agm.go --- 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!") } diff -r 88b8da513944 -r 70c4dc694d61 pkg/imports/gm.go --- 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)