/// <summary> /// Computes the reverse transformation. /// </summary> /// <param name="coordinate">The coordinate.</param> /// <returns>The transformed coordinate.</returns> protected override GeoCoordinate ComputeReverse(GeoCoordinate coordinate) { Coordinate geocentricCoordinate = _targetConversion.Forward(coordinate); geocentricCoordinate = _transformation.Reverse(geocentricCoordinate); GeoCoordinate result = _sourceConversion.Reverse(geocentricCoordinate); return(result); }
/// <summary> /// Computes the reverse transformation. /// </summary> /// <param name="coordinate">The coordinate.</param> /// <returns>The transformed coordinate.</returns> protected override GeoCoordinate ComputeReverse(GeoCoordinate coordinate) { coordinate = _3DTo2DConversion.Forward(coordinate); Coordinate geocentricCoordinate = _targetConversion.Forward(coordinate); geocentricCoordinate = _transformation.Reverse(geocentricCoordinate); coordinate = _sourceConversion.Reverse(geocentricCoordinate); coordinate = _3DTo2DConversion.Reverse(coordinate); return(coordinate); }
/// <summary> /// Computes the reverse transformation. /// </summary> /// <param name="coordinate">The coordinate.</param> /// <returns>The transformed coordinate.</returns> protected override GeoCoordinate ComputeReverse(Coordinate coordinate) { // source: EPSG Guidance Note number 7, part 2, page 94 Double x = _originGeocentricCoordinate.X - coordinate.X * _sinLamda0 - coordinate.Y * _sinFi0 * _cosLamda0 + coordinate.Z * _cosFi0 * _cosLamda0; Double y = _originGeocentricCoordinate.Y + coordinate.X * _cosLamda0 - coordinate.Y * _sinFi0 * _sinLamda0 + coordinate.Z * _cosFi0 * _sinLamda0; Double z = _originGeocentricCoordinate.Z + coordinate.Y * _cosFi0 + coordinate.Z * _sinFi0; return(_conversion.Reverse(new Coordinate(x, y, z))); }
/// <summary> /// Initializes a new instance of the <see cref="GeocentricToTopocentricConversion" /> class. /// </summary> /// <param name="parameters">The parameters of the operation.</param> /// <param name="ellipsoid">The ellipsoid.</param> /// <exception cref="System.ArgumentNullException"> /// The ellipsoid is null. /// or /// The method requires parameters which are not specified. /// </exception> /// <exception cref="System.ArgumentException"> /// The parameters do not contain a required parameter value. /// or /// The parameter is not a length value as required by the method. /// </exception> public GeocentricToTopocentricConversion(IDictionary <CoordinateOperationParameter, Object> parameters, Ellipsoid ellipsoid) : base(CoordinateOperationMethods.GeocentricToTopocentricConversion.Identifier, CoordinateOperationMethods.GeocentricToTopocentricConversion.Name, CoordinateOperationMethods.GeocentricToTopocentricConversion, parameters) { if (ellipsoid == null) { throw new ArgumentNullException("ellipsoid", "The ellipsoid is null."); } _geocentricXOfTopocentricOrigin = ((Length)parameters[CoordinateOperationParameters.GeocenticXOfTopocentricOrigin]).BaseValue; _geocentricYOfTopocentricOrigin = ((Length)parameters[CoordinateOperationParameters.GeocenticYOfTopocentricOrigin]).BaseValue; _geocentricZOfTopocentricOrigin = ((Length)parameters[CoordinateOperationParameters.GeocenticZOfTopocentricOrigin]).BaseValue; GeographicToGeocentricConversion _conversion = new GeographicToGeocentricConversion(ellipsoid); GeoCoordinate geographicCoordinate = _conversion.Reverse(new Coordinate(_geocentricXOfTopocentricOrigin, _geocentricYOfTopocentricOrigin, _geocentricZOfTopocentricOrigin)); _sinLamda0 = Math.Sin(geographicCoordinate.Longitude.BaseValue); _cosLamda0 = Math.Cos(geographicCoordinate.Longitude.BaseValue); _sinFi0 = Math.Sin(geographicCoordinate.Latitude.BaseValue); _cosFi0 = Math.Cos(geographicCoordinate.Latitude.BaseValue); }