Mercurial > gemma
changeset 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 |
files | pkg/octree/polygon.go |
diffstat | 1 files changed, 74 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/octree/polygon.go Sun Mar 03 14:45:41 2019 +0100 +++ b/pkg/octree/polygon.go Sun Mar 03 18:08:40 2019 +0100 @@ -13,8 +13,18 @@ package octree +import ( + "bytes" + "encoding/binary" + "fmt" + "math" + + "gemma.intevation.de/gemma/pkg/wkb" +) + type Polygon struct { // TODO: Implement me! + rings [][]float64 } type IntersectionType byte @@ -34,3 +44,67 @@ // TODO: Implement me return IntersectionOutSide } + +func (p *Polygon) FromWKB(data []byte) error { + + r := bytes.NewReader(data) + + endian, err := r.ReadByte() + + var order binary.ByteOrder + + switch { + case err != nil: + return err + case endian == wkb.NDR: + order = binary.LittleEndian + case endian == wkb.XDR: + order = binary.BigEndian + default: + return fmt.Errorf("unknown byte order %x", endian) + } + + var geomType uint32 + err = binary.Read(r, order, &geomType) + + switch { + case err != nil: + return err + case geomType != wkb.Polygon: + return fmt.Errorf("unknown geometry type %x", geomType) + } + + var numRings uint32 + if err = binary.Read(r, order, &numRings); err != nil { + return err + } + + rings := make([][]float64, numRings) + + for ring := uint32(0); ring < numRings; ring++ { + var numVertices uint32 + if err = binary.Read(r, order, &numVertices); err != nil { + return err + } + + vertices := make([]float64, 2*numVertices) + + for v := uint32(0); v < numVertices; v++ { + var lat, lon uint64 + if err = binary.Read(r, order, &lat); err != nil { + return err + } + if err = binary.Read(r, order, &lon); err != nil { + return err + } + vertices[v*2] = math.Float64frombits(lat) + vertices[v*2+1] = math.Float64frombits(lon) + } + + rings[ring] = vertices + } + + p.rings = rings + + return nil +}