annotate pkg/octree/areas.go @ 4764:5c80a33edd44

Fixed handling of none-closed polygons in containment test.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sat, 19 Oct 2019 19:40:51 +0200
parents 5164b4450c42
children a2f16bbcc846
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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) 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
237 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
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) 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
241 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
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) 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
245 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
246 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
247
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
248 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
249 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
250 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
251 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
252 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
253 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
254 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
255 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
256 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
257 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
258 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
259 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
260 }
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 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
263 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
264
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
265 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
266 // 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
267 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
268
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
269 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
270 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
271 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
272 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
273 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
274 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
275 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
276 }
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
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
279 // 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
280 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
281 // 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
282 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
283 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
284 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
285 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
286 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
287 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
288 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
289 }
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 = 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
292 return
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 // 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
296 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
297 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
298 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
299 return
4726
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
300 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
301 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
302
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 // 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
304 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
305 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
306 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
307
4741
5164b4450c42 Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4739
diff changeset
308 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
309 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
310 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
311
4731
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
312 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
313
4731
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
314 func (bn *bboxNode) generate(out bboxOutFunc) {
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
315
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
316 var grands []*bboxNode
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
317
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
318 holes := make([]contour, len(bn.children))
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 for i, ch := range bn.children {
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
321 holes[i] = ch.cnt
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
322 grands = append(grands, ch.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 out(bn.cnt, holes)
4739
257dd6039a28 More code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4738
diff changeset
325
257dd6039a28 More code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4738
diff changeset
326 // the grand children are new polygons.
4731
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
327 for _, grand := range grands {
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
328 grand.generate(out)
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
329 }
4726
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
330 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
331
4741
5164b4450c42 Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4739
diff changeset
332 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
333 for _, r := range bn.children {
4731
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
334 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
335 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
336 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
337
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
338 func buildMultipolygon(
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
339 cnts []contourmap.Contour,
4738
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
340 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
341 ) wkb.MultiPolygonGeom {
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
342
4741
5164b4450c42 Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4739
diff changeset
343 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
344
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
345 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
346 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
347 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
348
4731
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
349 //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
350
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
351 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
352
4731
dc0db4ede3b1 Output based on recursive containment.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4730
diff changeset
353 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
354
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
355 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
356
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
357 // Handle shell
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
358 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
359 for j, pt := range sh {
4738
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
360 shell[j] = wkb.PointGeom{
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
361 X: reprojX(pt.X),
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
362 Y: reprojY(pt.Y),
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
363 }
4726
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
364 }
4732
7083fd1da169 Made shell clockwise and holes counter clockwise.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4731
diff changeset
365 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
366 shell.Reverse()
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
367 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
368 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
369
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
370 // handle holes
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
371 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
372 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
373 for j, pt := range hl {
4738
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
374 hole[j] = wkb.PointGeom{
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
375 X: reprojX(pt.X),
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
376 Y: reprojY(pt.Y),
a0a4298a4756 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4733
diff changeset
377 }
4726
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
378 }
4732
7083fd1da169 Made shell clockwise and holes counter clockwise.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4731
diff changeset
379 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
380 hole.Reverse()
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
381 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
382 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
383 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
384
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
385 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
386 }
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
387
4741
5164b4450c42 Removed redundant code in stacking iso polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4739
diff changeset
388 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
389
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
390 return mp
c91e759007da Started with stacking shells and holes of generated polygons correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4667
diff changeset
391 }