diff --git a/proj/proj.go b/proj/proj.go new file mode 100644 index 0000000..96c9f80 --- /dev/null +++ b/proj/proj.go @@ -0,0 +1,19 @@ +package proj + +import ( + "math" +) + +const pole = 6378137 * math.Pi // 20037508.342789244 + +func wgsToMerc(long, lat float64) (x, y float64) { + x = long * pole / 180.0 + y = math.Log(math.Tan((90.0+lat)*math.Pi/360.0)) / math.Pi * pole + return x, y +} + +func mercToWgs(x, y float64) (long, lat float64) { + long = 180.0 * x / pole + lat = 180.0 / math.Pi * (2*math.Atan(math.Exp((y/pole)*math.Pi)) - math.Pi/2) + return long, lat +} diff --git a/proj/proj_test.go b/proj/proj_test.go new file mode 100644 index 0000000..b56613e --- /dev/null +++ b/proj/proj_test.go @@ -0,0 +1,29 @@ +package proj + +import ( + "math" + "testing" +) + +func TestWgsToMerc(t *testing.T) { + x, y := wgsToMerc(0, 0) + if x != 0 || y != 0 { + t.Fatalf("%v %v", x, y) + } + + x, y = wgsToMerc(8, 53) + if math.Abs(x-890555.9263461898) > 1e-6 || math.Abs(y-6982997.920389788) > 1e-6 { + t.Fatalf("%v %v", x, y) + } +} + +func TestMercToWgs(t *testing.T) { + long, lat := mercToWgs(0, 0) + if long != 0 || lat != 0 { + t.Fatalf("%v %v", long, lat) + } + long, lat = mercToWgs(890555.9263461898, 6982997.920389788) + if math.Abs(long-8) > 1e-6 || math.Abs(lat-53) > 1e-6 { + t.Fatalf("%v %v", long, lat) + } +}