@@ -3,34 +3,148 @@ package main
33import (
44 "flag"
55 "fmt"
6+ "io"
67 "os"
78 "strings"
89
10+ "github.com/go-spatial/proj"
11+
12+ "github.com/go-spatial/proj/core"
13+ "github.com/go-spatial/proj/merror"
14+ "github.com/go-spatial/proj/mlog"
915 "github.com/go-spatial/proj/support"
1016)
1117
1218func main () {
19+ err := Main (os .Stdin , os .Stdout , os .Args )
20+ if err != nil {
21+ fmt .Fprintf (os .Stderr , err .Error ()+ "\n " )
22+ os .Exit (1 )
23+ }
24+ }
25+
26+ // Main is just a callable version of main(), for testing purposes
27+ func Main (inS io.Reader , outS io.Writer , args []string ) error {
28+
29+ merror .ShowSource = false
30+ mlog .DebugEnabled = false
31+ mlog .InfoEnabled = false
32+ mlog .ErrorEnabled = false
33+
34+ cli := flag .NewFlagSet (args [0 ], flag .ContinueOnError )
35+ cli .SetOutput (outS )
1336
14- verbose := flag .Bool ("verbose" , false , "do lots of logging" )
15- inverse := flag .Bool ("inverse" , false , "go backwards" )
37+ verbose := cli .Bool ("verbose" , false , "enable logging" )
38+ inverse := cli .Bool ("inverse" , false , "run the inverse transform" )
39+ epsgDest := cli .Int ("epsg" , 0 , "perform conversion from 4326 to given destination system" )
1640
17- flag .Parse ()
41+ err := cli .Parse (args [1 :])
42+ if err != nil {
43+ return err
44+ }
45+ projString := strings .Join (cli .Args (), " " )
1846
19- fmt .Printf ("verbose: %t\n " , * verbose )
20- fmt .Printf ("inverse: %t\n " , * inverse )
47+ if * verbose {
48+ mlog .Printf ("verbose: %t" , * verbose )
49+ mlog .Printf ("inverse: %t" , * inverse )
50+ if * epsgDest == 0 {
51+ mlog .Printf ("epsg: (not specified)" )
52+ } else {
53+ mlog .Printf ("epsg: %d" , epsgDest )
54+ }
55+ if projString == "" {
56+ mlog .Printf ("proj: (not specified)" )
57+ } else {
58+ mlog .Printf ("proj: %s" , projString )
59+ }
60+
61+ merror .ShowSource = true
62+ mlog .DebugEnabled = true
63+ mlog .InfoEnabled = true
64+ mlog .ErrorEnabled = true
65+ }
2166
22- s := strings .Join (flag .Args (), " " )
67+ if * epsgDest != 0 {
68+ if * inverse {
69+ return fmt .Errorf ("-inverse not allowed with -epsg" )
70+ }
71+ if projString != "" {
72+ return fmt .Errorf ("projection string not allowed with -epsg" )
73+ }
74+ input := make ([]float64 , 2 )
2375
24- s = "+proj=utm +zone=32 +ellps=GRS80" // TODO
76+ f := func (a , b float64 ) (float64 , float64 , error ) {
77+ input [0 ] = a
78+ input [1 ] = b
79+ output , err := proj .Convert (proj .EPSGCode (* epsgDest ), input )
80+ if err != nil {
81+ return 0.0 , 0.0 , err
82+ }
83+ return output [0 ], output [1 ], nil
84+ }
2585
26- fmt .Printf ("string: %s\n " , s )
86+ return repl (inS , outS , f )
87+ }
88+
89+ ps , err := support .NewProjString (projString )
90+ if err != nil {
91+ return err
92+ }
2793
28- _ , err := support . NewProjString ( s )
94+ _ , opx , err := core . NewSystem ( ps )
2995 if err != nil {
30- panic (err )
96+ return err
97+ }
98+
99+ op := opx .(core.IConvertLPToXY )
100+
101+ if ! * inverse {
102+
103+ f := func (a , b float64 ) (float64 , float64 , error ) {
104+ input := & core.CoordLP {Lam : support .DDToR (a ), Phi : support .DDToR (b )}
105+ output , err := op .Forward (input )
106+ if err != nil {
107+ return 0.0 , 0.0 , err
108+ }
109+ return output .X , output .Y , nil
110+ }
111+ return repl (inS , outS , f )
112+ }
113+
114+ f := func (a , b float64 ) (float64 , float64 , error ) {
115+ input := & core.CoordXY {X : a , Y : b }
116+ output , err := op .Inverse (input )
117+ if err != nil {
118+ return 0.0 , 0.0 , err
119+ }
120+ return support .RToDD (output .Lam ), support .RToDD (output .Phi ), nil
31121 }
122+ return repl (inS , outS , f )
123+ }
124+
125+ type converter func (a , b float64 ) (float64 , float64 , error )
126+
127+ func repl (inS io.Reader , outS io.Writer , f converter ) error {
128+
129+ var a , b float64
32130
33- var a1 , a2 float64
34- fmt .Fscanf (os .Stdin , "%f %f\n " , & a1 , & a2 )
35- fmt .Printf ("-> %f %f\n " , a1 , a2 )
131+ for {
132+ n , err := fmt .Fscanf (inS , "%f %f\n " , & a , & b )
133+ if err == io .EOF {
134+ return nil
135+ }
136+ if err != nil {
137+ return err
138+ }
139+ if n != 2 {
140+ return fmt .Errorf ("error reading input" )
141+ }
142+
143+ c , d , err := f (a , b )
144+ if err != nil {
145+ return err
146+ }
147+
148+ fmt .Fprintf (outS , "%f %f\n " , c , d )
149+ }
36150}
0 commit comments