# HG changeset patch # User Sascha L. Teichmann # Date 1567432632 -7200 # Node ID 8b730ee6f17bf6e443827e7dfbcb66b1aa872de5 # Parent 43f28ef473c795f0f7feea8d31f859e4ed8e8a54 Completed parsing multi polygons from WKB. diff -r 43f28ef473c7 -r 8b730ee6f17b pkg/wkb/data.go --- 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 }