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