annotate pkg/octree/contours.go @ 2479:c85b16db8a02 octree-diff

Calculate better triangulation and store it into database. A bit fake by now. Needs extra: CREATE TABLE diff_contour_lines ( height numeric NOT NULL, lines geography(MultiLineString,4326) NOT NULL ); GRANT ALL ON diff_contour_lines TO sophie;
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 28 Feb 2019 15:55:32 +0100
parents f4dcbe8941a1
children 45d51a49f191
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 (
2479
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
18 "log"
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "runtime"
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "sync"
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 )
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
23 // 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
24 // 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
25 type ContourResult struct {
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
26 Height float64
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
27 Lines MultiLineStringZ
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
28
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
29 done bool
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
30 mu sync.Mutex
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
31 cond *sync.Cond
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
32 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
33
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
34 // 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
35 // the result of the iso line calculation.
1186
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
36 func NewContourResult(height float64) *ContourResult {
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
37 cr := ContourResult{Height: height}
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
38 cr.cond = sync.NewCond(&cr.mu)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
39 return &cr
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
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
42 func (cr *ContourResult) wait() {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
43 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
44 for !cr.done {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
45 cr.cond.Wait()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
46 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
47 cr.cond.L.Unlock()
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
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
50 func (cr *ContourResult) get() float64 {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
51 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
52 defer cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
53 return cr.Height
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
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
56 func (cr *ContourResult) set(lines MultiLineStringZ) {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
57 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
58 defer cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
59 cr.Lines = lines
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
60 cr.done = true
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
61 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
62 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
64 // 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
65 // 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
66 // 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
67 // 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
68 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
69
2479
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
70 if len(heights) == 0 {
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
71 return
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
72 }
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
73
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
74 log.Printf("num heights: %d\n", len(heights))
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
75
1186
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
76 contours := make([]*ContourResult, len(heights))
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
77
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
78 for i, h := range heights {
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
79 contours[i] = NewContourResult(h)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
80 }
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
82 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
83
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 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
85 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
86 wg.Add(1)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
87 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
88 }
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
89
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
90 done := make(chan struct{})
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
91 go func() {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
92 defer close(done)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
93 for _, cr := range contours {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
94 cr.wait()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
95 store(cr)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
96 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
97 }()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
98
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
99 for _, cr := range contours {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
100 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
101 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102 close(jobs)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
103
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 wg.Wait()
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
105 <-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
106 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 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
109 tree *Tree,
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
110 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
111 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
112 ) {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 defer wg.Done()
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
114 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
115 var lines MultiLineStringZ
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
116 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
117 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
118 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
119 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
120 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
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 })
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
123 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
124 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 }