diff pkg/models/reproject.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
children a244b18cb916
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/models/reproject.go	Tue Sep 25 10:35:17 2018 +0200
@@ -0,0 +1,48 @@
+package models
+
+import (
+	"context"
+	"database/sql"
+)
+
+const reprojectSQL = `
+SELECT ST_X(p), ST_Y(p)
+FROM ST_Transform(ST_SetSRID(ST_MakePoint($1, $2), $3::integer), $4::integer) AS p`
+
+type Reprojector struct {
+	stmt     *sql.Stmt
+	FromEPSG uint32
+	ToEPSG   uint32
+}
+
+func NewReprojector(
+	conn *sql.Conn,
+	ctx context.Context,
+	fromEPSG, toEPSG uint32,
+) (*Reprojector, error) {
+	stmt, err := conn.PrepareContext(ctx, reprojectSQL)
+	if err != nil {
+		return nil, err
+	}
+	return &Reprojector{
+		stmt:     stmt,
+		FromEPSG: fromEPSG,
+		ToEPSG:   toEPSG,
+	}, nil
+}
+
+func (r *Reprojector) Close() error {
+	if s := r.stmt; s != nil {
+		r.stmt = nil
+		return s.Close()
+	}
+	return nil
+}
+
+func (r *Reprojector) Reproject(
+	x, y float64,
+	ctx context.Context,
+) (v, w float64, err error) {
+	err = r.stmt.QueryRowContext(ctx, x, y, r.FromEPSG, r.ToEPSG).Scan(&v, &w)
+	return
+}