Mercurial > gemma
annotate cmd/isoareas/main.go @ 4556:04eba9dc917d iso-areas
Use colors from configuration instead of random rgb values.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 01 Oct 2019 17:37:54 +0200 |
parents | 1c5c6ffab886 |
children | 17cba8b447a6 |
rev | line source |
---|---|
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2019 by via donau |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package main |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import ( |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "bufio" |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
18 "flag" |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
19 "fmt" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 "io" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 "log" |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
22 "math" |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
23 "math/rand" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 "os" |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
25 "runtime" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 "strconv" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 "strings" |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
28 "sync" |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
29 "time" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
31 svg "github.com/ajstarks/svgo" |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
32 "github.com/fogleman/contourmap" |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
33 |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
34 "gemma.intevation.de/gemma/pkg/models" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 "gemma.intevation.de/gemma/pkg/octree" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 ) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 const classBreaks = `1:#ff00dd,1.5,1.7,1.9,2.1,2.3,2.5:#f25f20,2.7,2.9,3.1:#f7e40e,3.3,3.5,4:#8ad51a,4.5,5,5.5,6,6.5,7:#1414ff` |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 func loadXYZ(r io.Reader) (octree.MultiPointZ, error) { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 scanner := bufio.NewScanner(r) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 points := make(octree.MultiPointZ, 0, 2000000) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 var x, y, z float64 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 var err error |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 for scanner.Scan() { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 line := strings.TrimSpace(scanner.Text()) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 if len(line) == 0 || strings.HasPrefix(line, "#") { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 continue |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 parts := strings.SplitN(line, " ", 3) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 if len(parts) != 3 { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 continue |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 if x, err = strconv.ParseFloat(parts[0], 64); err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 return nil, err |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 if y, err = strconv.ParseFloat(parts[1], 64); err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 return nil, err |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 if z, err = strconv.ParseFloat(parts[2], 64); err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 return nil, err |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 points = append(points, octree.Vertex{X: x, Y: y, Z: z}) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
69 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 return points, nil |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 func check(err error) { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 if err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 log.Fatalf("error: %v\n", err) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
80 func linear(x1, y1, x2, y2 float64) func(float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
81 // f(x1) = y1 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
82 // f(x2) = y2 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
83 // y1 = x1*a + b <=> b = y1 - x1*a |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
84 // y2 = x2*a + b |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
85 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
86 // y1 - y2 = a*(x1 - x2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
87 // a = (y1-y2)/(x1 - x2) for x1 != x2 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
88 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
89 if x1 == x2 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
90 return func(float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
91 return 0.5 * (y1 + y2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
92 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
93 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
94 a := (y1 - y2) / (x1 - x2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
95 b := y1 - x1*a |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
96 return func(x float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
97 return x*a + b |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
98 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
99 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
100 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
101 func dumpContoursSVG( |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
102 w io.Writer, |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
103 heights []float64, |
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
104 colors models.ColorValues, |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
105 contours [][]contourmap.Contour, |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
106 ) (err error) { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
107 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
108 var ( |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
109 minX = math.MaxFloat64 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
110 minY = math.MaxFloat64 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
111 maxX = -math.MaxFloat64 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
112 maxY = -math.MaxFloat64 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
113 ) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
114 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
115 for _, c := range contours { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
116 for _, r := range c { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
117 for _, p := range r { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
118 if p.X < minX { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
119 minX = p.X |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
120 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
121 if p.Y < minY { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
122 minY = p.Y |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
123 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
124 if p.X > maxX { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
125 maxX = p.X |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
126 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
127 if p.Y > maxY { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
128 maxY = p.Y |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
129 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
130 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
131 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
132 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
133 ratio := (maxX - minX) / (maxY - minY) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
134 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
135 log.Printf("ratio: %.2f\n", ratio) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
136 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
137 const width = 50000 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
138 height := int(math.Ceil(width * ratio)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
139 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
140 px := linear(minX, 0, maxX, width) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
141 py := linear(minY, float64(height), maxY, 0) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
142 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
143 out := bufio.NewWriter(w) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
144 defer func() { err = out.Flush() }() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
145 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
146 canvas := svg.New(out) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
147 canvas.Start(width, height) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
148 |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
149 for j, c := range contours { |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
150 |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
151 h := heights[j] |
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
152 col := colors.Clip(h) |
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
153 |
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
154 style := fmt.Sprintf("fill:#%02x%02x%02x", col.R, col.G, col.B) |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
155 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
156 for _, r := range c { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
157 x := make([]int, len(r)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
158 y := make([]int, len(r)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
159 for i, p := range r { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
160 x[i] = int(math.Round(px(p.X))) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
161 y[i] = int(math.Round(py(p.Y))) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
162 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
163 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
164 canvas.Polygon(x, y, style) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
165 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
166 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
167 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
168 canvas.End() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
169 return |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
170 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
171 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
172 func dumpPolygonsSVG( |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
173 w io.Writer, |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
174 min, max octree.Vertex, |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
175 classPolygons [][]octree.LineStringZ, |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
176 ) (err error) { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
177 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
178 ratio := (max.X - min.X) / (max.Y - min.Y) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
179 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
180 log.Printf("ratio: %.2f\n", ratio) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
181 |
4547
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
182 const width = 50000 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
183 height := int(math.Ceil(width * ratio)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
184 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
185 px := linear(min.X, 0, max.X, width) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
186 py := linear(min.Y, float64(height), max.Y, 0) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
187 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
188 out := bufio.NewWriter(w) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
189 defer func() { err = out.Flush() }() |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
190 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
191 canvas := svg.New(out) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
192 canvas.Start(width, height) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
193 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
194 rnd := rand.New(rand.NewSource(42)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
195 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
196 for _, polygons := range classPolygons { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
197 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
198 r := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
199 g := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
200 b := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
201 style := fmt.Sprintf("fill:#%02x%02x%02x", r, g, b) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
202 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
203 for _, polygon := range polygons { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
204 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
205 x := make([]int, len(polygon)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
206 y := make([]int, len(polygon)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
207 for i, p := range polygon { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
208 x[i] = int(math.Round(px(p.X))) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
209 y[i] = int(math.Round(py(p.Y))) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
210 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
211 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
212 canvas.Polygon(x, y, style) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
213 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
214 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
215 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
216 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
217 canvas.End() |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
218 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
219 return nil |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
220 } |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
221 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
222 func dumpArcsSVG( |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
223 w io.Writer, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
224 min, max octree.Vertex, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
225 cuts [][]indexedArc, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
226 arcs []octree.LineStringZ, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
227 ) (err error) { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
228 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
229 ratio := (max.X - min.X) / (max.Y - min.Y) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
230 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
231 log.Printf("ratio: %.2f\n", ratio) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
232 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
233 const width = 50000 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
234 height := int(math.Ceil(width * ratio)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
235 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
236 px := linear(min.X, 0, max.X, width) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
237 py := linear(min.Y, float64(height), max.Y, 0) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
238 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
239 out := bufio.NewWriter(w) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
240 defer func() { err = out.Flush() }() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
241 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
242 canvas := svg.New(out) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
243 canvas.Start(width, height) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
244 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
245 rnd := rand.New(rand.NewSource(42)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
246 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
247 for _, cut := range cuts { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
248 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
249 usedArcs := map[int32]struct{}{} |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
250 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
251 r := byte(rnd.Intn(256)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
252 g := byte(rnd.Intn(256)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
253 b := byte(rnd.Intn(256)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
254 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
255 style := fmt.Sprintf("fill:none;stroke:#%02x%02x%02x", r, g, b) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
256 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
257 for i := range cut { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
258 idx := cut[i].arc |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
259 if _, already := usedArcs[idx]; already { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
260 continue |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
261 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
262 usedArcs[idx] = struct{}{} |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
263 arc := arcs[idx] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
264 x := make([]int, len(arc)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
265 y := make([]int, len(arc)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
266 for i, p := range arc { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
267 x[i] = int(math.Round(px(p.X))) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
268 y[i] = int(math.Round(py(p.Y))) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
269 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
270 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
271 canvas.Polyline(x, y, style) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
272 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
273 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
274 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
275 canvas.End() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
276 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
277 return nil |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
278 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
279 |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
280 func main() { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
281 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
282 cellSize := float64(0.5) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
283 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
284 flag.Float64Var(&cellSize, "cellsize", 0.5, "width/height of raster cell [m]") |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
285 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
286 flag.Parse() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
287 |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
288 colors, err := models.ParseColorValues(classBreaks) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
289 check(err) |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
290 |
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
291 heights := colors.Heights() |
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
292 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
293 log.Printf("num classes: %d\n", len(heights)) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
294 start := time.Now() |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
295 xyz, err := loadXYZ(os.Stdin) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
296 check(err) |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
297 log.Printf("loading took %v\n", time.Since(start)) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
298 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
299 log.Printf("num vertices: %d\n", len(xyz)) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
300 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
301 start = time.Now() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
302 tri, err := octree.Triangulate(xyz) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
303 check(err) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
304 log.Printf("triangulation took %v\n", time.Since(start)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
305 tooLongEdge := tri.EstimateTooLong() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
306 log.Printf("Eliminate triangles with edges longer than %.2f meters.", tooLongEdge) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
307 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
308 start = time.Now() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
309 polygon, removed := tri.ConcaveHull(tooLongEdge) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
310 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
311 polygonArea := polygon.Area() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
312 if polygonArea < 0.0 { // counter clockwise |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
313 polygonArea = -polygonArea |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
314 polygon.Reverse() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
315 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
316 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
317 var clippingPolygon octree.Polygon |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
318 clippingPolygon.FromLineStringZ(polygon) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
319 clippingPolygon.Indexify() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
320 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
321 tin := tri.Tin() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
322 // tin.EPSG = epsg |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
323 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
324 var str octree.STRTree |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
325 str.Build(tin) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
326 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
327 removed = str.Clip(&clippingPolygon) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
328 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
329 builder := octree.NewBuilder(tin) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
330 builder.Build(removed) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
331 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
332 tree := builder.Tree() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
333 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
334 min, max := tin.Min, tin.Max |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
335 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
336 log.Printf("(%.2f, %.2f, %.2f) - (%.2f, %.2f, %.2f)\n", |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
337 min.X, min.Y, min.Z, |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
338 max.X, max.Y, max.Z) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
339 |
4555
1c5c6ffab886
Extrapolate the class breaks to the models Z extrema.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4553
diff
changeset
|
340 heights = octree.ExtrapolateClassBreaks(heights, min.Z, max.Z) |
1c5c6ffab886
Extrapolate the class breaks to the models Z extrema.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4553
diff
changeset
|
341 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
342 width := max.X - min.X |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
343 height := max.Y - min.Y |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
344 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
345 log.Printf("width/height: %.2f / %.2f\n", width, height) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
346 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
347 xcells := int(math.Ceil(width / cellSize)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
348 ycells := int(math.Ceil(height / cellSize)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
349 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
350 log.Printf("raster size: (%d, %d)\n", xcells, ycells) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
351 |
4553
4c476d65d1bb
Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4552
diff
changeset
|
352 // Add border for closing |
4c476d65d1bb
Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4552
diff
changeset
|
353 raster := make([]float64, (xcells+2)*(ycells+2)) |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
354 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
355 const closed = -math.MaxFloat64 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
356 for i := range raster { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
357 raster[i] = closed |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
358 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
359 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
360 start = time.Now() |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
361 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
362 var wg sync.WaitGroup |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
363 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
364 rows := make(chan int) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
365 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
366 rasterRow := func() { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
367 defer wg.Done() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
368 for i := range rows { |
4553
4c476d65d1bb
Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4552
diff
changeset
|
369 pos := (i+1)*(xcells+2) + 1 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
370 row := raster[pos : pos+xcells] |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
371 //log.Printf("len: %d\n", len(row)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
372 py := min.Y + float64(i)*cellSize + cellSize/2 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
373 px := min.X + cellSize/2 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
374 for j := range row { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
375 v, ok := tree.Value(px, py) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
376 if ok { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
377 row[j] = v |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
378 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
379 px += cellSize |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
380 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
381 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
382 } |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
383 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
384 start = time.Now() |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
385 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
386 for n := runtime.NumCPU(); n >= 1; n-- { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
387 wg.Add(1) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
388 go rasterRow() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
389 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
390 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
391 for i := 0; i < ycells; i++ { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
392 rows <- i |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
393 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
394 close(rows) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
395 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
396 wg.Wait() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
397 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
398 log.Printf("Rasterizing took %v.\n", time.Since(start)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
399 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
400 start = time.Now() |
4553
4c476d65d1bb
Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4552
diff
changeset
|
401 cm := contourmap.FromFloat64s(xcells+2, ycells+2, raster) |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
402 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
403 start = time.Now() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
404 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
405 contours := make([][]contourmap.Contour, len(heights)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
406 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
407 cnts := make(chan int) |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
408 |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
409 doContours := func() { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
410 defer wg.Done() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
411 for i := range cnts { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
412 contours[i] = cm.Contours(heights[i]) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
413 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
414 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
415 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
416 for n := runtime.NumCPU(); n >= 1; n-- { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
417 wg.Add(1) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
418 go doContours() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
419 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
420 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
421 for i := range heights { |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
422 cnts <- i |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
423 } |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
424 close(cnts) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
425 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
426 wg.Wait() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
427 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
428 log.Printf("Calculating contours took %v.\n", time.Since(start)) |
4556
04eba9dc917d
Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4555
diff
changeset
|
429 check(dumpContoursSVG(os.Stdout, heights, colors, contours)) |
4552
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
430 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
431 /* |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
432 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
433 start = time.Now() |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
434 polygons := intersectTriangles(tri, heights, min, max) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
435 log.Printf("intersecting triangles took %v.\n", time.Since(start)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
436 |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
437 check(dumpPolygonsSVG(os.Stdout, min, max, polygons)) |
7ed5a4a94efc
Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4551
diff
changeset
|
438 */ |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
439 } |