view 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 source

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