Example #1
0
        public static UtmPt LonLatPtToUtmNad27Pt(LonLatPt lonlat, Int32 zone)
        {
            Double rMajor = 6378137.0;
            Double rMinor = 6356752.3142450;
            Double scaleFactor = .9996;
            Double degreesToRadians = 1.745329251994328e-2;
            Double factor = degreesToRadians;
            Double latOrigin = 0;
            Double lonCenter = ((6 * Math.Abs(zone)) - 183) * degreesToRadians;
            //Debug.WriteLine("lonCenter = " + lonCenter);
            Double falseEasting = 500000;
            Double falseNorthing = (zone < 0) ? 10000000 : 0;
            //Debug.WriteLine(String.Format("rMajor = {0}\n rMinor = {1}\n scaleFactor = {2}\n degreesToRadians = {3}\n latOrigin = {4}\n lonCenter = {5}\n falseEasting = {6}\n falseNorthing = {7}",
            //	new Object[] {rMajor, rMinor, scaleFactor, degreesToRadians, latOrigin, lonCenter, falseEasting, falseNorthing}));

            Double temp = rMinor / rMajor;
            //Debug.WriteLine("temp = " + temp);

            Double es = 1 - (temp * temp);
            Double e = Math.Sqrt(es);
            Double e0 = e0fn(es);
            Double e1 = e1fn(es);
            Double e2 = e2fn(es);
            Double e3 = e3fn(es);
            Double ml0 = rMajor * mlfn(e0, e1, e2, e3, latOrigin);
            Double esp = es / (1 - es);
            Double ind = (es < .0001) ? 1: 0;
            //		Double radius = 6370997;	// radius of earth in meters
            //Debug.WriteLine(String.Format("es = {0}\n e = {1}\n e0 = {2}\n e1 = {3}\n e2 = {4}\n e3 = {5}\n ml0 = {6}\n esp = {7}\n ind = {8}",
            //	new Object[] {es, e, e0, e1, e2, e3, ml0, esp, ind}));
            //Debug.WriteLine("");

            Double longitude = lonlat.Lon * factor;
            Double latitude  = lonlat.Lat * factor;
            Double deltaLon  = AdjustLon(longitude - lonCenter);
            Double sinPhi = Math.Sin(latitude);
            Double cosPhi = Math.Cos(latitude);
            Double al = cosPhi * deltaLon;
            Double als = al * al;
            Double c = esp * cosPhi * cosPhi;
            Double tq = Math.Tan(latitude);
            Double t = tq * tq;
            Double con = 1.0 - es * sinPhi * sinPhi;
            Double n = rMajor / Math.Sqrt(con);
            Double ml = rMajor * mlfn(e0, e1, e2, e3, latitude);
            //Debug.WriteLine(String.Format("logitude = {0}\n latitude = {1}\n delaLon = {2}\n sinPhi = {3}\n cosPhi = {4}\n al = {5}\n als = {6}\n c = {7}\n tq = {8}\n t = {9}\n con = {10}\n n = {11}\n ml = {12}",
            //	new Object[]{longitude, latitude, deltaLon, sinPhi, cosPhi, al, als, c, tq, t, con, n, ml}));

            UtmPt utmpt = new UtmPt();
            utmpt.X = scaleFactor * n * al * (1.0 + als / 6.0 *
                (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + (t * t) + 72.0 * c - 58.0 * esp))) + falseEasting;

            utmpt.Y = scaleFactor * (ml - ml0 + n * tq * (als * (0.5 + als / 24.0 *
                (5.0 - t + 9.0 * c + 4.0 * (c * c) + als / 30.0 *
                (61.0 - 58.0 * t + (t * t) + 600.0 * c - 330.0 * esp))))) + falseNorthing;
            utmpt.Zone = zone;

            return(utmpt);
        }
Example #2
0
        public static LonLatPt UtmNad83PtToLonLatPt(UtmPt u)
        {
            // make a local copy so that we can change values there:
            UtmPt utmpt = new UtmPt();
            utmpt.X = u.X;
            utmpt.Y = u.Y;
            utmpt.Zone = u.Zone;

            Double rMajor = 6378137.0;
            Double rMinor = 6356752.3142450;
            Double latOrigin = 0;
            Double degreesToRadians = 1.745329251994328e-2;
            Double factor = 57.29577951308231;
            Double lonCenter = ((6 * Math.Abs(utmpt.Zone)) - 183) * degreesToRadians;
            Double falseEasting = 500000;
            Double falseNorthing = (utmpt.Zone < 0) ? 10000000 : 0;
            Double scaleFactor = .9996;
            Double temp = rMinor / rMajor;
            //Debug.WriteLine("temp = " + temp);

            Double es = 1 - (temp * temp);
            Double e = Math.Sqrt(es);
            Double e0 = e0fn(es);
            Double e1 = e1fn(es);
            Double e2 = e2fn(es);
            Double e3 = e3fn(es);
            Double ml0 = rMajor * mlfn(e0, e1, e2, e3, latOrigin);
            Double esp = es / (1 - es);
            Double ind = (es < .0001) ? 1: 0;
            //Debug.WriteLine(String.Format("es = {0}\n e = {1}\n e0 = {2}\n e1 = {3}\n e2 = {4}\n e3 = {5}\n ml0 = {6}\n esp = {7}\n ind = {8}",
            //	new Object[] {es, e, e0, e1, e2, e3, ml0, esp, ind}));
            //Debug.WriteLine("");
            Int32 maxIterations = 6;
            utmpt.X -= falseEasting;
            utmpt.Y -= falseNorthing;
            Double con = (ml0 + utmpt.Y / scaleFactor) / rMajor;
            Double phi = con;
            for (int i = 0; ; i++)
            {
                Double delta_phi = ((con + e1 * Math.Sin(2.0 * phi) - e2 * Math.Sin(4.0 * phi) + e3 * Math.Sin(6.0 * phi))
                    / e0) - phi;
                phi += delta_phi;
                if (Math.Abs(delta_phi) <= 1.0e-10) break;
                if (i >= maxIterations)
                {
                    throw new Exception("Latitude failed to converge");
                }
            }
            LonLatPt lonlat = new LonLatPt();
            if (Math.Abs(phi) < (Math.PI / 2))
            {
                Double sinPhi = Math.Sin(phi);
                Double cosPhi = Math.Cos(phi);
                Double tanPhi = Math.Tan(phi);
                Double c    = esp * (cosPhi * cosPhi);
                Double cs   = (c * c);
                Double t    = (tanPhi * tanPhi);
                Double ts   = (t * t);
                con  = 1.0 - es * (sinPhi * sinPhi);
                Double n    = rMajor / Math.Sqrt(con);
                Double r    = n * (1.0 - es) / con;
                Double d    = utmpt.X / (n * scaleFactor);
                Double ds   = (d * d);
                lonlat.Lat = phi - (n * tanPhi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t +
                    10.0 * c - 4.0 * cs - 9.0 * esp - ds / 30.0 * (61.0 + 90.0 * t +
                    298.0 * c + 45.0 * ts - 252.0 * esp - 3.0 * cs)));

                lonlat.Lon = AdjustLon(lonCenter + (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 * esp +
                    24.0 * ts))) / cosPhi));
            }
            else
            {
                lonlat.Lat = (Math.PI / 2) * Math.Sign(utmpt.Y);
                lonlat.Lon = lonCenter;
            }
            lonlat.Lon *= factor;
            lonlat.Lat *= factor;
            return(lonlat);
        }