protected OperationAspect _operationAspect; // aspect

        #endregion

        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="LambertAzimuthalEqualAreaProjection" /> class.
        /// </summary>
        /// <param name="identifier">The identifier of the operation.</param>
        /// <param name="name">The name of the operation.</param>
        /// <param name="parameters">The parameters of the operation.</param>
        /// <param name="ellipsoid">The ellipsoid.</param>
        /// <param name="areaOfUse">The area of use where the operation is applicable.</param>
        /// <exception cref="System.ArgumentNullException">
        /// The defined operation method requires parameters.
        /// or
        /// The ellipsoid is null.
        /// or
        /// The area of use is null.
        /// </exception>
        /// <exception cref="System.ArgumentException">
        /// The parameters do not contain a required parameter value.
        /// or
        /// The parameter is not an angular value as required by the method.
        /// or
        /// The parameter is not a length value as required by the method.
        /// or
        /// The parameter is not a double precision floating-point number as required by the method.
        /// or
        /// The parameter does not have the same measurement unit as the ellipsoid.
        /// </exception>
        public LambertAzimuthalEqualAreaProjection(String identifier, String name, Dictionary <CoordinateOperationParameter, Object> parameters, Ellipsoid ellipsoid, AreaOfUse areaOfUse)
            : base(identifier, name, CoordinateOperationMethods.LambertAzimuthalEqualAreaProjection, parameters, ellipsoid, areaOfUse)
        {
            // EPSG Guidance Note number 7, part 2, page 72

            _latitudeOfNaturalOrigin  = ((Angle)_parameters[CoordinateOperationParameters.LatitudeOfNaturalOrigin]).BaseValue;
            _longitudeOfNaturalOrigin = ((Angle)_parameters[CoordinateOperationParameters.LongitudeOfNaturalOrigin]).BaseValue;
            _falseEasting             = ((Length)_parameters[CoordinateOperationParameters.FalseEasting]).BaseValue;
            _falseNorthing            = ((Length)_parameters[CoordinateOperationParameters.FalseNorthing]).BaseValue;

            _qP    = (1 - _ellipsoid.EccentricitySquare) * ((1 / (1 - _ellipsoid.EccentricitySquare)) - ((1 / 2 * _ellipsoid.Eccentricity) * Math.Log((1 - _ellipsoid.Eccentricity) / (1 + _ellipsoid.Eccentricity), Math.E)));
            _qO    = (1 - _ellipsoid.EccentricitySquare) * ((Math.Sin(_latitudeOfNaturalOrigin) / (1 - _ellipsoid.EccentricitySquare * Calculator.Sin2(_latitudeOfNaturalOrigin))) - ((1 / (2 * _ellipsoid.Eccentricity)) * Math.Log((1 - _ellipsoid.Eccentricity * Math.Sin(_latitudeOfNaturalOrigin)) / (1 + _ellipsoid.Eccentricity * Math.Sin(_latitudeOfNaturalOrigin)), Math.E)));
            _betaO = Math.Asin(_qO / _qP);
            _RQ    = _ellipsoid.SemiMajorAxis.BaseValue * Math.Sqrt(_qP / 2);
            _D     = _ellipsoid.SemiMajorAxis.BaseValue * (Math.Cos(_latitudeOfNaturalOrigin) / Math.Sqrt(1 - _ellipsoid.EccentricitySquare * Calculator.Sin2(_latitudeOfNaturalOrigin))) / (_RQ * Math.Cos(_betaO));

            if (Math.Abs(_latitudeOfNaturalOrigin) - Math.Abs(Angles.NorthPole.BaseValue) <= Calculator.Tolerance)
            {
                _operationAspect = OperationAspect.NorthPolar;
            }
            else if (Math.Abs(_latitudeOfNaturalOrigin) - Math.Abs(Angles.SouthPole.BaseValue) <= Calculator.Tolerance)
            {
                _operationAspect = OperationAspect.SouthPolar;
            }
            else if (_ellipsoid.IsSphere && Math.Abs(_latitudeOfNaturalOrigin) - Math.Abs(Angles.Equator.BaseValue) <= Calculator.Tolerance)
            {
                _operationAspect = OperationAspect.Equatorial;
            }
            else
            {
                _operationAspect = OperationAspect.Oblique;
            }
        }
