# HG changeset patch # User Sascha L. Teichmann # Date 1567442307 -7200 # Node ID e5a831ecd557c5502adc8191081f742fb2257c99 # Parent 2336f75637d13814f6761909cc187268314d3aaf Started to write multi polygon into shape file. [WIP] diff -r 2336f75637d1 -r e5a831ecd557 pkg/controllers/shapestretches.go --- a/pkg/controllers/shapestretches.go Mon Sep 02 18:26:12 2019 +0200 +++ b/pkg/controllers/shapestretches.go Mon Sep 02 18:38:27 2019 +0200 @@ -54,6 +54,61 @@ ORDER BY country_code` ) +func flattenPoints(mp wkb.MultiPolygonGeom) []shp.Point { + + var n int + for _, p := range mp { + for _, r := range p { + n += len(r) + } + } + + ps := make([]shp.Point, n) + var i int + for _, p := range mp { + for _, r := range p { + for _, v := range r { + ps[i].X = v.X + ps[i].Y = v.Y + i++ + } + } + } + + log.Printf("info: total number points: %d\n", n) + + return ps +} + +func asShpPolygon(mp wkb.MultiPolygonGeom) *shp.Polygon { + + points := flattenPoints(mp) + + p := &shp.Polygon{} + + var numParts int + for _, pl := range mp { + numParts += len(pl) + } + + log.Printf("info: number parts: %d\n", numParts) + + p.NumParts = int32(numParts) + p.NumPoints = int32(len(points)) + p.Parts = make([]int32, numParts) + + var marker int32 + + for i, pl := range mp { + p.Parts[i] = marker + marker += int32(len(pl)) + } + + p.Points = points + p.Box = shp.BBoxFromPoints(points) + return p +} + func stretchShapeDownload(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) name := vars["name"] @@ -162,6 +217,9 @@ defer writer.Close() // TODO: Write geometry + p := asShpPolygon(geom) + + writer.Write(p) return nil }(); err != nil {