annotate cmd/isoareas/main.go @ 4586:90936099d1c8 iso-areas

Merged default into iso-areas branch.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 08 Oct 2019 17:21:56 +0200
parents 07f632cd2625
children
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"
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"
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"
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
24 "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
25 "strconv"
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 "strings"
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
27 "sync"
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
28 "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
29
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
30 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
31 "github.com/fogleman/contourmap"
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
32
4558
07f632cd2625 Moved linear interpolation to common package for re-use.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4557
diff changeset
33 "gemma.intevation.de/gemma/pkg/common"
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
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
80 func dumpContoursSVG(
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
81 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
82 heights []float64,
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
83 colors models.ColorValues,
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
84 contours [][]contourmap.Contour,
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
85 ) (err error) {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
86
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
87 var (
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
88 minX = math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
89 minY = math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
90 maxX = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
91 maxY = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
92 )
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
93
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
94 for _, c := range contours {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
95 for _, r := range c {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
96 for _, p := range r {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
97 if p.X < minX {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
98 minX = p.X
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
99 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
100 if p.Y < minY {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
101 minY = p.Y
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
102 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
103 if p.X > maxX {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
104 maxX = p.X
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
105 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
106 if p.Y > maxY {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
107 maxY = p.Y
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
108 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
109 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
110 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
111 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
112 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
113
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
114 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
115
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
116 const width = 50000
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
117 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
118
4558
07f632cd2625 Moved linear interpolation to common package for re-use.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4557
diff changeset
119 px := common.Linear(minX, 0, maxX, width)
07f632cd2625 Moved linear interpolation to common package for re-use.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4557
diff changeset
120 py := common.Linear(minY, float64(height), maxY, 0)
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
121
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
122 out := bufio.NewWriter(w)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
123 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
124
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
125 canvas := svg.New(out)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
126 canvas.Start(width, height)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
127
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
128 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
129
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
130 h := heights[j]
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
131 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
132
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
133 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
134
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
135 for _, r := range c {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
136 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
137 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
138 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
139 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
140 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
141 }
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 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
144 }
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
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
147 canvas.End()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
148 return
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
149 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
150
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 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
152
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
153 cellSize := float64(0.5)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
154
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
155 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
156
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
157 flag.Parse()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
158
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
159 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
160 check(err)
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
161
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
162 heights := colors.Heights()
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
163
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
164 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
165 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
166 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
167 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
168 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
169
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 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
171
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
172 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
173 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
174 check(err)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
175 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
176 tooLongEdge := tri.EstimateTooLong()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
177 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
178
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
179 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
180 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
181
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
182 polygonArea := polygon.Area()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
183 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
184 polygonArea = -polygonArea
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
185 polygon.Reverse()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
186 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
187
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
188 var clippingPolygon octree.Polygon
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
189 clippingPolygon.FromLineStringZ(polygon)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
190 clippingPolygon.Indexify()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
191
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
192 tin := tri.Tin()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
193 // tin.EPSG = epsg
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
194
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
195 var str octree.STRTree
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
196 str.Build(tin)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
197
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
198 removed = str.Clip(&clippingPolygon)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
199
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
200 builder := octree.NewBuilder(tin)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
201 builder.Build(removed)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
202
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
203 tree := builder.Tree()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
204
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
205 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
206
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
207 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
208 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
209 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
210
4555
1c5c6ffab886 Extrapolate the class breaks to the models Z extrema.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4553
diff changeset
211 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
212
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
213 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
214 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
215
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
216 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
217
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
218 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
219 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
220
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
221 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
222
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
223 // 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
224 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
225
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
226 const closed = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
227 for i := range raster {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
228 raster[i] = closed
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
229 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
230
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
231 start = time.Now()
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
232
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
233 var wg sync.WaitGroup
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
234
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
235 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
236
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
237 rasterRow := func() {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
238 defer wg.Done()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
239 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
240 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
241 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
242 //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
243 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
244 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
245 for j := range row {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
246 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
247 if ok {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
248 row[j] = v
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
249 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
250 px += cellSize
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
251 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
252 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
253 }
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
254
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
255 start = time.Now()
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
256
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
257 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
258 wg.Add(1)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
259 go rasterRow()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
260 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
261
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
262 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
263 rows <- i
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
264 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
265 close(rows)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
266
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
267 wg.Wait()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
268
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
269 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
270
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
271 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
272 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
273
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
274 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
275
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
276 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
277
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
278 cnts := make(chan int)
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
279
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
280 doContours := func() {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
281 defer wg.Done()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
282 for i := range cnts {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
283 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
284 }
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
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
287 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
288 wg.Add(1)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
289 go doContours()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
290 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
291
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
292 for i := range heights {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
293 cnts <- i
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
294 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
295 close(cnts)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
296
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
297 wg.Wait()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
298
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
299 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
300 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
301
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
302 /*
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
303
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
304 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
305 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
306 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
307
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
308 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
309 */
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
310 }