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