From 1d62a6e9f3a9b13b070acf476f517cfc681fb9f7 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Tue, 3 Feb 2026 15:13:10 +0100 Subject: [PATCH] Updated StereographicProjection --- MapControl/Shared/MapProjectionFactory.cs | 12 +------ MapControl/Shared/StereographicProjection.cs | 33 +++++++++++++++----- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/MapControl/Shared/MapProjectionFactory.cs b/MapControl/Shared/MapProjectionFactory.cs index 6ca6dcf1..926c3df3 100644 --- a/MapControl/Shared/MapProjectionFactory.cs +++ b/MapControl/Shared/MapProjectionFactory.cs @@ -1,5 +1,4 @@ using System; -using System.Globalization; namespace MapControl { @@ -33,16 +32,7 @@ namespace MapControl if (projection == null && crsId.StartsWith(StereographicProjection.DefaultCrsId)) { - var parameters = crsId.Split(','); - - if (parameters.Length == 4 && - parameters[0] == StereographicProjection.DefaultCrsId && - parameters[1] == "1" && - double.TryParse(parameters[2], NumberStyles.Float, CultureInfo.InvariantCulture, out double longitude) && - double.TryParse(parameters[3], NumberStyles.Float, CultureInfo.InvariantCulture, out double latitude)) - { - projection = new StereographicProjection(longitude, latitude); - } + projection = new StereographicProjection(crsId); } return projection; diff --git a/MapControl/Shared/StereographicProjection.cs b/MapControl/Shared/StereographicProjection.cs index 7bcae21a..18bbc2a8 100644 --- a/MapControl/Shared/StereographicProjection.cs +++ b/MapControl/Shared/StereographicProjection.cs @@ -17,12 +17,32 @@ namespace MapControl { public const string DefaultCrsId = "AUTO2:97002"; // GeoServer non-standard CRS identifier - public StereographicProjection(double centerLongitude, double centerLatitude, string crsId = DefaultCrsId) + public StereographicProjection(string crsId) { + var parameters = crsId.Split(','); + + if (parameters.Length != 4 || + string.IsNullOrEmpty(parameters[0]) || + !double.TryParse(parameters[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double scaleFactor) || + !double.TryParse(parameters[2], NumberStyles.Float, CultureInfo.InvariantCulture, out double longitude) || + !double.TryParse(parameters[3], NumberStyles.Float, CultureInfo.InvariantCulture, out double latitude)) + { + throw new ArgumentException($"Invalid CRS Identifier {crsId}.", nameof(crsId)); + } + + CrsId = crsId; + ScaleFactor = scaleFactor; + CentralMeridian = longitude; + LatitudeOfOrigin = latitude; + } + + public StereographicProjection(double centerLatitude, double centerLongitude, double scaleFactor = 1d, string crsId = DefaultCrsId) + { + CrsId = string.Format(CultureInfo.InvariantCulture, + "{0},{1:0.########},{2:0.########},{3:0.########}", crsId, scaleFactor, centerLongitude, centerLatitude); + ScaleFactor = scaleFactor; CentralMeridian = centerLongitude; LatitudeOfOrigin = centerLatitude; - CrsId = string.Format(CultureInfo.InvariantCulture, - "{0},1,{1:0.########},{2:0.########}", crsId, centerLongitude, centerLatitude); } private void GetScaleAndGridConvergence(double latitude, double longitude, out double scale, out double gamma) @@ -41,12 +61,11 @@ namespace MapControl var cosLambda = Math.Cos(dLambda); var k1 = 2d / (1d + sinPhi0 * sinPhi1 + cosPhi0 * cosPhi1 * cosLambda); var k2 = 2d / (1d + sinPhi0 * sinPhi2 + cosPhi0 * cosPhi2 * cosLambda); - var dCosPhi = k2 * cosPhi2 - k1 * cosPhi1; - var dSinPhi = k2 * sinPhi2 - k1 * sinPhi1; + var c = k2 * cosPhi2 - k1 * cosPhi1; + var s = k2 * sinPhi2 - k1 * sinPhi1; scale = k1; - gamma = Math.Atan2(-sinLambda * dCosPhi, - cosPhi0 * dSinPhi - sinPhi0 * cosLambda * dCosPhi) * 180d / Math.PI; + gamma = Math.Atan2(-sinLambda * c, cosPhi0 * s - sinPhi0 * cosLambda * c) * 180d / Math.PI; } public override double GridConvergence(double latitude, double longitude)