annotate cmd/isoareas/main.go @ 4551:b5b23b6d76f1 iso-areas

Move own algorith to separate file.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 01 Oct 2019 11:07:33 +0200
parents aa2d0006e742
children 7ed5a4a94efc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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"
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
18 "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
19 "io"
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "log"
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
21 "math"
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
22 "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
23 "os"
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 "strconv"
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 "strings"
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
26 "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
27
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
28 svg "github.com/ajstarks/svgo"
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
29
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 "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
31 )
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 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
34
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 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
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 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
38
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 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
40
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 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
42 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
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 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
45 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
46 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
47 continue
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 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
50 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
51 continue
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 }
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 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
55 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
56 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 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
58 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
59 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 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
61 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
62 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 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
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
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 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
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
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 func minMax(points []octree.Vertex) (octree.Vertex, octree.Vertex) {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 if len(points) == 0 {
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 octree.Vertex{}, octree.Vertex{}
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 min, max := points[0], points[0]
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 for _, v := range points {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 min.Minimize(v)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 max.Maximize(v)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 return min, max
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 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
85 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
86 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
87 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
90 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
91 // f(x1) = y1
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
92 // f(x2) = y2
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
93 // 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
94 // y2 = x2*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
95
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
96 // y1 - y2 = a*(x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
97 // 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
98
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
99 if x1 == x2 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
100 return func(float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
101 return 0.5 * (y1 + y2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
102 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
103 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
104 a := (y1 - y2) / (x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
105 b := y1 - x1*a
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
106 return func(x float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
107 return x*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
108 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
109 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
110
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
111 func dumpPolygonsSVG(
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
112 w io.Writer,
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
113 min, max octree.Vertex,
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
114 classPolygons [][]octree.LineStringZ,
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
115 ) (err error) {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
116
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
117 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
118
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
119 log.Printf("ratio: %.2f\n", ratio)
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
120
4547
6247f5a42226 Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4546
diff changeset
121 const width = 50000
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
122 height := int(math.Ceil(width * ratio))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
123
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
124 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
125 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
126
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
127 out := bufio.NewWriter(w)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
128 defer func() { err = out.Flush() }()
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
129
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
130 canvas := svg.New(out)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
131 canvas.Start(width, height)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
132
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
133 rnd := rand.New(rand.NewSource(42))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
134
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
135 for _, polygons := range classPolygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
136
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
137 r := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
138 g := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
139 b := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
140 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
141
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
142 for _, polygon := range polygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
143
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
144 x := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
145 y := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
146 for i, p := range polygon {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
147 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
148 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
149 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
150
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
151 canvas.Polygon(x, y, style)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
152 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
153
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
154 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
155
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
156 canvas.End()
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
157
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
158 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
159 }
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
160
4550
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
161 func dumpArcsSVG(
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
162 w io.Writer,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
163 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
164 cuts [][]indexedArc,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
165 arcs []octree.LineStringZ,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
166 ) (err error) {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
167
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
168 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
169
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
170 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
171
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
172 const width = 50000
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
173 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
174
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
175 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
176 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
177
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
178 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
179 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
180
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
181 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
182 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
183
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
184 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
185
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
186 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
187
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
188 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
189
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
190 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
191 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
192 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
193
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
194 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
195
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
196 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
197 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
198 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
199 continue
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
200 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
201 usedArcs[idx] = struct{}{}
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
202 arc := arcs[idx]
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
203 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
204 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
205 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
206 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
207 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
208 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
209
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
210 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
211 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
212 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
213
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
214 canvas.End()
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
215
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
216 return nil
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
217 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
218
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219 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
220
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
221 heights, err := octree.ParseClassBreaks(classBreaks)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
222 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
223 log.Printf("num classes: %d\n", len(heights))
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
225 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
226 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
227 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
228 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
229
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230 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
231
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 min, max := minMax(xyz)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234 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
235 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
236 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
237
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
238 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
239 tri, err := octree.Triangulate(xyz)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
240 check(err)
4536
3130c005abef Measure time of triangulation correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4535
diff changeset
241 log.Printf("triangulation 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
242
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
243 log.Printf("number of triangles: %d\n", len(tri.Triangles)/3)
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
244
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
245 start = time.Now()
4550
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
246 polygons := intersectTriangles(tri, heights, min, max)
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
247 log.Printf("intersecting triangles took %v.\n", time.Since(start))
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
248
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
249 check(dumpPolygonsSVG(os.Stdout, min, max, polygons))
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
250 }