Mercurial > gemma
annotate pkg/octree/polygon.go @ 2490:c9164ff98871 octree-diff
Started with point in polygon check.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 03 Mar 2019 21:10:07 +0100 |
parents | 4f292ff74d9e |
children | 10681749371d |
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 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
25 type ring []float64 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
26 |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 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
|
28 // TODO: Implement me! |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
29 rings []ring |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 } |
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 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
|
33 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 const ( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 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
|
36 IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 IntersectionOverlaps |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 ) |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 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
|
41 // 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
|
42 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
|
43 } |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 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
|
46 // 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
|
47 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
|
48 } |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
49 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
50 func (rng ring) isClosed() bool { return (len(rng) / 2) >= 3 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
51 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
52 func (rng ring) contains(point []float64) bool { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
53 if !rng.isClosed() { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
54 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
55 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
56 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
57 contains := intersectsWithRaycast(point, rng[:2], rng[len(rng)-2:len(rng)]) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
58 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
59 for i := 2; i < len(rng); i += 2 { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
60 if intersectsWithRaycast(point, rng[i-2:i], rng[i:i+2]) { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
61 contains = !contains |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
62 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
63 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
64 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
65 return contains |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
66 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
67 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
68 // Using the raycast algorithm, this returns whether or not the passed in point |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
69 // Intersects with the edge drawn by the passed in start and end points. |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
70 // Original implementation: http://rosettacode.org/wiki/Ray-casting_algorithm#Go |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
71 func intersectsWithRaycast(point, start, end []float64) bool { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
72 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
73 // Always ensure that the the first point |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
74 // has a y coordinate that is less than the second point |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
75 if start[1] > end[1] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
76 // Switch the points if otherwise. |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
77 start, end = end, start |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
78 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
79 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
80 // Move the point's y coordinate |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
81 // outside of the bounds of the testing region |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
82 // so we can start drawing a ray |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
83 for point[1] == start[1] || point[1] == end[1] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
84 y := math.Nextafter(point[1], math.Inf(1)) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
85 point = []float64{point[0], y} |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
86 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
87 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
88 // If we are outside of the polygon, indicate so. |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
89 if point[1] < start[1] || point[1] > end[1] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
90 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
91 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
92 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
93 if start[0] > end[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
94 if point[0] > start[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
95 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
96 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
97 if point[0] < end[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
98 return true |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
99 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
100 } else { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
101 if point[0] > end[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
102 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
103 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
104 if point[0] < start[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
105 return true |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
106 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
107 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
108 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
109 raySlope := (point[1] - start[1]) / (point[0] - start[0]) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
110 diagSlope := (end[1] - start[1]) / (end[0] - start[0]) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
111 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
112 return raySlope >= diagSlope |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
113 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
114 |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
115 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
|
116 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
117 r := bytes.NewReader(data) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
118 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
119 endian, err := r.ReadByte() |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
120 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
121 var order binary.ByteOrder |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
122 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
123 switch { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
124 case err != nil: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
125 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
126 case endian == wkb.NDR: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
127 order = binary.LittleEndian |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
128 case endian == wkb.XDR: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
129 order = binary.BigEndian |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
130 default: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
131 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
|
132 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
133 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
134 var geomType uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
135 err = binary.Read(r, order, &geomType) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
136 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
137 switch { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
138 case err != nil: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
139 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
140 case geomType != wkb.Polygon: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
141 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
|
142 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
143 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
144 var numRings uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
145 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
|
146 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
147 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
148 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
149 rngs := make([]ring, numRings) |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
150 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
151 for rng := uint32(0); rng < numRings; rng++ { |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
152 var numVertices uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
153 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
|
154 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
155 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
156 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
157 numVertices *= 2 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
158 vertices := make([]float64, numVertices) |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
159 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
160 for v := uint32(0); v < numVertices; v += 2 { |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
161 var lat, lon uint64 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
162 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
|
163 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
164 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
165 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
|
166 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
167 } |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
168 vertices[v] = math.Float64frombits(lat) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
169 vertices[v+1] = math.Float64frombits(lon) |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
170 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
171 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
172 rngs[rng] = vertices |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
173 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
174 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
175 p.rings = rngs |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
176 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
177 return nil |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
178 } |