Mercurial > gemma
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 } |