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()
+}