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