From 616b2bf3f762170f860773270358cb30703350c3 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Sat, 20 Sep 2025 14:01:51 +0200 Subject: [PATCH] MapProjection.Factory --- MapControl/Shared/GeoImage.cs | 2 +- MapControl/Shared/MapProjection.cs | 10 ++- MapControl/Shared/MapProjectionFactory.cs | 38 ++-------- .../Shared/GeoApiProjectionFactory.cs | 73 +++++-------------- MapProjections/WPF/MapProjections.WPF.csproj | 2 +- 5 files changed, 36 insertions(+), 89 deletions(-) diff --git a/MapControl/Shared/GeoImage.cs b/MapControl/Shared/GeoImage.cs index 240e7b3c..f1049824 100644 --- a/MapControl/Shared/GeoImage.cs +++ b/MapControl/Shared/GeoImage.cs @@ -194,7 +194,7 @@ namespace MapControl { var epsgCode = geoKeyDirectory[i + 3]; - return MapProjectionFactory.Instance.GetProjection($"EPSG:{epsgCode}"); + return MapProjection.Parse($"EPSG:{epsgCode}"); } } diff --git a/MapControl/Shared/MapProjection.cs b/MapControl/Shared/MapProjection.cs index e9d976f5..d9af8e94 100644 --- a/MapControl/Shared/MapProjection.cs +++ b/MapControl/Shared/MapProjection.cs @@ -31,6 +31,14 @@ namespace MapControl public const double Wgs84Flattening = 1d / 298.257223563; public static readonly double Wgs84Eccentricity = Math.Sqrt((2d - Wgs84Flattening) * Wgs84Flattening); + private static MapProjectionFactory factory; + + public static MapProjectionFactory Factory + { + get => factory ??= new MapProjectionFactory(); + set => factory = value; + } + /// /// Gets the type of the projection. /// @@ -147,7 +155,7 @@ namespace MapControl /// public static MapProjection Parse(string crsId) { - return MapProjectionFactory.Instance.GetProjection(crsId); + return Factory.GetProjection(crsId); } } } diff --git a/MapControl/Shared/MapProjectionFactory.cs b/MapControl/Shared/MapProjectionFactory.cs index 8a70201c..8348d1dc 100644 --- a/MapControl/Shared/MapProjectionFactory.cs +++ b/MapControl/Shared/MapProjectionFactory.cs @@ -4,14 +4,6 @@ namespace MapControl { public class MapProjectionFactory { - private static MapProjectionFactory instance; - - public static MapProjectionFactory Instance - { - get => instance ??= new MapProjectionFactory(); - set => instance = value; - } - public virtual MapProjection GetProjection(string crsId) { MapProjection projection = null; @@ -75,28 +67,14 @@ namespace MapControl return projection ?? throw new NotSupportedException($"MapProjection \"{crsId}\" is not supported."); } - public virtual MapProjection GetProjection(int epsgCode) + public virtual MapProjection GetProjection(int epsgCode) => epsgCode switch { - switch (epsgCode) - { - case var c when c >= Etrs89UtmProjection.FirstZoneEpsgCode && c <= Etrs89UtmProjection.LastZoneEpsgCode: - return new Etrs89UtmProjection(epsgCode % 100); - - case var c when c >= Nad27UtmProjection.FirstZoneEpsgCode && c <= Nad27UtmProjection.LastZoneEpsgCode: - return new Nad27UtmProjection(epsgCode % 100); - - case var c when c >= Nad83UtmProjection.FirstZoneEpsgCode && c <= Nad83UtmProjection.LastZoneEpsgCode: - return new Nad83UtmProjection(epsgCode % 100); - - case var c when c >= Wgs84UtmProjection.FirstZoneNorthEpsgCode && c <= Wgs84UtmProjection.LastZoneNorthEpsgCode: - return new Wgs84UtmProjection(epsgCode % 100, true); - - case var c when c >= Wgs84UtmProjection.FirstZoneSouthEpsgCode && c <= Wgs84UtmProjection.LastZoneSouthEpsgCode: - return new Wgs84UtmProjection(epsgCode % 100, false); - - default: - return null; - } - } + var code when code >= Etrs89UtmProjection.FirstZoneEpsgCode && code <= Etrs89UtmProjection.LastZoneEpsgCode => new Etrs89UtmProjection(epsgCode % 100), + var code when code >= Nad27UtmProjection.FirstZoneEpsgCode && code <= Nad27UtmProjection.LastZoneEpsgCode => new Nad27UtmProjection(epsgCode % 100), + var code when code >= Nad83UtmProjection.FirstZoneEpsgCode && code <= Nad83UtmProjection.LastZoneEpsgCode => new Nad83UtmProjection(epsgCode % 100), + var code when code >= Wgs84UtmProjection.FirstZoneNorthEpsgCode && code <= Wgs84UtmProjection.LastZoneNorthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, true), + var code when code >= Wgs84UtmProjection.FirstZoneSouthEpsgCode && code <= Wgs84UtmProjection.LastZoneSouthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, false), + _ => null + }; } } diff --git a/MapProjections/Shared/GeoApiProjectionFactory.cs b/MapProjections/Shared/GeoApiProjectionFactory.cs index b2f1f912..efb632b2 100644 --- a/MapProjections/Shared/GeoApiProjectionFactory.cs +++ b/MapProjections/Shared/GeoApiProjectionFactory.cs @@ -4,64 +4,25 @@ namespace MapControl.Projections { public class GeoApiProjectionFactory : MapProjectionFactory { - public static GeoApiProjectionFactory GetInstance() + public Dictionary CoordinateSystemWkts { get; } = []; + + public override MapProjection GetProjection(string crsId) => crsId switch { - if (!(Instance is GeoApiProjectionFactory factory)) - { - factory = new GeoApiProjectionFactory(); - Instance = factory; - } + MapControl.WebMercatorProjection.DefaultCrsId => new WebMercatorProjection(), + MapControl.WorldMercatorProjection.DefaultCrsId => new WorldMercatorProjection(), + MapControl.Wgs84AutoUtmProjection.DefaultCrsId => new Wgs84AutoUtmProjection(), + _ => base.GetProjection(crsId) + }; - return factory; - } - - public override MapProjection GetProjection(string crsId) + public override MapProjection GetProjection(int epsgCode) => epsgCode switch { - switch (crsId) - { - case MapControl.WebMercatorProjection.DefaultCrsId: - return new WebMercatorProjection(); - - case MapControl.WorldMercatorProjection.DefaultCrsId: - return new WorldMercatorProjection(); - - case MapControl.Wgs84AutoUtmProjection.DefaultCrsId: - return new Wgs84AutoUtmProjection(); - - default: - return base.GetProjection(crsId); - } - } - - public override MapProjection GetProjection(int epsgCode) - { - switch (epsgCode) - { - case int c when c >= Ed50UtmProjection.FirstZoneEpsgCode && c <= Ed50UtmProjection.LastZoneEpsgCode: - return new Ed50UtmProjection(epsgCode % 100); - - case var c when c >= Etrs89UtmProjection.FirstZoneEpsgCode && c <= Etrs89UtmProjection.LastZoneEpsgCode: - return new Etrs89UtmProjection(epsgCode % 100); - - case var c when c >= Nad27UtmProjection.FirstZoneEpsgCode && c <= Nad27UtmProjection.LastZoneEpsgCode: - return new Nad27UtmProjection(epsgCode % 100); - - case var c when c >= Nad83UtmProjection.FirstZoneEpsgCode && c <= Nad83UtmProjection.LastZoneEpsgCode: - return new Nad83UtmProjection(epsgCode % 100); - - case var c when c >= Wgs84UtmProjection.FirstZoneNorthEpsgCode && c <= Wgs84UtmProjection.LastZoneNorthEpsgCode: - return new Wgs84UtmProjection(epsgCode % 100, true); - - case var c when c >= Wgs84UtmProjection.FirstZoneSouthEpsgCode && c <= Wgs84UtmProjection.LastZoneSouthEpsgCode: - return new Wgs84UtmProjection(epsgCode % 100, false); - - default: - return CoordinateSystemWkts.TryGetValue(epsgCode, out string wkt) - ? new GeoApiProjection(wkt) - : base.GetProjection(epsgCode); - } - } - - public Dictionary CoordinateSystemWkts { get; } = new Dictionary(); + var code when code >= Ed50UtmProjection.FirstZoneEpsgCode && code <= Ed50UtmProjection.LastZoneEpsgCode => new Ed50UtmProjection(epsgCode % 100), + var code when code >= Etrs89UtmProjection.FirstZoneEpsgCode && code <= Etrs89UtmProjection.LastZoneEpsgCode => new Etrs89UtmProjection(epsgCode % 100), + var code when code >= Nad27UtmProjection.FirstZoneEpsgCode && code <= Nad27UtmProjection.LastZoneEpsgCode => new Nad27UtmProjection(epsgCode % 100), + var code when code >= Nad83UtmProjection.FirstZoneEpsgCode && code <= Nad83UtmProjection.LastZoneEpsgCode => new Nad83UtmProjection(epsgCode % 100), + var code when code >= Wgs84UtmProjection.FirstZoneNorthEpsgCode && code <= Wgs84UtmProjection.LastZoneNorthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, true), + var code when code >= Wgs84UtmProjection.FirstZoneSouthEpsgCode && code <= Wgs84UtmProjection.LastZoneSouthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, false), + _ => CoordinateSystemWkts.TryGetValue(epsgCode, out string wkt) ? new GeoApiProjection(wkt) : base.GetProjection(epsgCode) + }; } } diff --git a/MapProjections/WPF/MapProjections.WPF.csproj b/MapProjections/WPF/MapProjections.WPF.csproj index 1f1dea3a..0cc7a2af 100644 --- a/MapProjections/WPF/MapProjections.WPF.csproj +++ b/MapProjections/WPF/MapProjections.WPF.csproj @@ -1,7 +1,7 @@  net9.0-windows;net462 - 8.0 + 12.0 true WPF MapControl.Projections