Mercurial > gemma
annotate pkg/octree/areas.go @ 4667:0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 14 Oct 2019 17:23:29 +0200 |
parents | 3eda5a7215ab |
children | c91e759007da |
rev | line source |
---|---|
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2018 by via donau |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package octree |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import ( |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "log" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 "math" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
19 "runtime" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 "sync" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 "time" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 "github.com/fogleman/contourmap" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 "gemma.intevation.de/gemma/pkg/common" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 "gemma.intevation.de/gemma/pkg/wkb" |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 ) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 |
4654
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
29 func GenerateRandomVertices( |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
30 n int, |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
31 min, max Vertex, |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
32 eval func(float64, float64) (float64, bool), |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
33 callback func([]Vertex), |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
34 ) { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
35 var wg sync.WaitGroup |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
36 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
37 jobs := make(chan int) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
38 out := make(chan []Vertex) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
39 done := make(chan struct{}) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
40 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
41 cpus := runtime.NumCPU() |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
42 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
43 free := make(chan []Vertex, cpus) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
44 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
45 for i := 0; i < cpus; i++ { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
46 wg.Add(1) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
47 go func() { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
48 defer wg.Done() |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
49 xRange := common.Random(min.X, max.X) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
50 yRange := common.Random(min.Y, max.Y) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
51 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
52 for size := range jobs { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
53 var vertices []Vertex |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
54 select { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
55 case vertices = <-free: |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
56 default: |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
57 vertices = make([]Vertex, 0, 1000) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
58 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
59 for len(vertices) < size { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
60 x, y := xRange(), yRange() |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
61 if z, ok := eval(x, y); ok { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
62 vertices = append(vertices, Vertex{X: x, Y: y, Z: z}) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
63 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
64 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
65 out <- vertices |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
66 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
67 }() |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
68 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
69 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
70 go func() { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
71 defer close(done) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
72 for vertices := range out { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
73 callback(vertices) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
74 select { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
75 case free <- vertices[:0]: |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
76 default: |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
77 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
78 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
79 }() |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
80 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
81 for remain := n; remain > 0; { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
82 if remain > 1000 { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
83 jobs <- 1000 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
84 remain -= 1000 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
85 } else { |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
86 jobs <- remain |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
87 remain = 0 |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
88 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
89 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
90 close(jobs) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
91 wg.Wait() |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
92 close(out) |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
93 <-done |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
94 } |
3eda5a7215ab
Generate STRTrees instaead of Octree during sounding result imports.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4640
diff
changeset
|
95 |
4640
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
96 func TraceAreas( |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
97 heights []float64, |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 cellSize float64, |
4640
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
99 min, max Vertex, |
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
100 eval func(float64, float64) (float64, bool), |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
101 ) []wkb.MultiPolygonGeom { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
102 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
103 width := max.X - min.X |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
104 height := max.Y - min.Y |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
105 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
106 log.Printf("info: Width/Height: %.2f / %.2f\n", width, height) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
107 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
108 xcells := int(math.Ceil(width / cellSize)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
109 ycells := int(math.Ceil(height / cellSize)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
110 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
111 log.Printf("info: Raster size: (%d, %d)\n", xcells, ycells) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
112 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
113 start := time.Now() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
114 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
115 // Add border for closing |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
116 raster := make([]float64, (xcells+2)*(ycells+2)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
117 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
118 // prefill for no data |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
119 const nodata = -math.MaxFloat64 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
120 for i := range raster { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
121 raster[i] = nodata |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
122 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
123 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
124 // rasterize the height model |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
125 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
126 var wg sync.WaitGroup |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 rows := make(chan int) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
129 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
130 rasterRow := func() { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 defer wg.Done() |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
132 quat := 0.25 * cellSize |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
133 for i := range rows { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
134 pos := (i+1)*(xcells+2) + 1 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
135 row := raster[pos : pos+xcells] |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
136 py := min.Y + float64(i)*cellSize + cellSize/2 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
137 px := min.X + cellSize/2 |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
138 y1 := py - quat |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
139 y2 := py + quat |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 for j := range row { |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
141 var n int |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
142 var sum float64 |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
143 |
4640
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
144 if v, ok := eval(px-quat, y1); ok { |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
145 sum = v |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
146 n = 1 |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
147 } |
4640
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
148 if v, ok := eval(px-quat, y2); ok { |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
149 sum += v |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
150 n++ |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
151 } |
4640
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
152 if v, ok := eval(px+quat, y1); ok { |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
153 sum += v |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
154 n++ |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
155 } |
4640
fb09a43b062e
Decouple the tracing of the iso areas from the octree data structure.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4577
diff
changeset
|
156 if v, ok := eval(px+quat, y2); ok { |
4575
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
157 sum += v |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
158 n++ |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
159 } |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
160 |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
161 if n > 0 { |
6415368c2c60
Use simple super-sampling when rasterizing.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4570
diff
changeset
|
162 row[j] = sum / float64(n) |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
163 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
164 px += cellSize |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
165 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
166 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
167 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
168 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
169 for n := runtime.NumCPU(); n >= 1; n-- { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
170 wg.Add(1) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
171 go rasterRow() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
172 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
173 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
174 for i := 0; i < ycells; i++ { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
175 rows <- i |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
176 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
177 close(rows) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
178 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
179 wg.Wait() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
180 log.Printf("info: Rastering took %v\n", time.Since(start)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
181 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
182 start = time.Now() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
183 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
184 tracer := contourmap.FromFloat64s(xcells+2, ycells+2, raster) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
185 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
186 areas := make([]wkb.MultiPolygonGeom, len(heights)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
187 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 // TODO: Check if this correct! |
4577
82029885c11b
Fixed systematic offset of new iso areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4575
diff
changeset
|
189 reprojX := common.Linear(0.5, min.X, 1.5, min.X+cellSize) |
82029885c11b
Fixed systematic offset of new iso areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4575
diff
changeset
|
190 reprojY := common.Linear(0.5, min.Y, 1.5, min.Y+cellSize) |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
191 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
192 cnts := make(chan int) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
193 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
194 doContours := func() { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
195 defer wg.Done() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
196 for hIdx := range cnts { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
197 c := tracer.Contours(heights[hIdx]) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
198 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
199 if len(c) == 0 { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
200 continue |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
201 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
202 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
203 // We need to bring it back to the |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
204 // none raster coordinate system. |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
205 a := make(wkb.MultiPolygonGeom, len(c)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
206 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
207 for i, pl := range c { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
208 shell := make(wkb.LinearRingGeom, len(pl)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
209 for j, pt := range pl { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
210 shell[j] = wkb.PointGeom{ |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
211 X: reprojX(pt.X), |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
212 Y: reprojY(pt.Y), |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
213 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
214 } |
4667
0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4654
diff
changeset
|
215 /* |
0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4654
diff
changeset
|
216 if !shell.CCW() { |
0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4654
diff
changeset
|
217 log.Println("not ccw") |
0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4654
diff
changeset
|
218 shell.Reverse() |
0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4654
diff
changeset
|
219 } |
0ddb308fed37
Reintroduced the ST_MakeValid calls when inserting the iso geometries into the database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4654
diff
changeset
|
220 */ |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
221 a[i] = wkb.PolygonGeom{shell} |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
222 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
223 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
224 areas[hIdx] = a |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
225 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
226 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
227 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
228 for n := runtime.NumCPU(); n >= 1; n-- { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
229 wg.Add(1) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
230 go doContours() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
231 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
232 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
233 for i := range heights { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
234 cnts <- i |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
235 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
236 close(cnts) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
237 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
238 wg.Wait() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
239 log.Printf("info: Tracing areas took %v\n", time.Since(start)) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
240 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
241 return areas |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
242 } |