Mercurial > gemma
annotate pkg/mesh/classbreaks.go @ 5721:0500d76e074b uploadwg
Fixed eraseObsoleteGaugesSQL by reintroducing matching on users CC.
The condition was removed when introducing file upload, but that leads
to too many gauges being removed.
author | Sascha Wilde <wilde@sha-bang.de> |
---|---|
date | Fri, 19 Apr 2024 16:52:14 +0200 |
parents | 1222b777f51f |
children |
rev | line source |
---|---|
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2019 by via donau |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
4827
f4abfd0ee8ad
Renamed octree package to mesh as there is no octree any more.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4762
diff
changeset
|
14 package mesh |
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import ( |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "context" |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 "database/sql" |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
19 "errors" |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 "math" |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 "sort" |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 "strconv" |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 "strings" |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
24 |
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
25 "gemma.intevation.de/gemma/pkg/common" |
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 ) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 const ( |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 selectClassBreaksSQL = ` |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 SELECT config_val FROM sys_admin.system_config |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 WHERE config_key = $1` |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 ) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
34 // ClassBreaks represents borders between scalar classes. |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
35 type ClassBreaks []float64 |
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
36 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
37 // SampleDiffHeights generate a gradient from min to max with a |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
38 // given step width. |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
39 func SampleDiffHeights(min, max, step float64) ClassBreaks { |
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
40 var heights ClassBreaks |
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 switch { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 case min >= 0: // All values positive. |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 for v := 0.0; v <= max; v += step { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 if v >= min { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 heights = append(heights, v) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 case max <= 0: // All values negative. |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 for v := 0.0; v >= min; v -= step { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 if v <= max { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 heights = append(heights, v) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 default: // Positive and negative. |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 for v := step; v <= max; v += step { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 heights = append(heights, v) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 for i, j := 0, len(heights)-1; i < j; i, j = i+1, j-1 { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 heights[i], heights[j] = heights[j], heights[i] |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 for v := 0.0; v >= min; v -= step { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 heights = append(heights, v) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 return heights |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
68 // ParseClassBreaks deserialized class breaks from a |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
69 // given string. key/value pairs a separated with |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
70 // ','. Key and values are separated by ':'. |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
71 func ParseClassBreaks(config string) (ClassBreaks, error) { |
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 |
4214
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
73 parts := strings.Split(config, ",") |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
74 classes := make(ClassBreaks, 0, len(parts)) |
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 for _, part := range parts { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 if idx := strings.IndexRune(part, ':'); idx >= 0 { |
3882
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
77 part = part[:idx] |
3836
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 if part = strings.TrimSpace(part); part == "" { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 continue |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
81 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
82 v, err := strconv.ParseFloat(part, 64) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
83 if err != nil { |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
84 return nil, err |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
85 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
86 classes = append(classes, v) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
87 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
89 sort.Float64s(classes) |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
90 return classes, nil |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 } |
631f5eaf29de
First preparation to use custom classbreaks in contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
93 // LoadClassBreaks loads a class break from the database. |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
94 // The given key identifies the dataset. |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
95 func LoadClassBreaks(ctx context.Context, tx *sql.Tx, key string) (ClassBreaks, error) { |
4214
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
96 |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
97 var config sql.NullString |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
98 |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
99 err := tx.QueryRowContext(ctx, selectClassBreaksSQL, key).Scan(&config) |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
100 |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
101 switch { |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
102 case err == sql.ErrNoRows: |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
103 return nil, nil |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
104 case err != nil: |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
105 return nil, err |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
106 case !config.Valid: |
4847
4847ac70103a
Made staticcheck happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4827
diff
changeset
|
107 return nil, errors.New("invalid config string") |
4214
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
108 } |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
109 |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
110 return ParseClassBreaks(config.String) |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
111 } |
49564382ffff
Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3882
diff
changeset
|
112 |
4746
5e0041fd3cba
Round height values of extrapolated classbreaks to four place behind the dot.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4687
diff
changeset
|
113 func round(v float64) float64 { |
5e0041fd3cba
Round height values of extrapolated classbreaks to four place behind the dot.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4687
diff
changeset
|
114 return math.Round(v*10000) / 10000 |
5e0041fd3cba
Round height values of extrapolated classbreaks to four place behind the dot.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4687
diff
changeset
|
115 } |
5e0041fd3cba
Round height values of extrapolated classbreaks to four place behind the dot.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4687
diff
changeset
|
116 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
117 // ExtrapolateClassBreaks extends the given |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
118 // classbreaks (as a copy) from min to max. |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
119 // The border class sizes are used to extrapolate |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
120 // step sizes. |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
121 func (cbs ClassBreaks) ExtrapolateClassBreaks(min, max float64) ClassBreaks { |
3882
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
122 if min > max { |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
123 min, max = max, min |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
124 } |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
125 |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
126 n := make(ClassBreaks, len(cbs)) |
3882
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
127 copy(n, cbs) |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
128 sort.Float64s(n) |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
129 |
4685
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
130 for len(n) > 0 && n[0] < min { |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
131 n = n[1:] |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
132 } |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
133 |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
134 if len(n) == 0 { |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
135 return n |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
136 } |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
137 |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
138 for len(n) > 0 && n[len(n)-1] > max { |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
139 n = n[:len(n)-1] |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
140 } |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
141 |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
142 if len(n) == 0 { |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
143 return n |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
144 } |
7a9388943840
morphology: Clip class breaks again Z min and max of the the height model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4214
diff
changeset
|
145 |
3882
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
146 for min < n[0] { |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
147 diff := n[1] - n[0] |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
148 if diff == 0 { |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
149 break |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
150 } |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
151 m := make([]float64, len(n)+1) |
4746
5e0041fd3cba
Round height values of extrapolated classbreaks to four place behind the dot.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4687
diff
changeset
|
152 m[0] = round(n[0] - diff) |
3882
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
153 copy(m[1:], n) |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
154 n = m |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
155 } |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
156 |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
157 for max > n[len(n)-1] { |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
158 diff := n[len(n)-1] - n[len(n)-2] |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
159 if diff == 0 { |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
160 break |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
161 } |
4746
5e0041fd3cba
Round height values of extrapolated classbreaks to four place behind the dot.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4687
diff
changeset
|
162 n = append(n, round(n[len(n)-1]+diff)) |
3882
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
163 } |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
164 |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
165 return n |
37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3836
diff
changeset
|
166 } |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
167 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
168 // Dedup removes duplicates from the class breaks. |
5412
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
169 func (cbs ClassBreaks) Dedup() ClassBreaks { |
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
170 return ClassBreaks(common.DedupFloat64s(cbs)) |
34bc6041e61e
Added a type for class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4847
diff
changeset
|
171 } |
5413
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
172 |
5601
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
173 // Classify associates a class to all points of |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
174 // a given multi points and returns a slice of |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
175 // multi points containing the points that are |
1222b777f51f
Made golint finally happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5428
diff
changeset
|
176 // in the respective class. |
5428
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
177 func (cbs ClassBreaks) Classify(points MultiPointZ) []MultiPointZ { |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
178 if len(cbs) == 0 { |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
179 return nil |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
180 } |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
181 classes := make([]MultiPointZ, len(cbs)) |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
182 for _, v := range points { |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
183 // Place in last class if greater than all. |
b8d5f1cd15fb
Simplified classification. Needs testing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5413
diff
changeset
|
184 idx := len(cbs) - 1 |
5413
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
185 for i, cb := range cbs { |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
186 if v.Z <= cb { |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
187 idx = i |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
188 break |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
189 } |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
190 } |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
191 classes[idx] = append(classes[idx], v) |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
192 } |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
193 return classes |
99f32f0dc70c
Added tools to classify vertices by their heights with class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5412
diff
changeset
|
194 } |