-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtransformer.go
More file actions
52 lines (41 loc) · 968 Bytes
/
transformer.go
File metadata and controls
52 lines (41 loc) · 968 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main
import (
"github.com/twpayne/go-proj/v10"
)
type GeoTransformer struct {
pj *proj.PJ
}
func NewGeoTransformer(from, to string) (*GeoTransformer, error) {
pj, err := proj.NewCRSToCRS(from, to, nil)
if err != nil {
return nil, err
}
return &GeoTransformer{
pj: pj,
}, nil
}
func (g *GeoTransformer) Transform(x, y float64) (lat, lng float64, err error) {
coord, err := g.pj.Forward(proj.NewCoord(x, y, 0, 0))
if err != nil {
return 0, 0, err
}
return coord.X(), coord.Y(), nil
}
type GeoPoint struct {
X float64
Y float64
}
func (g *GeoTransformer) TransformBatch(points []GeoPoint) ([]GeoPoint, error) {
coords := Map(points, func(p GeoPoint) proj.Coord {
return proj.NewCoord(p.X, p.Y, 0, 0)
})
if err := g.pj.ForwardArray(coords); err != nil {
return nil, err
}
return Map(coords, func(c proj.Coord) GeoPoint {
return GeoPoint{X: c.X(), Y: c.Y()}
}), nil
}
func (g *GeoTransformer) Destroy() {
g.pj.Destroy()
}