Mercurial > gemma
diff pkg/octree/vertex.go @ 2529:45d51a49f191
SR import: Use own triangulation and clipping when importing sounding results.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 06 Mar 2019 17:51:58 +0100 |
parents | 2768f74d54ab |
children | 7686c7c23506 |
line wrap: on
line diff
--- a/pkg/octree/vertex.go Wed Mar 06 16:26:45 2019 +0100 +++ b/pkg/octree/vertex.go Wed Mar 06 17:51:58 2019 +0100 @@ -16,6 +16,7 @@ import ( "bytes" "encoding/binary" + "fmt" "io" "log" "math" @@ -1059,3 +1060,84 @@ return buf.Bytes() } + +func (mpz *MultiPointZ) FromWKB(data []byte) error { + + r := bytes.NewReader(data) + + endian, err := r.ReadByte() + + var order binary.ByteOrder + + switch { + case err != nil: + return err + case endian == wkb.NDR: + order = binary.LittleEndian + case endian == wkb.XDR: + order = binary.BigEndian + default: + return fmt.Errorf("unknown byte order %x", endian) + } + + var geomType uint32 + err = binary.Read(r, order, &geomType) + + switch { + case err != nil: + return err + case geomType != wkb.MultiPointZ: + return fmt.Errorf("unknown geometry type %x", geomType) + } + + var numPoints uint32 + if err := binary.Read(r, order, &numPoints); err != nil { + return err + } + + points := make(MultiPointZ, numPoints) + + for i := range points { + endian, err = r.ReadByte() + + switch { + case err != nil: + return err + case endian == wkb.NDR: + order = binary.LittleEndian + case endian == wkb.XDR: + order = binary.BigEndian + default: + return fmt.Errorf("unknown byte order %x", endian) + } + + err = binary.Read(r, order, &geomType) + + switch { + case err != nil: + return err + case geomType != wkb.PointZ: + return fmt.Errorf("unknown geometry type %x", geomType) + } + + var x, y, z uint64 + if err = binary.Read(r, order, &x); err != nil { + return err + } + if err = binary.Read(r, order, &y); err != nil { + return err + } + if err = binary.Read(r, order, &z); err != nil { + return err + } + points[i] = Vertex{ + X: math.Float64frombits(x), + Y: math.Float64frombits(y), + Z: math.Float64frombits(z), + } + } + + *mpz = points + + return nil +}