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
+}