Mercurial > gemma
changeset 4650:f5fce22184da stree-experiment
Added a deserializer from STRTrees.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 14 Oct 2019 01:28:18 +0200 |
parents | 8f745c353784 |
children | f5492fda097c |
files | pkg/octree/loader.go pkg/octree/strtree.go |
diffstat | 2 files changed, 114 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/octree/loader.go Sun Oct 13 22:15:55 2019 +0200 +++ b/pkg/octree/loader.go Mon Oct 14 01:28:18 2019 +0200 @@ -20,55 +20,130 @@ "log" "github.com/golang/snappy" + "github.com/pierrec/lz4" ) -func loadReader(r *bufio.Reader) (*Tree, error) { - tree := new(Tree) +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 + } - if err := binary.Read(r, binary.LittleEndian, &tree.EPSG); err != nil { - return nil, err + 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) + } } - log.Printf("info: EPSG: %d\n", tree.EPSG) - - if err := tree.Min.Read(r); err != nil { - return nil, err + for i := range bboxes { + read(&bboxes[i].X1) + read(&bboxes[i].Y1) + read(&bboxes[i].X2) + read(&bboxes[i].Y2) } - if err := tree.Max.Read(r); err != nil { - return nil, err + 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", - tree.Min.X, tree.Min.Y, tree.Min.Z, - tree.Max.X, tree.Max.Y, tree.Max.Z) + 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 nil, err + return err } log.Printf("info: vertices: %d\n", numVertices) vertices := make([]Vertex, numVertices) - tree.vertices = vertices + t.Vertices = vertices for i := range vertices { if err := vertices[i].Read(r); err != nil { - return nil, err + return err } } var numTriangles uint32 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { - return nil, err + return err } log.Printf("info: triangles: %d\n", numTriangles) indices := make([]int32, 3*numTriangles) triangles := make([][]int32, numTriangles) - tree.triangles = triangles + t.Triangles = triangles var last int32 @@ -79,7 +154,7 @@ for j := range tri { v, err := binary.ReadVarint(r) if err != nil { - return nil, err + return err } value := int32(v) + last tri[j] = value @@ -87,6 +162,24 @@ } } + 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 @@ -97,7 +190,7 @@ tree.index = make([]int32, numNodes) entries := tree.index[1:] - last = 0 + var last int32 for i := range entries { v, err := binary.ReadVarint(r) if err != nil {
--- a/pkg/octree/strtree.go Sun Oct 13 22:15:55 2019 +0200 +++ b/pkg/octree/strtree.go Mon Oct 14 01:28:18 2019 +0200 @@ -165,16 +165,12 @@ return err } - if err := binary.Write(w, binary.LittleEndian, s.index[0]); err != nil { - return err - } - var buf [binary.MaxVarintLen32]byte var last int32 var written int - for _, x := range s.index[1:] { + for _, x := range s.index { delta := x - last n := binary.PutVarint(buf[:], int64(delta)) for p := buf[:n]; len(p) > 0; p = p[n:] { @@ -184,9 +180,9 @@ } written += n } - last = x } + log.Printf("info: compressed index in bytes: %d %.2f (%d %.2f)\n", written, float64(written)/(1024*1024),