changeset 4300:8b730ee6f17b

Completed parsing multi polygons from WKB.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 02 Sep 2019 15:57:12 +0200
parents 43f28ef473c7
children b333d48ae555
files pkg/wkb/data.go
diffstat 1 files changed, 57 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/wkb/data.go	Mon Sep 02 13:17:38 2019 +0200
+++ b/pkg/wkb/data.go	Mon Sep 02 15:57:12 2019 +0200
@@ -18,6 +18,7 @@
 	"encoding/binary"
 	"fmt"
 	"log"
+	"math"
 )
 
 type (
@@ -33,11 +34,9 @@
 func (mpg *MultiPolygonGeom) FromWKB(data []byte) error {
 	r := bytes.NewReader(data)
 
-	endian, err := r.ReadByte()
-
 	var order binary.ByteOrder
 
-	switch {
+	switch endian, err := r.ReadByte(); {
 	case err != nil:
 		return err
 	case endian == NDR:
@@ -49,9 +48,8 @@
 	}
 
 	var geomType uint32
-	err = binary.Read(r, order, &geomType)
 
-	switch {
+	switch err := binary.Read(r, order, &geomType); {
 	case err != nil:
 		return err
 	case geomType != MultiPolygon:
@@ -68,6 +66,60 @@
 
 	// TODO: Parse the polygons.
 
+	var x, y uint64
+
+	for i := range polygons {
+		switch endian, err := r.ReadByte(); {
+		case err != nil:
+			return err
+		case endian == NDR:
+			order = binary.LittleEndian
+		case endian == XDR:
+			order = binary.BigEndian
+		default:
+			return fmt.Errorf("unknown byte order %x", endian)
+		}
+
+		switch err := binary.Read(r, order, &geomType); {
+		case err != nil:
+			return err
+		case geomType != Polygon:
+			return fmt.Errorf("unknown geometry type %x", geomType)
+		}
+
+		var numRings uint32
+		if err := binary.Read(r, order, &numRings); err != nil {
+			return err
+		}
+		log.Printf("info: num rings: %d\n", numRings)
+
+		rings := make([]LinearRingGeom, numRings)
+
+		for j := range rings {
+			var numPoints uint32
+			if err := binary.Read(r, order, &numPoints); err != nil {
+				return err
+			}
+			log.Printf("info: num points: %d\n", numPoints)
+			points := make([]PointGeom, numPoints)
+
+			for k := range points {
+				if err := binary.Read(r, order, &x); err != nil {
+					return err
+				}
+				if err := binary.Read(r, order, &y); err != nil {
+					return err
+				}
+				points[k] = PointGeom{
+					X: math.Float64frombits(x),
+					Y: math.Float64frombits(y),
+				}
+			}
+			rings[j] = points
+		}
+		polygons[i] = rings
+	}
+
 	*mpg = polygons
 	return nil
 }