annotate pkg/octree/contours.go @ 4650:f5fce22184da stree-experiment

Added a deserializer from STRTrees.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 14 Oct 2019 01:28:18 +0200
parents 631f5eaf29de
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
2 // without warranty, see README.md and license for details.
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
3 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
6 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
7 // Copyright (C) 2018 by via donau
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
9 // Software engineering by Intevation GmbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
10 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
11 // Author(s):
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
1317
5443f5c9154c Added missing authors names in Go files.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1186
diff changeset
13 // * Tom Gottfried <tom.gottfried@intevation.de>
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
14
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 package octree
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import (
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "runtime"
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "sync"
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 )
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
22 // ContourResult stores an calculated iso line for a given height.
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
23 // Is used as a future variable in the concurrent iso line calculation.
977
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
24 type ContourResult struct {
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
25 Height float64
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
26 Lines MultiLineStringZ
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
27
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
28 done bool
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
29 mu sync.Mutex
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
30 cond *sync.Cond
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
31 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
32
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
33 // NewContourResult prepares a future variable to later hold
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
34 // the result of the iso line calculation.
1186
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
35 func NewContourResult(height float64) *ContourResult {
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
36 cr := ContourResult{Height: height}
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
37 cr.cond = sync.NewCond(&cr.mu)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
38 return &cr
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
39 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
40
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
41 func (cr *ContourResult) wait() {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
42 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
43 for !cr.done {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
44 cr.cond.Wait()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
45 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
46 cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
47 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
48
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
49 func (cr *ContourResult) get() float64 {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
50 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
51 defer cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
52 return cr.Height
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
53 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
54
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
55 func (cr *ContourResult) set(lines MultiLineStringZ) {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
56 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
57 defer cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
58 cr.Lines = lines
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
59 cr.done = true
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
60 cr.cond.Signal()
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
63 // DoContours calculates the iso line for the given heights.
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
64 // This is done concurrently.
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
65 // It is guaranteed that the results are given to the store
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
66 // function in order of the original heights values.
1184
064d44ccc6f2 Adjust contour lines heights to multiples of step width
Tom Gottfried <tom@intevation.de>
parents: 1134
diff changeset
67 func DoContours(tree *Tree, heights []float64, store func(*ContourResult)) {
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
2479
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
69 if len(heights) == 0 {
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
70 return
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
71 }
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
72
1186
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
73 contours := make([]*ContourResult, len(heights))
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
74
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
75 for i, h := range heights {
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
76 contours[i] = NewContourResult(h)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
77 }
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
79 jobs := make(chan *ContourResult)
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 var wg sync.WaitGroup
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 for i, n := 0, runtime.NumCPU(); i < n; i++ {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 wg.Add(1)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
84 go processLevels(tree, jobs, &wg)
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 }
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
86
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
87 done := make(chan struct{})
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
88 go func() {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
89 defer close(done)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
90 for _, cr := range contours {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
91 cr.wait()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
92 store(cr)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
93 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
94 }()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
95
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
96 for _, cr := range contours {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
97 jobs <- cr
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 close(jobs)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
100
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 wg.Wait()
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
102 <-done
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105 func processLevels(
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 tree *Tree,
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
107 jobs <-chan *ContourResult,
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 wg *sync.WaitGroup,
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 ) {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 defer wg.Done()
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
111 for cr := range jobs {
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112 var lines MultiLineStringZ
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
113 h := cr.get()
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 tree.Horizontal(h, func(t *Triangle) {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115 line := t.IntersectHorizontal(h)
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 if len(line) > 1 {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117 lines = append(lines, line)
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119 })
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
120 cr.set(lines.Merge())
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122 }