dRonin  adbada4
dRonin GCS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Groups Pages
lks94projection.cpp
Go to the documentation of this file.
1 
13 /*
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful, but
20 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 * for more details.
23 *
24 * You should have received a copy of the GNU General Public License along
25 * with this program; if not, see <http://www.gnu.org/licenses/>
26 */
27 
28 #define _USE_MATH_DEFINES
29 #include <cmath>
30 #include "lks94projection.h"
31 #include "../../../../shared/api/physical_constants.h"
32 
33 
34 namespace projections {
35 LKS94Projection::LKS94Projection():MinLatitude (53.33 ), MaxLatitude (56.55 ), MinLongitude (20.22 ),
36 MaxLongitude (27.11 ), orignX (5122000 ), orignY (10000100 ),tileSize(256, 256)
37 {
38 }
39 
41 {
42  return tileSize;
43 }
44 double LKS94Projection::Axis() const
45 {
46  return 6378137;
47 }
49 {
50 
51  return (1.0 / 298.257222101);
52 
53 }
54 
55 Point LKS94Projection::FromLatLngToPixel(double lat, double lng, int const& zoom)
56 {
57  Point ret;
58 
59  lat = bound(lat, MinLatitude, MaxLatitude);
60  lng = bound(lng, MinLongitude, MaxLongitude);
61  QVector <double> lks(3);
62  lks[0]=lng;
63  lks[1]=lat;
64  lks = DTM10(lks);
65  lks = MTD10(lks);
66  lks = DTM00(lks);
67 
68  double res = GetTileMatrixResolution(zoom);
69 
70  ret.SetX((qint64) floor((lks[0] + orignX) / res));
71  ret.SetY((qint64) floor((orignY - lks[1]) / res));
72 
73  return ret;
74 }
75 
76 internals::PointLatLng LKS94Projection::FromPixelToLatLng(const qint64 &x,const qint64 &y,const int &zoom)
77 {
78  internals::PointLatLng ret;// = internals::PointLatLng::Empty;
79 
80  double res = GetTileMatrixResolution(zoom);
81 
82  QVector <double> lks(2);
83  lks[0]=(x * res) - orignX;
84  lks[1]=-(y * res) + orignY;
85  lks = MTD11(lks);
86  lks = DTM10(lks);
87  lks = MTD10(lks);
88  ret.SetLat(bound(lks[1], MinLatitude, MaxLatitude));
89  ret.SetLng(bound(lks[0], MinLongitude, MaxLongitude));
90  return ret;
91 }
92 
93 QVector <double> LKS94Projection::DTM10(const QVector <double>& lonlat)
94 {
95  double es; // Eccentricity squared : (a^2 - b^2)/a^2
96  double semiMajor = 6378137.0; // major axis
97  double semiMinor = 6356752.3142451793; // minor axis
98 
99  es = 1.0 - (semiMinor * semiMinor) / (semiMajor * semiMajor); //e^2
100  // ...
101 
102  double lon = lonlat[0] * DEG2RAD;
103  double lat = lonlat[1] * DEG2RAD;
104  double h = lonlat.count() < 3 ? 0 : std::isnan(lonlat[2]) ? 0 : lonlat[2];//TODO NAN
105  double v = semiMajor / sqrt(1 - es * pow(sin(lat), 2));
106  double x = (v + h) * cos(lat) * cos(lon);
107  double y = (v + h) * cos(lat) * sin(lon);
108  double z = ((1 - es) * v + h) * sin(lat);
109  QVector <double> ret(3);
110  ret[0]=x;
111  ret[1]=y;
112  ret[2]=z;
113  return ret;
114 }
115 QVector <double> LKS94Projection::MTD10(QVector <double>& pnt)
116 {
117  QVector <double> ret(3);
118  const double COS_67P5 = 0.38268343236508977; // cosine of 67.5 degrees
119  const double AD_C = 1.0026000; // Toms region 1 constant
120 
121  double es; // Eccentricity squared : (a^2 - b^2)/a^2
122  double semiMajor = 6378137.0; // major axis
123  double semiMinor = 6356752.3141403561; // minor axis
124  double ses; // Second eccentricity squared : (a^2 - b^2)/b^2
125 
126  es = 1.0 - (semiMinor * semiMinor) / (semiMajor * semiMajor); //e^2
127  ses = (pow(semiMajor, 2) - pow(semiMinor, 2)) / pow(semiMinor, 2);
128 
129  bool AtPole = false; // is location in polar region
130  double Z = pnt.count() < 3 ? 0 : std::isnan(pnt[2]) ? 0 : pnt[2];//TODO NaN
131 
132  double lon = 0;
133  double lat = 0;
134  double Height = 0;
135  if(pnt[0] != 0.0)
136  {
137  lon = atan2(pnt[1], pnt[0]);
138  }
139  else
140  {
141  if(pnt[1] > 0)
142  {
143  lon = M_PI / 2;
144  }
145  else
146  if(pnt[1] < 0)
147  {
148  lon = -M_PI * 0.5;
149  }
150  else
151  {
152  AtPole = true;
153  lon = 0.0;
154  if(Z > 0.0) // north pole
155  {
156  lat = M_PI * 0.5;
157  }
158  else
159  if(Z < 0.0) // south pole
160  {
161  lat = -M_PI * 0.5;
162  }
163  else // center of earth
164  {
165  ret[0] = lon * RAD2DEG;
166  ret[1] = M_PI * 0.5 * RAD2DEG;
167  ret[2] = -semiMinor;
168  return ret;
169  }
170  }
171  }
172  double W2 = pnt[0] * pnt[0] + pnt[1] * pnt[1]; // Square of distance from Z axis
173  double W = sqrt(W2); // distance from Z axis
174  double T0 = Z * AD_C; // initial estimate of vertical component
175  double S0 = sqrt(T0 * T0 + W2); // initial estimate of horizontal component
176  double Sin_B0 = T0 / S0; // sin(B0), B0 is estimate of Bowring aux variable
177  double Cos_B0 = W / S0; // cos(B0)
178  double Sin3_B0 = pow(Sin_B0, 3);
179  double T1 = Z + semiMinor * ses * Sin3_B0; // corrected estimate of vertical component
180  double Sum = W - semiMajor * es * Cos_B0 * Cos_B0 * Cos_B0; // numerator of cos(phi1)
181  double S1 = sqrt(T1 * T1 + Sum * Sum); // corrected estimate of horizontal component
182  double Sin_p1 = T1 / S1; // sin(phi1), phi1 is estimated latitude
183  double Cos_p1 = Sum / S1; // cos(phi1)
184  double Rn = semiMajor / sqrt(1.0 - es * Sin_p1 * Sin_p1); // Earth radius at location
185  if(Cos_p1 >= COS_67P5)
186  {
187  Height = W / Cos_p1 - Rn;
188  }
189  else
190  if(Cos_p1 <= -COS_67P5)
191  {
192  Height = W / -Cos_p1 - Rn;
193  }
194  else
195  {
196  Height = Z / Sin_p1 + Rn * (es - 1.0);
197  }
198 
199  if(!AtPole)
200  {
201  lat = atan(Sin_p1 / Cos_p1);
202  }
203  ret[0] = lon * RAD2DEG;
204  ret[1] = lat * RAD2DEG;
205  ret[2] = Height;
206  return ret;
207 }
208 QVector <double> LKS94Projection::DTM00(QVector <double>& lonlat)
209 {
210  double scaleFactor = 0.9998; // scale factor
211  double centralMeridian = 0.41887902047863912; // Center qlonglongitude (projection center) */
212  double latOrigin = 0.0; // center latitude
213  double falseNorthing = 0.0; // y offset in meters
214  double falseEasting = 500000.0; // x offset in meters
215  double semiMajor = 6378137.0; // major axis
216  double semiMinor = 6356752.3141403561; // minor axis
217  double metersPerUnit = 1.0;
218 
219  double e0, e1, e2, e3; // eccentricity constants
220  double es, esp; // eccentricity constants
221  double ml0; // small value m
222 
223  es = 1.0 - pow(semiMinor / semiMajor, 2);
224  e0 = e0fn(es);
225  e1 = e1fn(es);
226  e2 = e2fn(es);
227  e3 = e3fn(es);
228  ml0 = semiMajor * mlfn(e0, e1, e2, e3, latOrigin);
229  esp = es / (1.0 - es);
230 
231  // ...
232 
233  double lon = lonlat[0] * DEG2RAD;
234  double lat = lonlat[1] * DEG2RAD;
235 
236  double delta_lon = 0.0; // Delta qlonglongitude (Given qlonglongitude - center)
237  double sin_phi, cos_phi; // sin and cos value
238  double al, als; // temporary values
239  double c, t, tq; // temporary values
240  double con, n, ml; // cone constant, small m
241 
242  delta_lon = LKS94Projection::AdjustLongitude(lon - centralMeridian);
243  LKS94Projection::SinCos(lat, sin_phi, cos_phi);
244 
245  al = cos_phi * delta_lon;
246  als = pow(al, 2);
247  c = pow(cos_phi, 2);
248  tq = tan(lat);
249  t = pow(tq, 2);
250  con = 1.0 - es * pow(sin_phi, 2);
251  n = semiMajor / sqrt(con);
252  ml = semiMajor * mlfn(e0, e1, e2, e3, lat);
253 
254  double x = scaleFactor * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 *
255  (5.0 - 18.0 * t + pow(t, 2) + 72.0 * c - 58.0 * esp))) + falseEasting;
256 
257  double y = scaleFactor * (ml - ml0 + n * tq * (als * (0.5 + als / 24.0 *
258  (5.0 - t + 9.0 * c + 4.0 * pow(c, 2) + als / 30.0 * (61.0 - 58.0 * t
259  + pow(t, 2) + 600.0 * c - 330.0 * esp))))) + falseNorthing;
260 
261  if(lonlat.count() < 3)
262  {
263  QVector <double> ret(2);
264  ret[0]= x / metersPerUnit;
265  ret[1]= y / metersPerUnit;
266  return ret;
267  }
268  else
269  {
270  QVector <double> ret(3);
271  ret[0]= x / metersPerUnit;
272  ret[1]= y / metersPerUnit;
273  ret[2]=lonlat[2];
274  return ret;
275  }
276 }
277 
278 QVector <double> LKS94Projection::DTM01(QVector <double>& lonlat)
279 {
280  double es; // Eccentricity squared : (a^2 - b^2)/a^2
281  double semiMajor = 6378137.0; // major axis
282  double semiMinor = 6356752.3141403561; // minor axis
283 
284  es = 1.0 - (semiMinor * semiMinor) / (semiMajor * semiMajor);
285 
286  // ...
287 
288  double lon = lonlat[0] * DEG2RAD;
289  double lat = lonlat[1] * DEG2RAD;
290  double h = lonlat.count() < 3 ? 0 : std::isnan(lonlat[2]) ? 0 : lonlat[2];//TODO NaN
291  double v = semiMajor / sqrt(1 - es * pow(sin(lat), 2));
292  double x = (v + h) * cos(lat) * cos(lon);
293  double y = (v + h) * cos(lat) * sin(lon);
294  double z = ((1 - es) * v + h) * sin(lat);
295  QVector <double> ret(3);
296  ret[0]=x;
297  ret[1]=y;
298  ret[2]=z;
299  return ret;
300 }
301 QVector <double> LKS94Projection::MTD01(QVector <double>& pnt)
302 {
303  const double COS_67P5 = 0.38268343236508977; // cosine of 67.5 degrees
304  const double AD_C = 1.0026000; // Toms region 1 constant
305 
306  double es; // Eccentricity squared : (a^2 - b^2)/a^2
307  double semiMajor = 6378137.0; // major axis
308  double semiMinor = 6356752.3142451793; // minor axis
309  double ses; // Second eccentricity squared : (a^2 - b^2)/b^2
310 
311  es = 1.0 - (semiMinor * semiMinor) / (semiMajor * semiMajor);
312  ses = (pow(semiMajor, 2) - pow(semiMinor, 2)) / pow(semiMinor, 2);
313 
314  // ...
315 
316  bool At_Pole = false; // is location in polar region
317  double Z = pnt.count() < 3 ? 0 : std::isnan(pnt[2]) ? 0 : pnt[2];//TODO NaN
318 
319  double lon = 0;
320  double lat = 0;
321  double Height = 0;
322  if(pnt[0] != 0.0)
323  {
324  lon = atan2(pnt[1], pnt[0]);
325  }
326  else
327  {
328  if(pnt[1] > 0)
329  {
330  lon = M_PI / 2;
331  }
332  else
333  if(pnt[1] < 0)
334  {
335  lon = -M_PI * 0.5;
336  }
337  else
338  {
339  At_Pole = true;
340  lon = 0.0;
341  if(Z > 0.0) // north pole
342  {
343  lat = M_PI * 0.5;
344  }
345  else
346  if(Z < 0.0) // south pole
347  {
348  lat = -M_PI * 0.5;
349  }
350  else // center of earth
351  {
352  QVector<double> ret(3);
353  ret[0] = lon * RAD2DEG;
354  ret[1] = M_PI * 0.5 * RAD2DEG;
355  ret[2] = -semiMinor;
356  return ret;
357  }
358  }
359  }
360 
361  double W2 = pnt[0] * pnt[0] + pnt[1] * pnt[1]; // Square of distance from Z axis
362  double W = sqrt(W2); // distance from Z axis
363  double T0 = Z * AD_C; // initial estimate of vertical component
364  double S0 = sqrt(T0 * T0 + W2); //initial estimate of horizontal component
365  double Sin_B0 = T0 / S0; // sin(B0), B0 is estimate of Bowring aux variable
366  double Cos_B0 = W / S0; // cos(B0)
367  double Sin3_B0 = pow(Sin_B0, 3);
368  double T1 = Z + semiMinor * ses * Sin3_B0; //corrected estimate of vertical component
369  double Sum = W - semiMajor * es * Cos_B0 * Cos_B0 * Cos_B0; // numerator of cos(phi1)
370  double S1 = sqrt(T1 * T1 + Sum * Sum); // corrected estimate of horizontal component
371  double Sin_p1 = T1 / S1; // sin(phi1), phi1 is estimated latitude
372  double Cos_p1 = Sum / S1; // cos(phi1)
373  double Rn = semiMajor / sqrt(1.0 - es * Sin_p1 * Sin_p1); // Earth radius at location
374 
375  if(Cos_p1 >= COS_67P5)
376  {
377  Height = W / Cos_p1 - Rn;
378  }
379  else
380  if(Cos_p1 <= -COS_67P5)
381  {
382  Height = W / -Cos_p1 - Rn;
383  }
384  else
385  {
386  Height = Z / Sin_p1 + Rn * (es - 1.0);
387  }
388 
389  if(!At_Pole)
390  {
391  lat = atan(Sin_p1 / Cos_p1);
392  }
393  QVector<double> ret(3);
394  ret[0] = lon * RAD2DEG;
395  ret[1] = lat * RAD2DEG;
396  ret[2] = Height;
397  return ret;
398 }
399 QVector <double> LKS94Projection::MTD11(QVector <double>& p)
400 {
401  double scaleFactor = 0.9998; // scale factor
402  double centralMeridian = 0.41887902047863912; // Center qlonglongitude (projection center)
403  double latOrigin = 0.0; // center latitude
404  double falseNorthing = 0.0; // y offset in meters
405  double falseEasting = 500000.0; // x offset in meters
406  double semiMajor = 6378137.0; // major axis
407  double semiMinor = 6356752.3141403561; // minor axis
408  double metersPerUnit = 1.0;
409 
410  double e0, e1, e2, e3; // eccentricity constants
411  double es, esp; // eccentricity constants
412  double ml0; // small value m
413 
414  es =(semiMinor * semiMinor) / (semiMajor * semiMajor);
415  es=1.0-es;
416  e0 = e0fn(es);
417  e1 = e1fn(es);
418  e2 = e2fn(es);
419  e3 = e3fn(es);
420  ml0 = semiMajor * mlfn(e0, e1, e2, e3, latOrigin);
421  esp = es / (1.0 - es);
422 
423  // ...
424 
425  double con, phi;
426  double delta_phi;
427  qlonglong i;
428  double sin_phi, cos_phi, tan_phi;
429  double c, cs, t, ts, n, r, d, ds;
430  qlonglong max_iter = 6;
431 
432  double x = p[0] * metersPerUnit - falseEasting;
433  double y = p[1] * metersPerUnit - falseNorthing;
434 
435  con = (ml0 + y / scaleFactor) / semiMajor;
436  phi = con;
437  for(i = 0; ; i++)
438  {
439  delta_phi = ((con + e1 * sin(2.0 * phi) - e2 * sin(4.0 * phi) + e3 * sin(6.0 * phi)) / e0) - phi;
440  phi += delta_phi;
441  if(fabs(delta_phi) <= EPSLoN)
442  break;
443 
444  if(i >= max_iter)
445  throw "Latitude failed to converge";
446  }
447 
448  if(fabs(phi) < PI/2)
449  {
450  SinCos(phi, sin_phi, cos_phi);
451  tan_phi = tan(phi);
452  c = esp * pow(cos_phi, 2);
453  cs = pow(c, 2);
454  t = pow(tan_phi, 2);
455  ts = pow(t, 2);
456  con = 1.0 - es * pow(sin_phi, 2);
457  n = semiMajor / sqrt(con);
458  r = n * (1.0 - es) / con;
459  d = x / (n * scaleFactor);
460  ds = pow(d, 2);
461 
462  double lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t +
463  10.0 * c - 4.0 * cs - 9.0 * esp - ds / 30.0 * (61.0 + 90.0 * t +
464  298.0 * c + 45.0 * ts - 252.0 * esp - 3.0 * cs)));
465 
466  double lon = AdjustLongitude(centralMeridian + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t +
467  c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * esp +
468  24.0 * ts))) / cos_phi));
469 
470  if(p.count() < 3)
471  {
472  QVector<double> ret(2);
473  ret[0] = lon * RAD2DEG;
474  ret[1] = lat * RAD2DEG;
475  return ret;
476  }
477  else
478  {
479  QVector<double> ret(3);
480  ret[0] = lon * RAD2DEG;
481  ret[1] = lat * RAD2DEG;
482  ret[2] = p[2];
483  return ret;
484  }
485  }
486  else
487  {
488  if(p.count() < 3)
489  {
490  QVector<double> ret(2);
491  ret[0] = PI/2 * Sign(y) * RAD2DEG;
492  ret[1] = centralMeridian * RAD2DEG;
493  return ret;
494  }
495 
496  else
497  {
498  QVector<double> ret(3);
499  ret[0] = PI/2 * Sign(y) * RAD2DEG;
500  ret[1] = centralMeridian * RAD2DEG;
501  ret[2] = p[2];
502  return ret;
503  }
504 
505  }
506 }
507 
509 {
510  double ret = 0;
511 
512  switch(zoom)
513  {
514  case 0:
515  {
516  ret = 1587.50317500635;
517  }
518  break;
519 
520  case 1:
521  {
522  ret = 793.751587503175;
523  }
524  break;
525 
526  case 2:
527  {
528  ret = 529.167725002117;
529  }
530  break;
531 
532  case 3:
533  {
534  ret = 264.583862501058;
535  }
536  break;
537 
538  case 4:
539  {
540  ret = 132.291931250529;
541  }
542  break;
543 
544  case 5:
545  {
546  ret = 52.9167725002117;
547  }
548  break;
549 
550  case 6:
551  {
552  ret = 26.4583862501058;
553  }
554  break;
555 
556  case 7:
557  {
558  ret = 13.2291931250529;
559  }
560  break;
561 
562  case 8:
563  {
564  ret = 6.61459656252646;
565  }
566  break;
567 
568  case 9:
569  {
570  ret = 2.64583862501058;
571  }
572  break;
573 
574  case 10:
575  {
576  ret = 1.32291931250529;
577  }
578  break;
579 
580  case 11:
581  {
582  ret = 0.529167725002117;
583  }
584  break;
585 
586  }
587 
588  return ret;
589 }
590 /*
591  * Returns the conversion from pixels to meters
592  */
593 double LKS94Projection::GetGroundResolution(int const& zoom, double const& latitude)
594 {
595  Q_UNUSED(latitude);
596  return GetTileMatrixResolution(zoom);
597 }
599 {
600  Size ret;
601 
602  switch(zoom)
603  {
604 
605  case 0:
606  {
607  ret = Size(12, 8);
608  }
609  break;
610 
611  case 1:
612  {
613  ret = Size(24, 17);
614  }
615  break;
616 
617  case 2:
618  {
619  ret = Size(37, 25);
620  }
621  break;
622 
623  case 3:
624  {
625  ret = Size(74, 51);
626  }
627  break;
628 
629  case 4:
630  {
631  ret = Size(149, 103);
632  }
633  break;
634 
635  case 5:
636  {
637  ret = Size(374, 259);
638  }
639  break;
640 
641  case 6:
642  {
643  ret = Size(749, 519);
644  }
645  break;
646 
647  case 7:
648  {
649  ret = Size(1594, 1100);
650  }
651  break;
652 
653  case 8:
654  {
655  ret = Size(3188, 2201);
656  }
657  break;
658 
659  case 9:
660  {
661  ret = Size(7971, 5502);
662  }
663  break;
664 
665  case 10:
666  {
667  ret = Size(15943, 11005);
668  }
669  break;
670 
671  case 11:
672  {
673  ret = Size(39858, 27514);
674  }
675  break;
676  }
677 
678  return ret;
679 }
680 
682 {
683  Size ret;
684 
685  switch(zoom)
686  {
687  case 0:
688  {
689  ret = Size(14, 10);
690  }
691  break;
692 
693  case 1:
694  {
695  ret = Size(30, 20);
696  }
697  break;
698 
699  case 2:
700  {
701  ret = Size(45, 31);
702  }
703  break;
704 
705  case 3:
706  {
707  ret = Size(90, 62);
708  }
709  break;
710 
711  case 4:
712  {
713  ret = Size(181, 125);
714  }
715  break;
716 
717  case 5:
718  {
719  ret = Size(454, 311);
720  }
721  break;
722 
723  case 6:
724  {
725  ret = Size(903, 623);
726  }
727  break;
728 
729  case 7:
730  {
731  ret = Size(1718, 1193);
732  }
733  break;
734 
735  case 8:
736  {
737  ret = Size(3437, 2386);
738  }
739  break;
740 
741  case 9:
742  {
743  ret = Size(8594, 5966);
744  }
745  break;
746 
747  case 10:
748  {
749  ret = Size(17189, 11932);
750  }
751  break;
752 
753  case 11:
754  {
755  ret = Size(42972, 29831);
756  }
757  break;
758  }
759 
760  return ret;
761 }
762 
763 }
virtual Size TileSize() const
static double AdjustLongitude(double x)
virtual double Axis() const
DEG2RAD
Definition: OPPlots.m:107
void SetLat(const double &value)
Definition: pointlatlng.h:69
const char t[]
Definition: coreconstants.h:40
double bound(double const &n, double const &minValue, double const &maxValue) const
PureProjection::bound Bounds the value at an upper and lower threshold.
static double e3fn(const double &x)
const double PI
Definition: def.h:28
for i
Definition: OPPlots.m:140
virtual double GetGroundResolution(int const &zoom, double const &latitude)
PureProjection::GetGroundResolution Returns the conversion from pixels to meters. ...
static double mlfn(const double &e0, const double &e1, const double &e2, const double &e3, const double &phi)
void SetLng(const double &value)
Definition: pointlatlng.h:80
static double e2fn(const double &x)
virtual Size GetTileMatrixMinXY(int const &zoom)
double GetTileMatrixResolution(int const &zoom)
static const double EPSLoN
Eccentricity n
Definition: OPPlots.m:137
virtual Size GetTileMatrixMaxXY(int const &zoom)
z
Definition: OPPlots.m:102
static double Sign(const double &x)
static void SinCos(const double &val, double &sin, double &cos)
virtual core::Point FromLatLngToPixel(double lat, double lng, int const &zoom)
static double e0fn(const double &x)
RAD2DEG
Definition: OPPlots.m:106
virtual internals::PointLatLng FromPixelToLatLng(const qint64 &x, const qint64 &y, const int &zoom)
static double e1fn(const double &x)
x
Definition: OPPlots.m:100
virtual double Flattening() const
y
Definition: OPPlots.m:101