diff pkg/octree/vertex.go @ 926:9e210b00ace9 geo-style

Merged default into geo-style branch.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 08 Oct 2018 10:54:50 +0200
parents 15bf101e1522
children 0a0013fbda4a
line wrap: on
line diff
--- a/pkg/octree/vertex.go	Wed Oct 03 13:08:23 2018 +0200
+++ b/pkg/octree/vertex.go	Mon Oct 08 10:54:50 2018 +0200
@@ -39,7 +39,9 @@
 
 const (
 	wkbNDR              byte   = 1
+	wkbLineString       uint32 = 2
 	wkbLineStringZ      uint32 = 1000 + 2
+	wkbMultiLineString  uint32 = 5
 	wkbMultiLineStringZ uint32 = 1000 + 5
 )
 
@@ -294,20 +296,53 @@
 
 func (mls MultiLineStringZ) AsWKB() []byte {
 
-	var buf bytes.Buffer
+	// pre-calculate size to avoid reallocations.
+	size := 1 + 4 + 4
+	for _, ml := range mls {
+		size += 1 + 4 + 4 + len(ml)*3*8
+	}
 
-	binary.Write(&buf, binary.LittleEndian, wkbNDR)
-	binary.Write(&buf, binary.LittleEndian, wkbMultiLineStringZ)
-	binary.Write(&buf, binary.LittleEndian, uint32(len(mls)))
+	buf := bytes.NewBuffer(make([]byte, 0, size))
+
+	binary.Write(buf, binary.LittleEndian, wkbNDR)
+	binary.Write(buf, binary.LittleEndian, wkbMultiLineStringZ)
+	binary.Write(buf, binary.LittleEndian, uint32(len(mls)))
 
 	for _, ml := range mls {
-		binary.Write(&buf, binary.LittleEndian, wkbNDR)
-		binary.Write(&buf, binary.LittleEndian, wkbLineStringZ)
-		binary.Write(&buf, binary.LittleEndian, uint32(len(ml)))
+		binary.Write(buf, binary.LittleEndian, wkbNDR)
+		binary.Write(buf, binary.LittleEndian, wkbLineStringZ)
+		binary.Write(buf, binary.LittleEndian, uint32(len(ml)))
 		for _, p := range ml {
-			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))
+			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.Bytes()
+}
+
+func (mls MultiLineStringZ) AsWKB2D() []byte {
+
+	// pre-calculate size to avoid reallocations.
+	size := 1 + 4 + 4
+	for _, ml := range mls {
+		size += 1 + 4 + 4 + len(ml)*2*8
+	}
+
+	buf := bytes.NewBuffer(make([]byte, 0, size))
+
+	binary.Write(buf, binary.LittleEndian, wkbNDR)
+	binary.Write(buf, binary.LittleEndian, wkbMultiLineString)
+	binary.Write(buf, binary.LittleEndian, uint32(len(mls)))
+
+	for _, ml := range mls {
+		binary.Write(buf, binary.LittleEndian, wkbNDR)
+		binary.Write(buf, binary.LittleEndian, wkbLineString)
+		binary.Write(buf, binary.LittleEndian, uint32(len(ml)))
+		for _, p := range ml {
+			binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X))
+			binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y))
 		}
 	}