Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2498 - 1

2
namespace GMap.NET.Projections
3
{
4
   using System;
5
 
6
   class MercatorProjectionYandex : PureProjection
7
   {
8
      public static readonly MercatorProjectionYandex Instance = new MercatorProjectionYandex();
9
 
10
      static readonly double MinLatitude = -85.05112878;
11
      static readonly double MaxLatitude = 85.05112878;
12
      static readonly double MinLongitude = -177;
13
      static readonly double MaxLongitude = 177;
14
 
15
      static readonly double RAD_DEG = 180 / Math.PI;
16
      static readonly double DEG_RAD = Math.PI / 180;
17
      static readonly double MathPiDiv4 = Math.PI / 4;
18
 
19
      public override RectLatLng Bounds
20
      {
21
         get
22
         {
23
            return RectLatLng.FromLTRB(MinLongitude, MaxLatitude, MaxLongitude, MinLatitude);
24
         }
25
      }
26
 
27
      GSize tileSize = new GSize(256, 256);
28
      public override GSize TileSize
29
      {
30
         get
31
         {
32
            return tileSize;
33
         }
34
      }
35
 
36
      public override double Axis
37
      {
38
         get
39
         {
40
            return 6356752.3142;
41
         }
42
      }
43
 
44
      public override double Flattening
45
      {
46
         get
47
         {
48
            return (1.0 / 298.257223563);
49
         }
50
      }
51
 
52
      public override GPoint FromLatLngToPixel(double lat, double lng, int zoom)
53
      {
54
         lat = Clip(lat, MinLatitude, MaxLatitude);
55
         lng = Clip(lng, MinLongitude, MaxLongitude);
56
 
57
         double rLon = lng * DEG_RAD; // Math.PI / 180; 
58
         double rLat = lat * DEG_RAD; // Math.PI / 180; 
59
 
60
         double a = 6378137;
61
         double k = 0.0818191908426;
62
 
63
         double z = Math.Tan(MathPiDiv4 + rLat / 2) / Math.Pow((Math.Tan(MathPiDiv4 + Math.Asin(k * Math.Sin(rLat)) / 2)), k);
64
         double z1 = Math.Pow(2, 23 - zoom);
65
 
66
         double DX = ((20037508.342789 + a * rLon) * 53.5865938 / z1);
67
         double DY = ((20037508.342789 - a * Math.Log(z)) * 53.5865938 / z1);
68
 
69
         GPoint ret = GPoint.Empty;
70
         ret.X = (long)DX;
71
         ret.Y = (long)DY;
72
 
73
         return ret;
74
      }
75
 
76
      public override PointLatLng FromPixelToLatLng(long x, long y, int zoom)
77
      {
78
         GSize s = GetTileMatrixSizePixel(zoom);
79
 
80
         double mapSizeX = s.Width;
81
         double mapSizeY = s.Height;
82
 
83
         double a = 6378137;
84
         double c1 = 0.00335655146887969;
85
         double c2 = 0.00000657187271079536;
86
         double c3 = 0.00000001764564338702;
87
         double c4 = 0.00000000005328478445;
88
         double z1 = (23 - zoom);
89
         double mercX = (x * Math.Pow(2, z1)) / 53.5865938 - 20037508.342789;
90
         double mercY = 20037508.342789 - (y * Math.Pow(2, z1)) / 53.5865938;
91
 
92
         double g = Math.PI / 2 - 2 * Math.Atan(1 / Math.Exp(mercY / a));
93
         double z = g + c1 * Math.Sin(2 * g) + c2 * Math.Sin(4 * g) + c3 * Math.Sin(6 * g) + c4 * Math.Sin(8 * g);
94
 
95
         PointLatLng ret = PointLatLng.Empty;
96
         ret.Lat = z * RAD_DEG;
97
         ret.Lng = mercX / a * RAD_DEG;
98
 
99
         return ret;
100
      }
101
 
102
      public override GSize GetTileMatrixMinXY(int zoom)
103
      {
104
         return new GSize(0, 0);
105
      }
106
 
107
      public override GSize GetTileMatrixMaxXY(int zoom)
108
      {
109
         long xy = (1 << zoom);
110
         return new GSize(xy - 1, xy - 1);
111
      }
112
   }
113
}