/// <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)); }
/// <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); }