changeset 2472:db0e4ab57977 octree-diff

Turn new point cloud into WKB form of MultiPointZ.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 26 Feb 2019 12:22:04 +0100
parents 63475c8e710e
children 19beb7d17337
files cmd/octreediff/main.go pkg/octree/vertex.go
diffstat 2 files changed, 46 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/octreediff/main.go	Tue Feb 26 11:34:15 2019 +0100
+++ b/cmd/octreediff/main.go	Tue Feb 26 12:22:04 2019 +0100
@@ -14,18 +14,22 @@
 package main
 
 import (
+	"bytes"
 	"context"
 	"database/sql"
+	"encoding/binary"
 	"errors"
 	"flag"
 	"fmt"
 	"log"
+	"math"
 	"runtime"
 	"sync"
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/octree"
+	"gemma.intevation.de/gemma/pkg/wkb"
 )
 
 var (
@@ -54,9 +58,35 @@
 	y float64
 }
 
+type pointMap map[point]float64
+
+func (pm pointMap) asWKB() []byte {
+	size := 1 + 4 + 4 + len(pm)*(1+4+3*8)
+
+	buf := bytes.NewBuffer(make([]byte, 0, size))
+
+	binary.Write(buf, binary.LittleEndian, wkb.NDR)
+	binary.Write(buf, binary.LittleEndian, wkb.MultiPointZ)
+	binary.Write(buf, binary.LittleEndian, uint32(len(pm)))
+
+	perPoint := bytes.NewBuffer(make([]byte, 0, 1+4))
+	binary.Write(perPoint, binary.LittleEndian, wkb.NDR)
+	binary.Write(perPoint, binary.LittleEndian, wkb.PointZ)
+	hdr := perPoint.Bytes()
+
+	for p, z := range pm {
+		buf.Write(hdr)
+		binary.Write(buf, binary.LittleEndian, math.Float64bits(p.x))
+		binary.Write(buf, binary.LittleEndian, math.Float64bits(p.y))
+		binary.Write(buf, binary.LittleEndian, math.Float64bits(z))
+	}
+
+	return buf.Bytes()
+}
+
 func sliceWork(
 	vs []octree.Vertex,
-	dst map[point]float64,
+	dst pointMap,
 	fn func([]octree.Vertex, func([]octree.Vertex) []octree.Vertex),
 ) {
 	n := runtime.NumCPU()
@@ -213,7 +243,7 @@
 
 		firstVs, secondVs := first.Vertices(), second.Vertices()
 
-		result := make(map[point]float64, len(firstVs)+len(secondVs))
+		result := make(pointMap, len(firstVs)+len(secondVs))
 
 		sliceWork(
 			firstVs,
@@ -264,6 +294,14 @@
 		last = now
 		log.Printf("num points: %d\n", len(result))
 
+		data := result.asWKB()
+
+		now = time.Now()
+		log.Printf("turing into WKB took %v\n", now.Sub(last))
+		last = now
+
+		log.Printf("WKB size %.3fMB\n", float64(len(data))/(1024*1024))
+
 		return nil
 	})
 }
--- a/pkg/octree/vertex.go	Tue Feb 26 11:34:15 2019 +0100
+++ b/pkg/octree/vertex.go	Tue Feb 26 12:22:04 2019 +0100
@@ -924,9 +924,13 @@
 	binary.Write(buf, binary.LittleEndian, wkb.MultiPointZ)
 	binary.Write(buf, binary.LittleEndian, uint32(len(mpz)))
 
+	perPoint := bytes.NewBuffer(make([]byte, 0, 1+4))
+	binary.Write(perPoint, binary.LittleEndian, wkb.NDR)
+	binary.Write(perPoint, binary.LittleEndian, wkb.PointZ)
+	hdr := perPoint.Bytes()
+
 	for _, p := range mpz {
-		binary.Write(buf, binary.LittleEndian, wkb.NDR)
-		binary.Write(buf, binary.LittleEndian, wkb.PointZ)
+		buf.Write(hdr)
 		binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X))
 		binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y))
 		binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Z))