Mercurial > gemma
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))