# HG changeset patch # User Sascha L. Teichmann # Date 1551180124 -3600 # Node ID db0e4ab57977d30e977d2431cdb0c0c133821d24 # Parent 63475c8e710e6f16e87700331e7d1a6b422a6c5c Turn new point cloud into WKB form of MultiPointZ. diff -r 63475c8e710e -r db0e4ab57977 cmd/octreediff/main.go --- 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 }) } diff -r 63475c8e710e -r db0e4ab57977 pkg/octree/vertex.go --- 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))