comparison pkg/wkb/data.go @ 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 95786a675d70
children b333d48ae555
comparison
equal deleted inserted replaced
4299:43f28ef473c7 4300:8b730ee6f17b
16 import ( 16 import (
17 "bytes" 17 "bytes"
18 "encoding/binary" 18 "encoding/binary"
19 "fmt" 19 "fmt"
20 "log" 20 "log"
21 "math"
21 ) 22 )
22 23
23 type ( 24 type (
24 PointGeom struct { 25 PointGeom struct {
25 X float64 26 X float64
31 ) 32 )
32 33
33 func (mpg *MultiPolygonGeom) FromWKB(data []byte) error { 34 func (mpg *MultiPolygonGeom) FromWKB(data []byte) error {
34 r := bytes.NewReader(data) 35 r := bytes.NewReader(data)
35 36
36 endian, err := r.ReadByte()
37
38 var order binary.ByteOrder 37 var order binary.ByteOrder
39 38
40 switch { 39 switch endian, err := r.ReadByte(); {
41 case err != nil: 40 case err != nil:
42 return err 41 return err
43 case endian == NDR: 42 case endian == NDR:
44 order = binary.LittleEndian 43 order = binary.LittleEndian
45 case endian == XDR: 44 case endian == XDR:
47 default: 46 default:
48 return fmt.Errorf("unknown byte order %x", endian) 47 return fmt.Errorf("unknown byte order %x", endian)
49 } 48 }
50 49
51 var geomType uint32 50 var geomType uint32
52 err = binary.Read(r, order, &geomType)
53 51
54 switch { 52 switch err := binary.Read(r, order, &geomType); {
55 case err != nil: 53 case err != nil:
56 return err 54 return err
57 case geomType != MultiPolygon: 55 case geomType != MultiPolygon:
58 return fmt.Errorf("unknown geometry type %x", geomType) 56 return fmt.Errorf("unknown geometry type %x", geomType)
59 } 57 }
66 64
67 polygons := make([]PolygonGeom, numPolygons) 65 polygons := make([]PolygonGeom, numPolygons)
68 66
69 // TODO: Parse the polygons. 67 // TODO: Parse the polygons.
70 68
69 var x, y uint64
70
71 for i := range polygons {
72 switch endian, err := r.ReadByte(); {
73 case err != nil:
74 return err
75 case endian == NDR:
76 order = binary.LittleEndian
77 case endian == XDR:
78 order = binary.BigEndian
79 default:
80 return fmt.Errorf("unknown byte order %x", endian)
81 }
82
83 switch err := binary.Read(r, order, &geomType); {
84 case err != nil:
85 return err
86 case geomType != Polygon:
87 return fmt.Errorf("unknown geometry type %x", geomType)
88 }
89
90 var numRings uint32
91 if err := binary.Read(r, order, &numRings); err != nil {
92 return err
93 }
94 log.Printf("info: num rings: %d\n", numRings)
95
96 rings := make([]LinearRingGeom, numRings)
97
98 for j := range rings {
99 var numPoints uint32
100 if err := binary.Read(r, order, &numPoints); err != nil {
101 return err
102 }
103 log.Printf("info: num points: %d\n", numPoints)
104 points := make([]PointGeom, numPoints)
105
106 for k := range points {
107 if err := binary.Read(r, order, &x); err != nil {
108 return err
109 }
110 if err := binary.Read(r, order, &y); err != nil {
111 return err
112 }
113 points[k] = PointGeom{
114 X: math.Float64frombits(x),
115 Y: math.Float64frombits(y),
116 }
117 }
118 rings[j] = points
119 }
120 polygons[i] = rings
121 }
122
71 *mpg = polygons 123 *mpg = polygons
72 return nil 124 return nil
73 } 125 }