Mercurial > gemma
changeset 607:21f1f03a8a39
Sounding results: Added simple WKB encoder for points3d.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 10 Sep 2018 15:55:35 +0200 |
parents | e6d95e6d232b |
children | bc2b7da07d60 |
files | cmd/soundingresults/main.go cmd/soundingresults/points.go |
diffstat | 2 files changed, 33 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/cmd/soundingresults/main.go Mon Sep 10 15:10:31 2018 +0200 +++ b/cmd/soundingresults/main.go Mon Sep 10 15:55:35 2018 +0200 @@ -160,6 +160,9 @@ continue } fmt.Printf("Number of points: %d\n", len(points)) + + wkb := points.asWKB() + fmt.Printf("WKB size %.2f MB\n", float64(len(wkb))/(1024*1024)) } }
--- a/cmd/soundingresults/points.go Mon Sep 10 15:10:31 2018 +0200 +++ b/cmd/soundingresults/points.go Mon Sep 10 15:55:35 2018 +0200 @@ -2,10 +2,13 @@ import ( "bufio" + "bytes" "compress/bzip2" "compress/gzip" + "encoding/binary" "io" "log" + "math" "os" "path/filepath" "strconv" @@ -97,3 +100,30 @@ return points, s.Err() } + +const ( + wkbNDR byte = 1 + wkbPointZ uint32 = 4 + wkbMultiPointZ uint32 = wkbPointZ + 1000 +) + +func (ps points3d) asWKB() string { + + size := 1 + 4 + 4 + len(ps)*(1+4+3*8) + + buf := bytes.NewBuffer(make([]byte, 0, size)) + + binary.Write(buf, binary.LittleEndian, wkbNDR) + binary.Write(buf, binary.LittleEndian, wkbMultiPointZ) + binary.Write(buf, binary.LittleEndian, uint32(len(ps))) + + for _, p := range ps { + binary.Write(buf, binary.LittleEndian, wkbNDR) + binary.Write(buf, binary.LittleEndian, wkbPointZ) + 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)) + } + + return buf.String() +}