view pkg/models/reproject.go @ 955:920fba3f593f

chore: upgrading packages to latest
author Thomas Junk <thomas.junk@intevation.de>
date Tue, 16 Oct 2018 11:13:06 +0200
parents 01ba06da8f46
children a244b18cb916
line wrap: on
line source

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
}