Mercurial > gemma
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/wkb/data.go Fri Aug 30 18:34:27 2019 +0200 @@ -0,0 +1,73 @@ +// This is Free Software under GNU Affero General Public License v >= 3.0 +// without warranty, see README.md and license for details. +// +// SPDX-License-Identifier: AGPL-3.0-or-later +// License-Filename: LICENSES/AGPL-3.0.txt +// +// Copyright (C) 2019 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann <sascha.teichmann@intevation.de> + +package wkb + +import ( + "bytes" + "encoding/binary" + "fmt" + "log" +) + +type ( + PointGeom struct { + X float64 + Y float64 + } + LinearRingGeom []PointGeom + PolygonGeom []LinearRingGeom + MultiPolygonGeom []PolygonGeom +) + +func (mpg *MultiPolygonGeom) FromWKB(data []byte) error { + r := bytes.NewReader(data) + + endian, err := r.ReadByte() + + var order binary.ByteOrder + + switch { + case err != nil: + return err + case endian == NDR: + order = binary.LittleEndian + case endian == XDR: + order = binary.BigEndian + default: + return fmt.Errorf("unknown byte order %x", endian) + } + + var geomType uint32 + err = binary.Read(r, order, &geomType) + + switch { + case err != nil: + return err + case geomType != MultiPolygon: + return fmt.Errorf("unknown geometry type %x", geomType) + } + + var numPolygons int32 + if err := binary.Read(r, order, &numPolygons); err != nil { + return err + } + log.Printf("info: num polygons: %d\n", numPolygons) + + polygons := make([]PolygonGeom, numPolygons) + + // TODO: Parse the polygons. + + *mpg = polygons + return nil +}