annotate pkg/common/time.go @ 3678:8f58851927c0

client: make layer factory only return new layer config for individual maps instead of each time it is invoked. The purpose of the factory was to support multiple maps with individual layers. But returning a new config each time it is invoked leads to bugs that rely on the layer's state. Now this factory reuses the same objects it created before, per map.
author Markus Kottlaender <markus@intevation.de>
date Mon, 17 Jun 2019 17:31:35 +0200
parents ecb4baa2be1a
children cb74aa69954e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2150
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
2929
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
7 // Copyright (C) 2018, 2019 by via donau
2150
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
2929
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
13 // * Bernhard E. Reiter <bernhard.reiter@intevation.de>
2150
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 package common
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
3027
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
17 import (
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
18 "math"
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
19 "time"
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
20 )
2929
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
21
2150
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 const (
2929
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
23 // time.RFC3339 equals "simplified ISO format as defined by ECMA-262"
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
24 // https://tc39.github.io/ecma262/#sec-date-time-string-format
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
25 // and "SHOULD be used in new protocols on the Internet." (RFC section 5.6)
e5f5afa45451 Change basic in/out datetime format to RFC3339
Bernhard Reiter <bernhard@intevation.de>
parents: 2150
diff changeset
26 TimeFormat = time.RFC3339
2150
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 DateFormat = "2006-01-02"
2c67c51d57ad Print templates: Implemented GET of all templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 )
3027
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
29
3332
c86a8e70b40f Made time interpolation more precise and added a unit test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3095
diff changeset
30 var utc0 = time.Unix(0, 0)
c86a8e70b40f Made time interpolation more precise and added a unit test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3095
diff changeset
31
3367
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
32 func InterpolateTime(t1 time.Time, m1 float64, t2 time.Time, m2 float64) func(float64) time.Time {
3027
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
33
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
34 // f(m1) = t1
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
35 // f(m2) = t2
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
36 // t1 = m1*a + b <=> b = t1 - m1*a
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
37 // t2 = m2*a + b
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
38
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
39 // t1 - t2 = a*(m1 - m2)
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
40 // a = (t1-t2)/(m1 - m2) for m1 != m2
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
41
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
42 if m1 == m2 {
3367
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
43 t := t1.Add(t2.Sub(t1) / 2)
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
44 return func(float64) time.Time { return t }
3027
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
45 }
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
46
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
47 a := t1.Sub(t2).Seconds() / (m1 - m2)
3332
c86a8e70b40f Made time interpolation more precise and added a unit test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3095
diff changeset
48 b := t1.Sub(utc0).Seconds() - m1*a
3027
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
49
3367
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
50 return func(m float64) time.Time {
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
51 x := m*a + b
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
52 secs := math.Ceil(x)
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
53 nsecs := math.Ceil((x - secs) * (999999999 + 1))
ecb4baa2be1a Simplified waterlevel classification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3332
diff changeset
54 return time.Unix(int64(secs), int64(nsecs))
3027
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
55 }
84e6577a474b Fairway availability: More robust time and value interpolations including corner cases. Still TODO: Distribute to classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2929
diff changeset
56 }