public ImgData(LatLon latlon, double value) { this.latlon = latlon; this.value = value; }
public LatLon Tm2Geo(double x, double y) { LatLon result = new LatLon(); double lat, lon; double con; // temporary angles double phi; // temporary angles double delta_Phi; // difference between longitudes long i; // counter variable double sin_phi, cos_phi, tan_phi; // sin cos and tangent values double c, cs, t, ts, n, r, d, ds; // temporary variables double f, h, g, temp; // temporary variables double m_arScaleFactor = 0.9996; double m_arLonCenter = 129.0 * 0.0174532925199433; double m_arLatCenter = 0; double m_arFalseNorthing = 0.0; double m_arFalseEasting = 500000.0; double m_arMajor = 6378137.0; //장반경 double m_arMinor = 6356752.3142; //단반경 double m_dSrcInd = 1.0; double a = m_arMinor / m_arMajor; double m_dSrcEs = 1.0 - a * a; double m_dSrcE = Math.Sqrt(m_dSrcEs); double m_dSrcE0 = e0fn(m_dSrcEs); double m_dSrcE1 = e1fn(m_dSrcEs); double m_dSrcE2 = e2fn(m_dSrcEs); double m_dSrcE3 = e3fn(m_dSrcEs); double m_dSrcMl0 = m_arMajor * mlfn(m_dSrcE0, m_dSrcE1, m_dSrcE2, m_dSrcE3, m_arLatCenter); double m_dSrcEsp = m_dSrcEs / (1.0 - m_dSrcEs); const double EPSLN = 0.0000000001; if (m_dSrcInd != 0) { f = Math.Exp(x / (m_arMajor * m_arScaleFactor)); g = 0.5 * (f - 1.0 / f); temp = m_arLatCenter + y / (m_arMajor * m_arScaleFactor); h = Math.Cos(temp); con = Math.Sqrt((1.0 - h * h) / (1.0 + g * g)); lat = asinz(con); if (temp < 0) { lat *= -1; } if ((g == 0) && (h == 0)) { lon = m_arLonCenter; } else { lon = Math.Atan(g / h) + m_arLonCenter; } } // TM to LL inverse equations from here x -= m_arFalseEasting; y -= m_arFalseNorthing; con = (m_dSrcMl0 + y / m_arScaleFactor) / m_arMajor; phi = con; i = 0; while (true) { delta_Phi = ((con + m_dSrcE1 * Math.Sin(2.0 * phi) - m_dSrcE2 * Math.Sin(4.0 * phi) + m_dSrcE3 * Math.Sin(6.0 * phi)) / m_dSrcE0) - phi; phi = phi + delta_Phi; if (Math.Abs(delta_Phi) <= EPSLN) { break; } if (i > 20) { break; } i++; } if (Math.Abs(phi) < (Math.PI / 2)) { sin_phi = Math.Sin(phi); cos_phi = Math.Cos(phi); tan_phi = Math.Tan(phi); c = m_dSrcEsp * cos_phi * cos_phi; cs = c * c; t = tan_phi * tan_phi; ts = t * t; con = 1.0 - m_dSrcEs * sin_phi * sin_phi; n = m_arMajor / Math.Sqrt(con); r = n * (1.0 - m_dSrcEs) / con; d = x / (n * m_arScaleFactor); ds = d * d; lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t + 10.0 * c - 4.0 * cs - 9.0 * m_dSrcEsp - ds / 30.0 * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0 * m_dSrcEsp - 3.0 * cs))); lon = m_arLonCenter + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * m_dSrcEsp + 24.0 * ts))) / cos_phi); } else { lat = Math.PI * 0.5 * Math.Sin(y); lon = m_arLonCenter; } result.lat = lat; result.lon = lon; return(result); }