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 }