Mercurial > gemma
comparison 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 |
comparison
equal
deleted
inserted
replaced
2488:cb55d7eaaa36 | 2489:4f292ff74d9e |
---|---|
11 // Author(s): | 11 // Author(s): |
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> | 12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
13 | 13 |
14 package octree | 14 package octree |
15 | 15 |
16 import ( | |
17 "bytes" | |
18 "encoding/binary" | |
19 "fmt" | |
20 "math" | |
21 | |
22 "gemma.intevation.de/gemma/pkg/wkb" | |
23 ) | |
24 | |
16 type Polygon struct { | 25 type Polygon struct { |
17 // TODO: Implement me! | 26 // TODO: Implement me! |
27 rings [][]float64 | |
18 } | 28 } |
19 | 29 |
20 type IntersectionType byte | 30 type IntersectionType byte |
21 | 31 |
22 const ( | 32 const ( |
32 | 42 |
33 func (p *Polygon) IntersectionWithTriangle(t *Triangle) IntersectionType { | 43 func (p *Polygon) IntersectionWithTriangle(t *Triangle) IntersectionType { |
34 // TODO: Implement me | 44 // TODO: Implement me |
35 return IntersectionOutSide | 45 return IntersectionOutSide |
36 } | 46 } |
47 | |
48 func (p *Polygon) FromWKB(data []byte) error { | |
49 | |
50 r := bytes.NewReader(data) | |
51 | |
52 endian, err := r.ReadByte() | |
53 | |
54 var order binary.ByteOrder | |
55 | |
56 switch { | |
57 case err != nil: | |
58 return err | |
59 case endian == wkb.NDR: | |
60 order = binary.LittleEndian | |
61 case endian == wkb.XDR: | |
62 order = binary.BigEndian | |
63 default: | |
64 return fmt.Errorf("unknown byte order %x", endian) | |
65 } | |
66 | |
67 var geomType uint32 | |
68 err = binary.Read(r, order, &geomType) | |
69 | |
70 switch { | |
71 case err != nil: | |
72 return err | |
73 case geomType != wkb.Polygon: | |
74 return fmt.Errorf("unknown geometry type %x", geomType) | |
75 } | |
76 | |
77 var numRings uint32 | |
78 if err = binary.Read(r, order, &numRings); err != nil { | |
79 return err | |
80 } | |
81 | |
82 rings := make([][]float64, numRings) | |
83 | |
84 for ring := uint32(0); ring < numRings; ring++ { | |
85 var numVertices uint32 | |
86 if err = binary.Read(r, order, &numVertices); err != nil { | |
87 return err | |
88 } | |
89 | |
90 vertices := make([]float64, 2*numVertices) | |
91 | |
92 for v := uint32(0); v < numVertices; v++ { | |
93 var lat, lon uint64 | |
94 if err = binary.Read(r, order, &lat); err != nil { | |
95 return err | |
96 } | |
97 if err = binary.Read(r, order, &lon); err != nil { | |
98 return err | |
99 } | |
100 vertices[v*2] = math.Float64frombits(lat) | |
101 vertices[v*2+1] = math.Float64frombits(lon) | |
102 } | |
103 | |
104 rings[ring] = vertices | |
105 } | |
106 | |
107 p.rings = rings | |
108 | |
109 return nil | |
110 } |