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
+}