diff pkg/controllers/octreecross.go @ 762:01ba06da8f46

Factored repojection of coordinates to own logic as we need it to reproject the results of the cross sections back to WGS84.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 25 Sep 2018 10:35:17 +0200
parents 033975d49c90
children d05bc3e34338
line wrap: on
line diff
--- a/pkg/controllers/octreecross.go	Tue Sep 25 10:09:33 2018 +0200
+++ b/pkg/controllers/octreecross.go	Tue Sep 25 10:35:17 2018 +0200
@@ -11,32 +11,18 @@
 	"gemma.intevation.de/gemma/pkg/octree"
 )
 
-const (
-	reprojectSQL = `
-SELECT ST_X(p), ST_Y(p)
-FROM ST_Transform(ST_SetSRID(ST_MakePoint($1, $2), $3::integer), $4::integer) AS p`
-)
-
 func reproject(
-	conn *sql.Conn,
+	rp *models.Reprojector,
+	src models.GeoJSONLineCoordinates,
 	ctx context.Context,
-	src models.GeoJSONLineCoordinates,
-	fromEPSG, toEPSG uint32,
 ) (models.GeoJSONLineCoordinates, error) {
 
-	stmt, err := conn.PrepareContext(ctx, reprojectSQL)
-	if err != nil {
-		return nil, err
-	}
-	defer stmt.Close()
-
 	dst := make(models.GeoJSONLineCoordinates, len(src))
 	for i, s := range src {
-		if err := stmt.QueryRowContext(
-			ctx,
-			s.Lat, s.Lon,
-			fromEPSG, toEPSG,
-		).Scan(&dst[i].Lat, &dst[i].Lon); err != nil {
+		var err error
+		if dst[i].Lat, dst[i].Lon, err = rp.Reproject(
+			s.Lat, s.Lon, ctx,
+		); err != nil {
 			return nil, err
 		}
 	}
@@ -68,10 +54,16 @@
 
 	start = time.Now()
 
-	coords, err := reproject(
+	var rp *models.Reprojector
+	if rp, err = models.NewReprojector(
 		conn, req.Context(),
-		csi.Geometry.Coordinates,
-		4326, tree.EPSG)
+		4326, tree.EPSG,
+	); err != nil {
+		return
+	}
+	defer rp.Close()
+
+	coords, err := reproject(rp, csi.Geometry.Coordinates, req.Context())
 
 	log.Printf("transforming input coords took: %s\n", time.Since(start))
 	if err != nil {