comparison pkg/wkb/data.go @ 4296:95786a675d70

WIP: Started with downloading stretches as ESRI shapes. GET /api/data/stretch/shape/{stretch}
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 30 Aug 2019 18:34:27 +0200
parents
children 8b730ee6f17b
comparison
equal deleted inserted replaced
4295:0bb735a412af 4296:95786a675d70
1 // This is Free Software under GNU Affero General Public License v >= 3.0
2 // without warranty, see README.md and license for details.
3 //
4 // SPDX-License-Identifier: AGPL-3.0-or-later
5 // License-Filename: LICENSES/AGPL-3.0.txt
6 //
7 // Copyright (C) 2019 by via donau
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
9 // Software engineering by Intevation GmbH
10 //
11 // Author(s):
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
13
14 package wkb
15
16 import (
17 "bytes"
18 "encoding/binary"
19 "fmt"
20 "log"
21 )
22
23 type (
24 PointGeom struct {
25 X float64
26 Y float64
27 }
28 LinearRingGeom []PointGeom
29 PolygonGeom []LinearRingGeom
30 MultiPolygonGeom []PolygonGeom
31 )
32
33 func (mpg *MultiPolygonGeom) FromWKB(data []byte) error {
34 r := bytes.NewReader(data)
35
36 endian, err := r.ReadByte()
37
38 var order binary.ByteOrder
39
40 switch {
41 case err != nil:
42 return err
43 case endian == NDR:
44 order = binary.LittleEndian
45 case endian == XDR:
46 order = binary.BigEndian
47 default:
48 return fmt.Errorf("unknown byte order %x", endian)
49 }
50
51 var geomType uint32
52 err = binary.Read(r, order, &geomType)
53
54 switch {
55 case err != nil:
56 return err
57 case geomType != MultiPolygon:
58 return fmt.Errorf("unknown geometry type %x", geomType)
59 }
60
61 var numPolygons int32
62 if err := binary.Read(r, order, &numPolygons); err != nil {
63 return err
64 }
65 log.Printf("info: num polygons: %d\n", numPolygons)
66
67 polygons := make([]PolygonGeom, numPolygons)
68
69 // TODO: Parse the polygons.
70
71 *mpg = polygons
72 return nil
73 }