From e2fcc1db2cc6668e6e2d76bd1dd597fddb43920e Mon Sep 17 00:00:00 2001 From: Clemens Date: Wed, 19 Jan 2022 16:43:00 +0100 Subject: [PATCH] Added MapProjectionFactory --- .../Shared/AutoEquirectangularProjection.cs | 4 +- .../Shared/EquirectangularProjection.cs | 4 +- MapControl/Shared/GnomonicProjection.cs | 4 +- ...GroundOverlayPanel.cs => GroundOverlay.cs} | 6 +-- MapControl/Shared/MapProjection.cs | 2 + MapControl/Shared/MapProjectionFactory.cs | 51 +++++++++++++++++++ MapControl/Shared/OrthographicProjection.cs | 4 +- MapControl/Shared/StereographicProjection.cs | 4 +- MapControl/Shared/WebMercatorProjection.cs | 4 +- MapControl/Shared/WorldMercatorProjection.cs | 4 +- MapControl/UWP/MapControl.UWP.csproj | 7 ++- MapUiTools/Shared/MapProjectionsMenuButton.cs | 10 ++-- 12 files changed, 87 insertions(+), 17 deletions(-) rename MapControl/Shared/{GroundOverlayPanel.cs => GroundOverlay.cs} (98%) create mode 100644 MapControl/Shared/MapProjectionFactory.cs diff --git a/MapControl/Shared/AutoEquirectangularProjection.cs b/MapControl/Shared/AutoEquirectangularProjection.cs index 685c2c2e..1ba7f033 100644 --- a/MapControl/Shared/AutoEquirectangularProjection.cs +++ b/MapControl/Shared/AutoEquirectangularProjection.cs @@ -11,9 +11,11 @@ namespace MapControl { public class AutoEquirectangularProjection : MapProjection { + public const string DefaultCrsId = "AUTO2:42004"; + public AutoEquirectangularProjection() { - CrsId = "AUTO2:42004"; + CrsId = DefaultCrsId; } public override Point LocationToMap(Location location) diff --git a/MapControl/Shared/EquirectangularProjection.cs b/MapControl/Shared/EquirectangularProjection.cs index bd249922..7e6e5226 100644 --- a/MapControl/Shared/EquirectangularProjection.cs +++ b/MapControl/Shared/EquirectangularProjection.cs @@ -18,9 +18,11 @@ namespace MapControl /// public class EquirectangularProjection : MapProjection { + public const string DefaultCrsId = "EPSG:4326"; + public EquirectangularProjection() { - CrsId = "EPSG:4326"; + CrsId = DefaultCrsId; } public override bool IsNormalCylindrical diff --git a/MapControl/Shared/GnomonicProjection.cs b/MapControl/Shared/GnomonicProjection.cs index 3cc93c90..feb8ac9e 100644 --- a/MapControl/Shared/GnomonicProjection.cs +++ b/MapControl/Shared/GnomonicProjection.cs @@ -14,9 +14,11 @@ namespace MapControl /// public class GnomonicProjection : AzimuthalProjection { + public const string DefaultCrsId = "AUTO2:97001"; // GeoServer non-standard CRS ID + public GnomonicProjection() { - CrsId = "AUTO2:97001"; // GeoServer non-standard CRS ID + CrsId = DefaultCrsId; } public override Point LocationToMap(Location location) diff --git a/MapControl/Shared/GroundOverlayPanel.cs b/MapControl/Shared/GroundOverlay.cs similarity index 98% rename from MapControl/Shared/GroundOverlayPanel.cs rename to MapControl/Shared/GroundOverlay.cs index 4fe15c97..70476a66 100644 --- a/MapControl/Shared/GroundOverlayPanel.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -27,7 +27,7 @@ using System.Windows.Media; namespace MapControl { - public class GroundOverlayPanel : MapPanel + public class GroundOverlay : MapPanel { class LatLonBox : BoundingBox { @@ -56,8 +56,8 @@ namespace MapControl } public static readonly DependencyProperty SourcePathProperty = DependencyProperty.Register( - nameof(SourcePath), typeof(string), typeof(GroundOverlayPanel), - new PropertyMetadata(null, async (o, e) => await ((GroundOverlayPanel)o).SourcePathPropertyChanged((string)e.NewValue))); + nameof(SourcePath), typeof(string), typeof(GroundOverlay), + new PropertyMetadata(null, async (o, e) => await ((GroundOverlay)o).SourcePathPropertyChanged((string)e.NewValue))); public string SourcePath { diff --git a/MapControl/Shared/MapProjection.cs b/MapControl/Shared/MapProjection.cs index 38e839b2..9e3da69f 100644 --- a/MapControl/Shared/MapProjection.cs +++ b/MapControl/Shared/MapProjection.cs @@ -22,6 +22,8 @@ namespace MapControl public const double Wgs84Flattening = 1d / 298.257223563; public static readonly double Wgs84Eccentricity = Math.Sqrt((2d - Wgs84Flattening) * Wgs84Flattening); + public static MapProjectionFactory Factory { get; set; } = new MapProjectionFactory(); + /// /// Gets or sets the WMS 1.3.0 CRS identifier. /// diff --git a/MapControl/Shared/MapProjectionFactory.cs b/MapControl/Shared/MapProjectionFactory.cs new file mode 100644 index 00000000..e768845c --- /dev/null +++ b/MapControl/Shared/MapProjectionFactory.cs @@ -0,0 +1,51 @@ +// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control +// © 2022 Clemens Fischer +// Licensed under the Microsoft Public License (Ms-PL) + +namespace MapControl +{ + public class MapProjectionFactory + { + public virtual MapProjection CreateProjection(string projectionDefinition) + { + MapProjection projection = null; + + switch (projectionDefinition) + { + case WorldMercatorProjection.DefaultCrsId: + projection = new WorldMercatorProjection(); + break; + + case WebMercatorProjection.DefaultCrsId: + projection = new WebMercatorProjection(); + break; + + case EquirectangularProjection.DefaultCrsId: + projection = new EquirectangularProjection(); + break; + + case OrthographicProjection.DefaultCrsId: + projection = new OrthographicProjection(); + break; + + case AutoEquirectangularProjection.DefaultCrsId: + projection = new AutoEquirectangularProjection(); + break; + + case GnomonicProjection.DefaultCrsId: + projection = new GnomonicProjection(); + break; + + case StereographicProjection.DefaultCrsId: + projection = new StereographicProjection(); + break; + + case "EPSG:97003": // proprietary CRS ID + projection = new AzimuthalEquidistantProjection { CrsId = projectionDefinition }; + break; + } + + return projection; + } + } +} diff --git a/MapControl/Shared/OrthographicProjection.cs b/MapControl/Shared/OrthographicProjection.cs index a7ebf294..bad81d2f 100644 --- a/MapControl/Shared/OrthographicProjection.cs +++ b/MapControl/Shared/OrthographicProjection.cs @@ -14,9 +14,11 @@ namespace MapControl /// public class OrthographicProjection : AzimuthalProjection { + public const string DefaultCrsId = "AUTO2:42003"; + public OrthographicProjection() { - CrsId = "AUTO2:42003"; + CrsId = DefaultCrsId; } public override Point LocationToMap(Location location) diff --git a/MapControl/Shared/StereographicProjection.cs b/MapControl/Shared/StereographicProjection.cs index 66d6145a..8d5683db 100644 --- a/MapControl/Shared/StereographicProjection.cs +++ b/MapControl/Shared/StereographicProjection.cs @@ -14,9 +14,11 @@ namespace MapControl /// public class StereographicProjection : AzimuthalProjection { + public const string DefaultCrsId = "AUTO2:97002"; // GeoServer non-standard CRS ID + public StereographicProjection() { - CrsId = "AUTO2:97002"; // GeoServer non-standard CRS ID + CrsId = DefaultCrsId; } public override Point LocationToMap(Location location) diff --git a/MapControl/Shared/WebMercatorProjection.cs b/MapControl/Shared/WebMercatorProjection.cs index 753ce0e0..78ca7572 100644 --- a/MapControl/Shared/WebMercatorProjection.cs +++ b/MapControl/Shared/WebMercatorProjection.cs @@ -15,11 +15,13 @@ namespace MapControl /// public class WebMercatorProjection : MapProjection { + public const string DefaultCrsId = "EPSG:3857"; + private static readonly double maxLatitude = YToLatitude(180d); public WebMercatorProjection() { - CrsId = "EPSG:3857"; + CrsId = DefaultCrsId; } public override bool IsNormalCylindrical diff --git a/MapControl/Shared/WorldMercatorProjection.cs b/MapControl/Shared/WorldMercatorProjection.cs index d5ad605c..5ad47fb9 100644 --- a/MapControl/Shared/WorldMercatorProjection.cs +++ b/MapControl/Shared/WorldMercatorProjection.cs @@ -15,6 +15,8 @@ namespace MapControl /// public class WorldMercatorProjection : MapProjection { + public const string DefaultCrsId = "EPSG:3395"; + public static double ConvergenceTolerance { get; set; } = 1e-6; public static int MaxIterations { get; set; } = 10; @@ -22,7 +24,7 @@ namespace MapControl public WorldMercatorProjection() { - CrsId = "EPSG:3395"; + CrsId = DefaultCrsId; } public override bool IsNormalCylindrical diff --git a/MapControl/UWP/MapControl.UWP.csproj b/MapControl/UWP/MapControl.UWP.csproj index 4227aff6..ea8ce1c5 100644 --- a/MapControl/UWP/MapControl.UWP.csproj +++ b/MapControl/UWP/MapControl.UWP.csproj @@ -77,8 +77,8 @@ GnomonicProjection.cs - - GroundOverlayPanel.cs + + GroundOverlay.cs ImageFileCache.cs @@ -125,6 +125,9 @@ MapProjection.cs + + MapProjectionFactory.cs + MapScale.cs diff --git a/MapUiTools/Shared/MapProjectionsMenuButton.cs b/MapUiTools/Shared/MapProjectionsMenuButton.cs index 30fa9572..c67d745d 100644 --- a/MapUiTools/Shared/MapProjectionsMenuButton.cs +++ b/MapUiTools/Shared/MapProjectionsMenuButton.cs @@ -26,7 +26,7 @@ namespace MapControl.UiTools public class MapProjectionItem { public string Text { get; set; } - public MapProjection Projection { get; set; } + public string Projection { get; set; } } #if WINUI || UWP @@ -77,18 +77,18 @@ namespace MapControl.UiTools private void MapProjectionClicked(object sender, RoutedEventArgs e) { var item = (FrameworkElement)sender; - var projection = (MapProjection)item.Tag; + var projection = (string)item.Tag; SetMapProjection(projection); } - private void SetMapProjection(MapProjection projection) + private void SetMapProjection(string projection) { - Map.MapProjection = projection; + Map.MapProjection = MapProjection.Factory.CreateProjection(projection); foreach (var item in GetMenuItems()) { - item.IsChecked = Map.MapProjection == (MapProjection)item.Tag; + item.IsChecked = projection == (string)item.Tag; } } }