# HG changeset patch # User Sascha L. Teichmann # Date 1547380959 -3600 # Node ID 09349ca27dd7e0096d2511039fbeb8ba153fc666 # Parent 614c6c766691aff676daa5106627b42f71edcc7c Imports: Removed duplicated code path to store WKB polygons into database. diff -r 614c6c766691 -r 09349ca27dd7 pkg/imports/sr.go --- a/pkg/imports/sr.go Sat Jan 12 19:53:31 2019 +0100 +++ b/pkg/imports/sr.go Sun Jan 13 13:02:39 2019 +0100 @@ -428,7 +428,7 @@ return loadXYZReader(r, feedback) } -func loadBoundary(z *zip.ReadCloser) (polygon, error) { +func loadBoundary(z *zip.ReadCloser) (polygonSlice, error) { shpF := common.FindInZIP(z, ".shp") if shpF == nil { return nil, nil diff -r 614c6c766691 -r 09349ca27dd7 pkg/imports/wa.go --- a/pkg/imports/wa.go Sat Jan 12 19:53:31 2019 +0100 +++ b/pkg/imports/wa.go Sun Jan 13 13:02:39 2019 +0100 @@ -206,7 +206,7 @@ switch feature.Geometry.Type { case "Polygon": - var p polygon + var p polygonSlice if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil { return err } diff -r 614c6c766691 -r 09349ca27dd7 pkg/imports/wkb.go --- a/pkg/imports/wkb.go Sat Jan 12 19:53:31 2019 +0100 +++ b/pkg/imports/wkb.go Sun Jan 13 13:02:39 2019 +0100 @@ -25,13 +25,6 @@ type ( lineSlice [][]float64 polygonSlice [][][]float64 - - point struct { - X float64 - Y float64 - } - lineString []point - polygon []lineString ) const ( @@ -100,7 +93,7 @@ return buf.Bytes() } -func shapeToPolygon(s shp.Shape) (polygon, error) { +func shapeToPolygon(s shp.Shape) (polygonSlice, error) { switch p := s.(type) { case *shp.Polygon: return toPolygon(p.NumParts, p.Parts, p.Points), nil @@ -112,8 +105,8 @@ return nil, fmt.Errorf("Unsupported shape type %T", s) } -func toPolygon(numParts int32, parts []int32, points []shp.Point) polygon { - out := make(polygon, numParts) +func toPolygon(numParts int32, parts []int32, points []shp.Point) polygonSlice { + out := make(polygonSlice, numParts) var pos int32 for i := range out { @@ -124,39 +117,15 @@ howMany = parts[i+1] - parts[i] } - line := make(lineString, howMany) + line := make([][]float64, howMany) + vertices := make([]float64, 2*howMany) for j := int32(0); j < howMany; j, pos = j+1, pos+1 { p := &points[pos] - line[j] = point{p.X, p.Y} + vertex := vertices[j*2 : j*2+2] + vertex[0], vertex[1] = p.X, p.Y + line[j] = vertex } out[i] = line } return out } - -func (p polygon) asWKB() []byte { - if p == nil { - return nil - } - // pre-calculate size to avoid reallocations. - size := 1 + 4 + 4 - for _, ring := range p { - size += 4 + len(ring)*2*8 - } - - buf := bytes.NewBuffer(make([]byte, 0, size)) - - binary.Write(buf, binary.LittleEndian, wkbNDR) - binary.Write(buf, binary.LittleEndian, wkbPolygon) - binary.Write(buf, binary.LittleEndian, uint32(len(p))) - - for _, ring := range p { - binary.Write(buf, binary.LittleEndian, uint32(len(ring))) - for _, v := range ring { - binary.Write(buf, binary.LittleEndian, math.Float64bits(v.X)) - binary.Write(buf, binary.LittleEndian, math.Float64bits(v.Y)) - } - } - - return buf.Bytes() -}