annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4296
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2019 by via donau
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package wkb
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 "bytes"
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "encoding/binary"
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "fmt"
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "log"
4300
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
21 "math"
4296
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 )
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 type (
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 PointGeom struct {
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 X float64
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 Y float64
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 }
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 LinearRingGeom []PointGeom
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 PolygonGeom []LinearRingGeom
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 MultiPolygonGeom []PolygonGeom
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 )
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 func (mpg *MultiPolygonGeom) FromWKB(data []byte) error {
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 r := bytes.NewReader(data)
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 var order binary.ByteOrder
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
4300
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
39 switch endian, err := r.ReadByte(); {
4296
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 case err != nil:
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 return err
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 case endian == NDR:
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 order = binary.LittleEndian
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 case endian == XDR:
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 order = binary.BigEndian
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 default:
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 return fmt.Errorf("unknown byte order %x", endian)
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 }
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 var geomType uint32
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51
4300
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
52 switch err := binary.Read(r, order, &geomType); {
4296
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 case err != nil:
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 return err
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 case geomType != MultiPolygon:
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 return fmt.Errorf("unknown geometry type %x", geomType)
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 }
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 var numPolygons int32
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 if err := binary.Read(r, order, &numPolygons); err != nil {
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 return err
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 }
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 log.Printf("info: num polygons: %d\n", numPolygons)
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 polygons := make([]PolygonGeom, numPolygons)
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 // TODO: Parse the polygons.
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
4300
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
69 var x, y uint64
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
70
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
71 for i := range polygons {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
72 switch endian, err := r.ReadByte(); {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
73 case err != nil:
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
74 return err
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
75 case endian == NDR:
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
76 order = binary.LittleEndian
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
77 case endian == XDR:
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
78 order = binary.BigEndian
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
79 default:
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
80 return fmt.Errorf("unknown byte order %x", endian)
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
81 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
82
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
83 switch err := binary.Read(r, order, &geomType); {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
84 case err != nil:
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
85 return err
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
86 case geomType != Polygon:
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
87 return fmt.Errorf("unknown geometry type %x", geomType)
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
88 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
89
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
90 var numRings uint32
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
91 if err := binary.Read(r, order, &numRings); err != nil {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
92 return err
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
93 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
94 log.Printf("info: num rings: %d\n", numRings)
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
95
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
96 rings := make([]LinearRingGeom, numRings)
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
97
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
98 for j := range rings {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
99 var numPoints uint32
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
100 if err := binary.Read(r, order, &numPoints); err != nil {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
101 return err
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
102 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
103 log.Printf("info: num points: %d\n", numPoints)
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
104 points := make([]PointGeom, numPoints)
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
105
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
106 for k := range points {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
107 if err := binary.Read(r, order, &x); err != nil {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
108 return err
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
109 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
110 if err := binary.Read(r, order, &y); err != nil {
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
111 return err
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
112 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
113 points[k] = PointGeom{
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
114 X: math.Float64frombits(x),
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
115 Y: math.Float64frombits(y),
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
116 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
117 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
118 rings[j] = points
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
119 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
120 polygons[i] = rings
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
121 }
8b730ee6f17b Completed parsing multi polygons from WKB.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4296
diff changeset
122
4296
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 *mpg = polygons
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 return nil
95786a675d70 WIP: Started with downloading stretches as ESRI shapes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 }