Mercurial > gemma
annotate pkg/octree/polygon.go @ 2489:4f292ff74d9e octree-diff
Added a WKB reader for clipping polygon.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sun, 03 Mar 2019 18:08:40 +0100 |
parents | cb55d7eaaa36 |
children | c9164ff98871 |
rev | line source |
---|---|
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2018 by via donau |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package octree |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
16 import ( |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
17 "bytes" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
18 "encoding/binary" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
19 "fmt" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
20 "math" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
21 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
22 "gemma.intevation.de/gemma/pkg/wkb" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
23 ) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
24 |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 type Polygon struct { |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 // TODO: Implement me! |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
27 rings [][]float64 |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 } |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 type IntersectionType byte |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 const ( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 IntersectionInside IntersectionType = iota |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 IntersectionOverlaps |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 ) |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 func (p *Polygon) IntersectionBox2D(box Box2D) IntersectionType { |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 // TODO: Implement me |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 return IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 } |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 func (p *Polygon) IntersectionWithTriangle(t *Triangle) IntersectionType { |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 // TODO: Implement me |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 return IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 } |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
47 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
48 func (p *Polygon) FromWKB(data []byte) error { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
49 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
50 r := bytes.NewReader(data) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
51 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
52 endian, err := r.ReadByte() |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
53 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
54 var order binary.ByteOrder |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
55 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
56 switch { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
57 case err != nil: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
58 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
59 case endian == wkb.NDR: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
60 order = binary.LittleEndian |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
61 case endian == wkb.XDR: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
62 order = binary.BigEndian |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
63 default: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
64 return fmt.Errorf("unknown byte order %x", endian) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
65 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
66 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
67 var geomType uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
68 err = binary.Read(r, order, &geomType) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
69 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
70 switch { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
71 case err != nil: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
72 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
73 case geomType != wkb.Polygon: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
74 return fmt.Errorf("unknown geometry type %x", geomType) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
75 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
76 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
77 var numRings uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
78 if err = binary.Read(r, order, &numRings); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
79 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
80 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
81 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
82 rings := make([][]float64, numRings) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
83 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
84 for ring := uint32(0); ring < numRings; ring++ { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
85 var numVertices uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
86 if err = binary.Read(r, order, &numVertices); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
87 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
88 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
89 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
90 vertices := make([]float64, 2*numVertices) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
91 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
92 for v := uint32(0); v < numVertices; v++ { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
93 var lat, lon uint64 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
94 if err = binary.Read(r, order, &lat); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
95 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
96 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
97 if err = binary.Read(r, order, &lon); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
98 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
99 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
100 vertices[v*2] = math.Float64frombits(lat) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
101 vertices[v*2+1] = math.Float64frombits(lon) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
102 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
103 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
104 rings[ring] = vertices |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
105 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
106 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
107 p.rings = rings |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
108 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
109 return nil |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
110 } |