changeset 4307:e5a831ecd557

Started to write multi polygon into shape file. [WIP]
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 02 Sep 2019 18:38:27 +0200
parents 2336f75637d1
children 2c83d32bdd1b 9fef9930aa8a
files pkg/controllers/shapestretches.go
diffstat 1 files changed, 58 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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 {