Mercurial > gemma
annotate pkg/octree/areas.go @ 4741:5164b4450c42
Removed redundant code in stacking iso polygons correctly.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 18 Oct 2019 12:11:45 +0200 |
parents | 257dd6039a28 |
children | 5c80a33edd44 |
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 |
4738
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
203 areas[hIdx] = buildMultipolygon(c, reprojX, reprojY) |
4570
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
204 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
205 } |
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 n := runtime.NumCPU(); n >= 1; n-- { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
208 wg.Add(1) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
209 go doContours() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
210 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
211 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
212 for i := range heights { |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
213 cnts <- i |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
214 } |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
215 close(cnts) |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
216 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
217 wg.Wait() |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
218 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
|
219 |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
220 return areas |
4b3a298b94f8
Moved area tracing to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
221 } |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
222 |
4730
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
223 type contour []contourmap.Point |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
224 |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
225 type bboxNode struct { |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
226 box Box2D |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
227 cnt contour |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
228 children []*bboxNode |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
229 } |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
230 |
4733
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
231 func (cnt contour) contains(o contour) bool { |
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
232 return contains(cnt, o[0].X, o[0].Y) || |
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
233 contains(cnt, o[len(o)/2].X, o[len(o)/2].Y) |
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
234 } |
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
235 |
4730
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
236 func (cnt contour) closed() bool { |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
237 return len(cnt) >= 3 |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
238 } |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
239 |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
240 func (cnt contour) length() int { |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
241 return len(cnt) |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
242 } |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
243 |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
244 func (cnt contour) point(i int) (float64, float64) { |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
245 return cnt[i].X, cnt[i].Y |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
246 } |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
247 |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
248 func (cnt contour) bbox() Box2D { |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
249 minX, minY := math.MaxFloat64, math.MaxFloat64 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
250 maxX, maxY := -math.MaxFloat64, -math.MaxFloat64 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
251 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
252 for _, p := range cnt { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
253 if p.X < minX { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
254 minX = p.X |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
255 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
256 if p.X > maxX { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
257 maxX = p.X |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
258 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
259 if p.Y < minY { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
260 minY = p.Y |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
261 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
262 if p.Y > maxY { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
263 maxY = p.Y |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
264 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
265 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
266 return Box2D{X1: minX, X2: maxX, Y1: minY, Y2: maxY} |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
267 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
268 |
4730
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
269 func (bn *bboxNode) insert(cnt contour, box Box2D) { |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
270 // check if children are inside new |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
271 var nr *bboxNode |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
272 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
273 for i, r := range bn.children { |
4733
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
274 if r.box.Inside(box) && cnt.contains(r.cnt) { |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
275 if nr == nil { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
276 nr = &bboxNode{box: box, cnt: cnt} |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
277 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
278 nr.children = append(nr.children, r) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
279 bn.children[i] = nil |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
280 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
281 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
282 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
283 // we have a new child |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
284 if nr != nil { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
285 // compact the list |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
286 for i := len(bn.children) - 1; i >= 0; i-- { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
287 if bn.children[i] == nil { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
288 if i < len(bn.children)-1 { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
289 copy(bn.children[i:], bn.children[i+1:]) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
290 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
291 bn.children[len(bn.children)-1] = nil |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
292 bn.children = bn.children[:len(bn.children)-1] |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
293 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
294 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
295 bn.children = append(bn.children, nr) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
296 return |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
297 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
298 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
299 // check if new is inside an old |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
300 for _, r := range bn.children { |
4733
1c205bb3d0fd
Take another point into account when checking containment.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4732
diff
changeset
|
301 if box.Inside(r.box) && r.cnt.contains(cnt) { |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
302 r.insert(cnt, box) |
4730
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
303 return |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
304 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
305 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
306 |
4730
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
307 // its a new child node. |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
308 nr = &bboxNode{box: box, cnt: cnt} |
76dbeab4a0d6
Added a new contout type which is capable of doing a point in polygon check and use this as a second level filter in building the bbox tree.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4727
diff
changeset
|
309 bn.children = append(bn.children, nr) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
310 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
311 |
4741
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
312 func (bn *bboxNode) insertRoot(cnt contour) { |
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
313 bn.insert(cnt, cnt.bbox()) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
314 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
315 |
4731
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
316 type bboxOutFunc func(contour, []contour) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
317 |
4731
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
318 func (bn *bboxNode) generate(out bboxOutFunc) { |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
319 |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
320 var grands []*bboxNode |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
321 |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
322 holes := make([]contour, len(bn.children)) |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
323 |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
324 for i, ch := range bn.children { |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
325 holes[i] = ch.cnt |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
326 grands = append(grands, ch.children...) |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
327 } |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
328 out(bn.cnt, holes) |
4739
257dd6039a28
More code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4738
diff
changeset
|
329 |
257dd6039a28
More code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4738
diff
changeset
|
330 // the grand children are new polygons. |
4731
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
331 for _, grand := range grands { |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
332 grand.generate(out) |
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
333 } |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
334 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
335 |
4741
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
336 func (bn *bboxNode) generateRoot(out bboxOutFunc) { |
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
337 for _, r := range bn.children { |
4731
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
338 r.generate(out) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
339 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
340 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
341 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
342 func buildMultipolygon( |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
343 cnts []contourmap.Contour, |
4738
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
344 reprojX, reprojY func(float64) float64, |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
345 ) wkb.MultiPolygonGeom { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
346 |
4741
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
347 var forest bboxNode |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
348 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
349 for _, cnt := range cnts { |
4741
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
350 forest.insertRoot(contour(cnt)) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
351 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
352 |
4731
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
353 //log.Printf("cnts: %d roots: %d\n", len(cnts), len(bf.roots)) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
354 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
355 var mp wkb.MultiPolygonGeom |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
356 |
4731
dc0db4ede3b1
Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4730
diff
changeset
|
357 out := func(sh contour, hls []contour) { |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
358 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
359 polygon := make(wkb.PolygonGeom, 1+len(hls)) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
360 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
361 // Handle shell |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
362 shell := make(wkb.LinearRingGeom, len(sh)) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
363 for j, pt := range sh { |
4738
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
364 shell[j] = wkb.PointGeom{ |
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
365 X: reprojX(pt.X), |
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
366 Y: reprojY(pt.Y), |
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
367 } |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
368 } |
4732
7083fd1da169
Made shell clockwise and holes counter clockwise.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4731
diff
changeset
|
369 if shell.CCW() { |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
370 shell.Reverse() |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
371 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
372 polygon[0] = shell |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
373 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
374 // handle holes |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
375 for i, hl := range hls { |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
376 hole := make(wkb.LinearRingGeom, len(hl)) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
377 for j, pt := range hl { |
4738
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
378 hole[j] = wkb.PointGeom{ |
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
379 X: reprojX(pt.X), |
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
380 Y: reprojY(pt.Y), |
a0a4298a4756
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4733
diff
changeset
|
381 } |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
382 } |
4732
7083fd1da169
Made shell clockwise and holes counter clockwise.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4731
diff
changeset
|
383 if !hole.CCW() { |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
384 hole.Reverse() |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
385 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
386 polygon[1+i] = hole |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
387 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
388 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
389 mp = append(mp, polygon) |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
390 } |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
391 |
4741
5164b4450c42
Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4739
diff
changeset
|
392 forest.generateRoot(out) |
4726
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
393 |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
394 return mp |
c91e759007da
Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4667
diff
changeset
|
395 } |