changeset 3385:e994565a59a1

waterlevel classification: Added 'breaks=<value 1>,<value 2>,...,<value n>' query parameter to set the class breaks for classification.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 22 May 2019 16:09:56 +0200
parents 4ed940b0f0ca
children 0ba142a4bf43
files pkg/controllers/bottlenecks.go
diffstat 1 files changed, 44 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/bottlenecks.go	Wed May 22 15:57:37 2019 +0200
+++ b/pkg/controllers/bottlenecks.go	Wed May 22 16:09:56 2019 +0200
@@ -370,6 +370,30 @@
 	return levels, nil
 }
 
+func breaksToReferenceValue(breaks string) []referenceValue {
+	parts := strings.Split(breaks, ",")
+	values := map[float64]struct{}{}
+	for _, part := range parts {
+		part = strings.TrimSpace(part)
+		if v, err := strconv.ParseFloat(part, 64); err == nil {
+			values[v] = struct{}{}
+		}
+	}
+	refs := make([]referenceValue, len(values))
+	var i int
+	for v := range values {
+		refs[i].value = v
+		i++
+	}
+	sort.Slice(refs, func(i, j int) bool {
+		return refs[i].value < refs[j].value
+	})
+	for i := range refs {
+		refs[i].level = i
+	}
+	return refs
+}
+
 func bottleneckAvailabilty(
 	_ interface{},
 	req *http.Request,
@@ -418,6 +442,13 @@
 		los = 1
 	}
 
+	var breaks []referenceValue
+	if b := req.FormValue("breaks"); b != "" {
+		breaks = breaksToReferenceValue(b)
+	} else {
+		breaks = afdRefs
+	}
+
 	ctx := req.Context()
 
 	var lnwlRefs []referenceValue
@@ -454,7 +485,7 @@
 
 	afd := ms.classify(
 		from, to,
-		afdRefs,
+		breaks,
 		(*availMeasurement).getDepth,
 	)
 
@@ -496,9 +527,9 @@
 		})
 	}
 
-	for i := range afdRefs {
+	for i := range breaks {
 		out.AFD = append(out.AFD, afdOutput{
-			Value:   afdRefs[i].value,
+			Value:   breaks[i].value,
 			Percent: afdPercents[i],
 		})
 	}
@@ -606,15 +637,22 @@
 		return
 	}
 
+	var breaks []referenceValue
+	if b := req.FormValue("breaks"); b != "" {
+		breaks = breaksToReferenceValue(b)
+	} else {
+		breaks = afdRefs
+	}
+
 	rw.Header().Add("Content-Type", "text/csv")
 
 	out := csv.NewWriter(rw)
 
 	// label, classes, lnwl
-	record := make([]string, 1+1+len(afdRefs)+1)
+	record := make([]string, 1+1+len(breaks)+1)
 	record[0] = "#label"
 	record[1] = "# >= LDC [h]"
-	for i, v := range afdRefs {
+	for i, v := range breaks {
 		if i == 0 {
 			record[2] = fmt.Sprintf("# < %.2f [h]", v.value)
 		}
@@ -645,7 +683,7 @@
 
 		ranges := ms.classify(
 			pfrom, pto,
-			afdRefs,
+			breaks,
 			(*availMeasurement).getDepth,
 		)