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