diff pkg/octree/loader.go @ 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 86c7a023400e
children a2f16987911b
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 {