Exemplo n.º 1
0
        /// <summary>
        /// Creates a ruler object from tile coordinates.
        /// </summary>
        /// <param name="y">Y TileId</param>
        /// <param name="z">Zoom Level</param>
        /// <param name="units"></param>
        /// <returns></returns>
        public static CheapRuler FromTile(int y, int z, CheapRulerUnits units = CheapRulerUnits.Kilometers)
        {
            var n   = Math.PI * (1 - 2 * (y + 0.5) / Math.Pow(2, z));
            var lat = Math.Atan(0.5 * (Math.Exp(n) - Math.Exp(-n))) * 180 / Math.PI;

            return(new CheapRuler(lat, units));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates a ruler object that will approximate measurements around the given latitude. Units are one of: kilometers
        /// </summary>
        /// <param name="outputUnits"></param>
        public CheapRuler(double latitude, CheapRulerUnits outputUnits = CheapRulerUnits.Kilometers)
        {
            double factor;

            switch (outputUnits)
            {
            case CheapRulerUnits.Kilometers:
                factor = 1.0d;
                break;

            case CheapRulerUnits.Miles:
                factor = 1000.0d / 1609.344;
                break;

            case CheapRulerUnits.NauticalMiles:
                factor = 1000.0d / 1852.0d;
                break;

            case CheapRulerUnits.Meters:
                factor = 1000.0d;
                break;

            case CheapRulerUnits.Yards:
                factor = 1000.0d / 0.9144;
                break;

            case CheapRulerUnits.Feet:
                factor = 1000.0d / 0.3048;
                break;

            case CheapRulerUnits.Inches:
                factor = 1000.0d / 0.0254;
                break;

            default:
                factor = 1.0d;
                break;
            }

            var cos  = Math.Cos(latitude * Math.PI / 180);
            var cos2 = 2 * cos * cos - 1;
            var cos3 = 2 * cos * cos2 - cos;
            var cos4 = 2 * cos * cos3 - cos2;
            var cos5 = 2 * cos * cos4 - cos3;

            // multipliers for converting longitude and latitude degrees into distance (http://1.usa.gov/1Wb1bv7)
            _kx = factor * (111.41513 * cos - 0.09455 * cos3 + 0.00012 * cos5);
            _ky = factor * (111.13209 - 0.56605 * cos2 + 0.0012 * cos4);
        }