Пример #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="LambertAzimuthalEqualAreaProjection" /> class.
        /// </summary>
        /// <param name="identifier">The identifier.</param>
        /// <param name="name">The name.</param>
        /// <param name="remarks">The remarks.</param>
        /// <param name="aliases">The aliases.</param>
        /// <param name="method">The coordinate operation method.</param>
        /// <param name="parameters">The parameters of the operation.</param>
        /// <param name="ellipsoid">The ellipsoid.</param>
        /// <param name="areaOfUse">The area of use where the operation is applicable.</param>
        /// <exception cref="System.ArgumentNullException">
        /// The method is null.
        /// or
        /// The defined operation method requires parameters.
        /// or
        /// The ellipsoid is null.
        /// or
        /// The area of use is null.
        /// </exception>
        protected LambertAzimuthalEqualAreaProjection(String identifier, String name, String remarks, String[] aliases, CoordinateOperationMethod method, IDictionary <CoordinateOperationParameter, Object> parameters, Ellipsoid ellipsoid, AreaOfUse areaOfUse)
            : base(identifier, name, remarks, aliases, method, parameters, ellipsoid, areaOfUse)
        {
            // EPSG Guidance Note number 7, part 2

            this.latitudeOfNaturalOrigin  = this.GetParameterBaseValue(CoordinateOperationParameters.LatitudeOfNaturalOrigin);
            this.longitudeOfNaturalOrigin = this.GetParameterBaseValue(CoordinateOperationParameters.LongitudeOfNaturalOrigin);
            this.falseEasting             = this.GetParameterValue(CoordinateOperationParameters.FalseEasting);
            this.falseNorthing            = this.GetParameterValue(CoordinateOperationParameters.FalseNorthing);

            this.qP    = (1 - this.Ellipsoid.EccentricitySquare) * ((1 / (1 - this.Ellipsoid.EccentricitySquare)) - ((1 / 2 * this.Ellipsoid.Eccentricity) * Math.Log((1 - this.Ellipsoid.Eccentricity) / (1 + this.Ellipsoid.Eccentricity), Math.E)));
            this.qO    = (1 - this.Ellipsoid.EccentricitySquare) * ((Math.Sin(this.latitudeOfNaturalOrigin) / (1 - this.Ellipsoid.EccentricitySquare * Calculator.Sin2(this.latitudeOfNaturalOrigin))) - ((1 / (2 * this.Ellipsoid.Eccentricity)) * Math.Log((1 - this.Ellipsoid.Eccentricity * Math.Sin(this.latitudeOfNaturalOrigin)) / (1 + this.Ellipsoid.Eccentricity * Math.Sin(this.latitudeOfNaturalOrigin)), Math.E)));
            this.betaO = Math.Asin(this.qO / this.qP);
            this.RQ    = this.Ellipsoid.SemiMajorAxis.BaseValue * Math.Sqrt(this.qP / 2);
            this.D     = this.Ellipsoid.SemiMajorAxis.BaseValue * (Math.Cos(this.latitudeOfNaturalOrigin) / Math.Sqrt(1 - this.Ellipsoid.EccentricitySquare * Calculator.Sin2(this.latitudeOfNaturalOrigin))) / (this.RQ * Math.Cos(this.betaO));

            if (Math.Abs(this.latitudeOfNaturalOrigin) - Math.Abs(Angles.NorthPole.BaseValue) <= 1E-10)
            {
                this.operationAspect = OperationAspect.NorthPolar;
            }
            else if (Math.Abs(this.latitudeOfNaturalOrigin) - Math.Abs(Angles.SouthPole.BaseValue) <= 1E-10)
            {
                this.operationAspect = OperationAspect.SouthPolar;
            }
            else if (this.Ellipsoid.IsSphere && Math.Abs(this.latitudeOfNaturalOrigin) - Math.Abs(Angles.Equator.BaseValue) <= 1E-10)
            {
                this.operationAspect = OperationAspect.Equatorial;
            }
            else
            {
                this.operationAspect = OperationAspect.Oblique;
            }
        }