Mercurial > gemma
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, )