Mercurial > gemma
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 +}