Exemple #1
0
        /// <summary>
        /// Returns the inverse of this projection.
        /// </summary>
        /// <returns>IMathTransform that is the reverse of the current projection.</returns>
        public override IMathTransform Inverse()
        {
            if (_inverse == null)
            {
                _inverse = new KrovakProjection(_Parameters.ToProjectionParameter(), this);
            }

            return(_inverse);
        }
Exemple #2
0
        /// <summary>
        /// Creates an instance of an Albers projection object.
        /// </summary>
        /// <remarks>
        /// <para>The parameters this projection expects are listed below.</para>
        /// <list type="table">
        /// <listheader><term>Parameter</term><description>Description</description></listheader>
        /// <item><term>latitude_of_origin</term><description>The latitude of the point which is not the natural origin and at which grid coordinate values false easting and false northing are defined.</description></item>
        /// <item><term>central_meridian</term><description>The longitude of the point which is not the natural origin and at which grid coordinate values false easting and false northing are defined.</description></item>
        /// <item><term>standard_parallel_1</term><description>For a conic projection with two standard parallels, this is the latitude of intersection of the cone with the ellipsoid that is nearest the pole.  Scale is true along this parallel.</description></item>
        /// <item><term>standard_parallel_2</term><description>For a conic projection with two standard parallels, this is the latitude of intersection of the cone with the ellipsoid that is furthest from the pole.  Scale is true along this parallel.</description></item>
        /// <item><term>false_easting</term><description>The easting value assigned to the false origin.</description></item>
        /// <item><term>false_northing</term><description>The northing value assigned to the false origin.</description></item>
        /// </list>
        /// </remarks>
        /// <param name="parameters">List of parameters to initialize the projection.</param>
        /// <param name="inverse">Indicates whether the projection forward (meters to degrees or degrees to meters).</param>
        protected KrovakProjection(IEnumerable <ProjectionParameter> parameters, KrovakProjection inverse)
            : base(parameters, inverse)
        {
            Name = "Krovak";

            Authority     = "EPSG";
            AuthorityCode = 9819;

            //PROJCS["S-JTSK (Ferro) / Krovak",
            //GEOGCS["S-JTSK (Ferro)",
            //    DATUM["D_S_JTSK_Ferro",
            //        SPHEROID["Bessel 1841",6377397.155,299.1528128]],
            //    PRIMEM["Ferro",-17.66666666666667],
            //    UNIT["degree",0.0174532925199433]],
            //PROJECTION["Krovak"],
            //PARAMETER["latitude_of_center",49.5],
            //PARAMETER["longitude_of_center",42.5],
            //PARAMETER["azimuth",30.28813972222222],
            //PARAMETER["pseudo_standard_parallel_1",78.5],
            //PARAMETER["scale_factor",0.9999],
            //PARAMETER["false_easting",0],
            //PARAMETER["false_northing",0],
            //UNIT["metre",1]]

            //Check for missing parameters
            _azimuth = Degrees2Radians(_Parameters.GetParameterValue("azimuth"));
            _pseudoStandardParallel = Degrees2Radians(_Parameters.GetParameterValue("pseudo_standard_parallel_1"));

            // Calculates useful constants.
            _sinAzim = Math.Sin(_azimuth);
            _cosAzim = Math.Cos(_azimuth);
            _n       = Math.Sin(_pseudoStandardParallel);
            _tanS2   = Math.Tan(_pseudoStandardParallel / 2 + S45);

            var sinLat = Math.Sin(lat_origin);
            var cosLat = Math.Cos(lat_origin);
            var cosL2  = cosLat * cosLat;

            _alfa = Math.Sqrt(1 + ((_es * (cosL2 * cosL2)) / (1 - _es))); // parameter B
            _hae  = _alfa * _e / 2;
            var u0 = Math.Asin(sinLat / _alfa);

            var esl = _e * sinLat;
            var g   = Math.Pow((1 - esl) / (1 + esl), (_alfa * _e) / 2);

            _k1 = Math.Pow(Math.Tan(lat_origin / 2 + S45), _alfa) * g / Math.Tan(u0 / 2 + S45);
            _ka = Math.Pow(1 / _k1, -1 / _alfa);

            double radius = Math.Sqrt(1 - _es) / (1 - (_es * (sinLat * sinLat)));

            _ro0 = scale_factor * radius / Math.Tan(_pseudoStandardParallel);
            _rop = _ro0 * Math.Pow(_tanS2, _n);
        }