Mercurial > gemma
view pkg/octree/loader.go @ 4652:f5492fda097c stree-experiment
Use gzip best speed instead of lz4.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 14 Oct 2019 12:25:32 +0200 |
parents | f5fce22184da |
children | a2f16987911b |
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) 2018 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> package octree import ( "bufio" "bytes" "encoding/binary" "log" "github.com/golang/snappy" "github.com/pierrec/lz4" ) func (s *STRTree) deserializeIndex(r *bufio.Reader) error { var numIndex int32 if err := binary.Read(r, binary.LittleEndian, &numIndex); err != nil { return err } index := make([]int32, numIndex) var last int32 for i := range index { v, err := binary.ReadVarint(r) if err != nil { return err } value := int32(v) + last index[i] = value last = value } return nil } func (s *STRTree) deserializeBBoxes(r *bufio.Reader) error { var numBBoxes int32 if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil { return err } bboxes := make([]Box2D, numBBoxes) s.bboxes = bboxes var err error read := func(v *float64) { if err == nil { err = binary.Read(r, binary.LittleEndian, v) } } for i := range bboxes { read(&bboxes[i].X1) read(&bboxes[i].Y1) read(&bboxes[i].X2) read(&bboxes[i].Y2) } return err } func (s *STRTree) deserialize(r *bufio.Reader) error { s.tin = new(Tin) if err := s.tin.Deserialize(r); err != nil { return err } var numEntries uint8 if err := binary.Read(r, binary.LittleEndian, &numEntries); err != nil { return err } s.Entries = int(numEntries) if err := s.deserializeIndex(r); err != nil { return err } return s.deserializeBBoxes(r) } func (s *STRTree) FromBytes(data []byte) error { return s.deserialize( bufio.NewReader( lz4.NewReader( bytes.NewReader(data)))) } func (t *Tin) Deserialize(r *bufio.Reader) error { if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil { return err } log.Printf("info: EPSG: %d\n", t.EPSG) if err := t.Min.Read(r); err != nil { return err } if err := t.Max.Read(r); err != nil { return err } log.Printf("info: BBOX: [[%f, %f, %f], [%f, %f, %f]]\n", t.Min.X, t.Min.Y, t.Min.Z, t.Max.X, t.Max.Y, t.Max.Z) var numVertices uint32 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil { return err } log.Printf("info: vertices: %d\n", numVertices) vertices := make([]Vertex, numVertices) t.Vertices = vertices for i := range vertices { if err := vertices[i].Read(r); err != nil { return err } } var numTriangles uint32 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { return err } log.Printf("info: triangles: %d\n", numTriangles) indices := make([]int32, 3*numTriangles) triangles := make([][]int32, numTriangles) t.Triangles = triangles var last int32 for i := range triangles { tri := indices[:3] indices = indices[3:] triangles[i] = tri for j := range tri { v, err := binary.ReadVarint(r) if err != nil { return err } value := int32(v) + last tri[j] = value last = value } } return nil } func loadReader(r *bufio.Reader) (*Tree, error) { tree := new(Tree) var tin Tin if err := tin.Deserialize(r); err != nil { return nil, err } tree.EPSG = tin.EPSG tree.vertices = tin.Vertices tree.triangles = tin.Triangles tree.Min = tin.Min tree.Max = tin.Max var numNodes uint32 if err := binary.Read(r, binary.LittleEndian, &numNodes); err != nil { return nil, err } log.Printf("info: num nodes: %d\n", numNodes) tree.index = make([]int32, numNodes) entries := tree.index[1:] var last int32 for i := range entries { v, err := binary.ReadVarint(r) if err != nil { return nil, err } value := int32(v) + last entries[i] = value last = value } return tree, nil } func Deserialize(data []byte) (*Tree, error) { return loadReader( bufio.NewReader( snappy.NewReader( bytes.NewReader(data)))) }