diff --git a/MapProjections/Avalonia/MapProjections.Avalonia.csproj b/MapProjections/Avalonia/MapProjections.Avalonia.csproj index cda9fa16..06a4701f 100644 --- a/MapProjections/Avalonia/MapProjections.Avalonia.csproj +++ b/MapProjections/Avalonia/MapProjections.Avalonia.csproj @@ -7,7 +7,7 @@ $(GeneratePackage) XAML.MapControl.MapProjections.Avalonia $(AssemblyTitle) - Map projections library for XAML Map Control, based on ProjNET4GeoAPI + Map projections library for XAML Map Control, based on ProjNET @@ -20,6 +20,6 @@ - + diff --git a/MapProjections/Shared/Ed50UtmProjection.cs b/MapProjections/Shared/Ed50UtmProjection.cs index 438b024f..cf69d653 100644 --- a/MapProjections/Shared/Ed50UtmProjection.cs +++ b/MapProjections/Shared/Ed50UtmProjection.cs @@ -5,7 +5,7 @@ namespace MapControl.Projections /// /// ED50 Universal Transverse Mercator Projection. /// - public class Ed50UtmProjection : GeoApiProjection + public class Ed50UtmProjection : ProjNetMapProjection { public const int FirstZone = 28; public const int LastZone = 38; @@ -27,18 +27,18 @@ namespace MapControl.Projections + "GEOGCS[\"ED50\"," + "DATUM[\"European_Datum_1950\"," + "SPHEROID[\"International 1924\",6378388,297],TOWGS84[-87,-98,-121,0,0,0,0]]," - + GeoApiProjectionFactory.PrimeMeridianGreenwich + "," - + GeoApiProjectionFactory.UnitDegree + "," + + ProjNetMapProjectionFactory.PrimeMeridianGreenwich + "," + + ProjNetMapProjectionFactory.UnitDegree + "," + "AUTHORITY[\"EPSG\",\"4230\"]]," - + GeoApiProjectionFactory.ProjectionTransverseMercator + "," + + ProjNetMapProjectionFactory.ProjectionTransverseMercator + "," + "PARAMETER[\"latitude_of_origin\",0]," + $"PARAMETER[\"central_meridian\",{6 * zone - 183}]," + "PARAMETER[\"scale_factor\",0.9996]," + "PARAMETER[\"false_easting\",500000]," + "PARAMETER[\"false_northing\",0]," - + GeoApiProjectionFactory.UnitMeter + "," - + GeoApiProjectionFactory.AxisEasting + "," - + GeoApiProjectionFactory.AxisNorthing + "," + + ProjNetMapProjectionFactory.UnitMeter + "," + + ProjNetMapProjectionFactory.AxisEasting + "," + + ProjNetMapProjectionFactory.AxisNorthing + "," + $"AUTHORITY[\"EPSG\",\"230{zone:00}\"]]"; } } diff --git a/MapProjections/Shared/Etrs89UtmProjection.cs b/MapProjections/Shared/Etrs89UtmProjection.cs index ab1abd8a..5b4bc531 100644 --- a/MapProjections/Shared/Etrs89UtmProjection.cs +++ b/MapProjections/Shared/Etrs89UtmProjection.cs @@ -5,7 +5,7 @@ namespace MapControl.Projections /// /// ETRS89 Universal Transverse Mercator Projection. /// - public class Etrs89UtmProjection : GeoApiProjection + public class Etrs89UtmProjection : ProjNetMapProjection { public const int FirstZone = 28; public const int LastZone = 38; @@ -24,16 +24,16 @@ namespace MapControl.Projections Zone = zone; CoordinateSystemWkt = $"PROJCS[\"ETRS89 / UTM zone {zone}N\"," - + GeoApiProjectionFactory.GeoGcsEtrs89 + "," - + GeoApiProjectionFactory.ProjectionTransverseMercator + "," + + ProjNetMapProjectionFactory.GeoGcsEtrs89 + "," + + ProjNetMapProjectionFactory.ProjectionTransverseMercator + "," + "PARAMETER[\"latitude_of_origin\",0]," + $"PARAMETER[\"central_meridian\",{6 * zone - 183}]," + "PARAMETER[\"scale_factor\",0.9996]," + "PARAMETER[\"false_easting\",500000]," + "PARAMETER[\"false_northing\",0]," - + GeoApiProjectionFactory.UnitMeter + "," - + GeoApiProjectionFactory.AxisEasting + "," - + GeoApiProjectionFactory.AxisNorthing + "," + + ProjNetMapProjectionFactory.UnitMeter + "," + + ProjNetMapProjectionFactory.AxisEasting + "," + + ProjNetMapProjectionFactory.AxisNorthing + "," + $"AUTHORITY[\"EPSG\",\"258{zone:00}\"]]"; } } diff --git a/MapProjections/Shared/Nad27UtmProjection.cs b/MapProjections/Shared/Nad27UtmProjection.cs index a1802dd7..e81fc5d2 100644 --- a/MapProjections/Shared/Nad27UtmProjection.cs +++ b/MapProjections/Shared/Nad27UtmProjection.cs @@ -5,7 +5,7 @@ namespace MapControl.Projections /// /// NAD27 Universal Transverse Mercator Projection. /// - public class Nad27UtmProjection : GeoApiProjection + public class Nad27UtmProjection : ProjNetMapProjection { public const int FirstZone = 1; public const int LastZone = 22; @@ -27,18 +27,18 @@ namespace MapControl.Projections + "GEOGCS[\"NAD27\"," + "DATUM[\"North_American_Datum_1927\"," + "SPHEROID[\"Clarke 1866\",6378206.4,294.978698213898]]," - + GeoApiProjectionFactory.PrimeMeridianGreenwich + "," - + GeoApiProjectionFactory.UnitDegree + "," + + ProjNetMapProjectionFactory.PrimeMeridianGreenwich + "," + + ProjNetMapProjectionFactory.UnitDegree + "," + "AUTHORITY[\"EPSG\",\"4267\"]]," - + GeoApiProjectionFactory.ProjectionTransverseMercator + "," + + ProjNetMapProjectionFactory.ProjectionTransverseMercator + "," + "PARAMETER[\"latitude_of_origin\",0]," + $"PARAMETER[\"central_meridian\",{6 * zone - 183}]," + "PARAMETER[\"scale_factor\",0.9996]," + "PARAMETER[\"false_easting\",500000]," + "PARAMETER[\"false_northing\",0]," - + GeoApiProjectionFactory.UnitMeter + "," - + GeoApiProjectionFactory.AxisEasting + "," - + GeoApiProjectionFactory.AxisNorthing + "," + + ProjNetMapProjectionFactory.UnitMeter + "," + + ProjNetMapProjectionFactory.AxisEasting + "," + + ProjNetMapProjectionFactory.AxisNorthing + "," + $"AUTHORITY[\"EPSG\",\"267{zone:00}\"]]"; } } diff --git a/MapProjections/Shared/Nad83UtmProjection.cs b/MapProjections/Shared/Nad83UtmProjection.cs index 717cc30a..43623eb9 100644 --- a/MapProjections/Shared/Nad83UtmProjection.cs +++ b/MapProjections/Shared/Nad83UtmProjection.cs @@ -5,7 +5,7 @@ namespace MapControl.Projections /// /// NAD83 Universal Transverse Mercator Projection. /// - public class Nad83UtmProjection : GeoApiProjection + public class Nad83UtmProjection : ProjNetMapProjection { public const int FirstZone = 1; public const int LastZone = 23; @@ -27,18 +27,18 @@ namespace MapControl.Projections + "GEOGCS[\"NAD83\"," + "DATUM[\"North_American_Datum_1983\"," + "SPHEROID[\"GRS 1980\",6378137,298.257222101]]," - + GeoApiProjectionFactory.PrimeMeridianGreenwich + "," - + GeoApiProjectionFactory.UnitDegree + "," + + ProjNetMapProjectionFactory.PrimeMeridianGreenwich + "," + + ProjNetMapProjectionFactory.UnitDegree + "," + "AUTHORITY[\"EPSG\",\"4269\"]]," - + GeoApiProjectionFactory.ProjectionTransverseMercator + "," + + ProjNetMapProjectionFactory.ProjectionTransverseMercator + "," + "PARAMETER[\"latitude_of_origin\",0]," + $"PARAMETER[\"central_meridian\",{6 * zone - 183}]," + "PARAMETER[\"scale_factor\",0.9996]," + "PARAMETER[\"false_easting\",500000]," + "PARAMETER[\"false_northing\",0]," - + GeoApiProjectionFactory.UnitMeter + "," - + GeoApiProjectionFactory.AxisEasting + "," - + GeoApiProjectionFactory.AxisNorthing + "," + + ProjNetMapProjectionFactory.UnitMeter + "," + + ProjNetMapProjectionFactory.AxisEasting + "," + + ProjNetMapProjectionFactory.AxisNorthing + "," + $"AUTHORITY[\"EPSG\",\"269{zone:00}\"]]"; } } diff --git a/MapProjections/Shared/GeoApiProjection.cs b/MapProjections/Shared/ProjNetMapProjection.cs similarity index 84% rename from MapProjections/Shared/GeoApiProjection.cs rename to MapProjections/Shared/ProjNetMapProjection.cs index 48c6a466..25917c27 100644 --- a/MapProjections/Shared/GeoApiProjection.cs +++ b/MapProjections/Shared/ProjNetMapProjection.cs @@ -1,7 +1,4 @@ -using GeoAPI.CoordinateSystems; -using GeoAPI.CoordinateSystems.Transformations; -using GeoAPI.Geometries; -using ProjNet.CoordinateSystems; +using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using System; #if WPF @@ -13,15 +10,15 @@ using Avalonia; namespace MapControl.Projections { /// - /// MapProjection based on ProjNET4GeoApi. + /// MapProjection based on ProjNet. /// - public class GeoApiProjection : MapProjection + public class ProjNetMapProjection : MapProjection { - protected GeoApiProjection() + protected ProjNetMapProjection() { } - public GeoApiProjection(string coordinateSystemWkt) + public ProjNetMapProjection(string coordinateSystemWkt) { CoordinateSystemWkt = coordinateSystemWkt; } @@ -34,13 +31,13 @@ namespace MapControl.Projections public string CoordinateSystemWkt { get => CoordinateSystem?.WKT; - protected set => CoordinateSystem = new CoordinateSystemFactory().CreateFromWkt(value) as IProjectedCoordinateSystem; + protected set => CoordinateSystem = new CoordinateSystemFactory().CreateFromWkt(value) as ProjectedCoordinateSystem; } /// /// Gets or sets the ICoordinateSystem of the MapProjection. /// - public IProjectedCoordinateSystem CoordinateSystem + public ProjectedCoordinateSystem CoordinateSystem { get; protected set @@ -90,9 +87,9 @@ namespace MapControl.Projections } } - public IMathTransform LocationToMapTransform { get; private set; } + public MathTransform LocationToMapTransform { get; private set; } - public IMathTransform MapToLocationTransform { get; private set; } + public MathTransform MapToLocationTransform { get; private set; } public override Point RelativeScale(double latitude, double longitude) { @@ -110,8 +107,8 @@ namespace MapControl.Projections try { - var coordinate = LocationToMapTransform.Transform(new Coordinate(longitude, latitude)); - return new Point(coordinate.X, coordinate.Y); + var coordinate = LocationToMapTransform.Transform([longitude, latitude]); + return new Point(coordinate[0], coordinate[1]); } catch { @@ -128,8 +125,8 @@ namespace MapControl.Projections try { - var coordinate = MapToLocationTransform.Transform(new Coordinate(x, y)); - return new Location(coordinate.Y, coordinate.X); + var coordinate = MapToLocationTransform.Transform([x, y]); + return new Location(coordinate[1], coordinate[0]); } catch { diff --git a/MapProjections/Shared/GeoApiProjectionFactory.cs b/MapProjections/Shared/ProjNetMapProjectionFactory.cs similarity index 94% rename from MapProjections/Shared/GeoApiProjectionFactory.cs rename to MapProjections/Shared/ProjNetMapProjectionFactory.cs index d7e25ec1..6142f2b9 100644 --- a/MapProjections/Shared/GeoApiProjectionFactory.cs +++ b/MapProjections/Shared/ProjNetMapProjectionFactory.cs @@ -2,8 +2,9 @@ namespace MapControl.Projections { - public class GeoApiProjectionFactory : MapProjectionFactory + public class ProjNetMapProjectionFactory : MapProjectionFactory { + internal const string SpheroidWgs84 = "SPHEROID[\"WGS 84\",6378137,298.257223563]"; internal const string SpheroidGrs1980 = "SPHEROID[\"GRS 1980\",6378137,298.257222101]"; internal const string SpheroidGrs1967Modified = "SPHEROID[\"GRS 1967 Modified\",6378160,298.25]"; internal const string PrimeMeridianGreenwich = "PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]]"; @@ -14,6 +15,14 @@ namespace MapControl.Projections internal const string AxisEasting = "AXIS[\"Easting\",EAST]"; internal const string AxisNorthing = "AXIS[\"Northing\",NORTH]"; + internal const string GeoGcsWgs84 + = "GEOGCS[\"WGS 84\"," + + "DATUM[\"WGS_1984\"," + + SpheroidWgs84 + "]," + + PrimeMeridianGreenwich + "," + + UnitDegree + "," + + "AUTHORITY[\"EPSG\",\"4326\"]]"; + internal const string GeoGcsEtrs89 = "GEOGCS[\"ETRS89\"," + "DATUM[\"European_Terrestrial_Reference_System_1989\"," @@ -241,7 +250,9 @@ namespace MapControl.Projections { MapControl.WebMercatorProjection.DefaultCrsId => new WebMercatorProjection(), MapControl.WorldMercatorProjection.DefaultCrsId => new WorldMercatorProjection(), - Wgs84AutoUtmProjection.DefaultCrsId => new Wgs84AutoUtmProjection(), + MapControl.Wgs84UpsNorthProjection.DefaultCrsId => new Wgs84UpsNorthProjection(), + MapControl.Wgs84UpsSouthProjection.DefaultCrsId => new Wgs84UpsSouthProjection(), + MapControl.Wgs84AutoUtmProjection.DefaultCrsId => new Wgs84AutoUtmProjection(), _ => base.GetProjection(crsId) }; @@ -253,7 +264,7 @@ namespace MapControl.Projections 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, Hemisphere.North), var code when code >= Wgs84UtmProjection.FirstZoneSouthEpsgCode && code <= Wgs84UtmProjection.LastZoneSouthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, Hemisphere.South), - _ => CoordinateSystemWkts.TryGetValue(epsgCode, out string wkt) ? new GeoApiProjection(wkt) : base.GetProjection(epsgCode) + _ => CoordinateSystemWkts.TryGetValue(epsgCode, out string wkt) ? new ProjNetMapProjection(wkt) : base.GetProjection(epsgCode) }; } } diff --git a/MapProjections/Shared/WebMercatorProjection.cs b/MapProjections/Shared/WebMercatorProjection.cs index 38d83a56..923c53d4 100644 --- a/MapProjections/Shared/WebMercatorProjection.cs +++ b/MapProjections/Shared/WebMercatorProjection.cs @@ -9,10 +9,10 @@ using Avalonia; namespace MapControl.Projections { /// - /// Spherical Mercator Projection implemented by setting the CoordinateSystem property of a GeoApiProjection. + /// Spherical Mercator Projection implemented by setting the CoordinateSystem property of a ProjNetMapProjection. /// See "Map Projections - A Working Manual" (https://pubs.usgs.gov/pp/1395/report.pdf), p.41-44. /// - public class WebMercatorProjection : GeoApiProjection + public class WebMercatorProjection : ProjNetMapProjection { public WebMercatorProjection() { diff --git a/MapProjections/Shared/Wgs84AutoUtmProjection.cs b/MapProjections/Shared/Wgs84AutoUtmProjection.cs index e376f123..18c03ce1 100644 --- a/MapProjections/Shared/Wgs84AutoUtmProjection.cs +++ b/MapProjections/Shared/Wgs84AutoUtmProjection.cs @@ -9,12 +9,10 @@ namespace MapControl.Projections /// public class Wgs84AutoUtmProjection : Wgs84UtmProjection { - public const string DefaultCrsId = "AUTO2:42001"; - private readonly string autoCrsId; public Wgs84AutoUtmProjection() // parameterless constructor for XAML - : this(DefaultCrsId) + : this(MapControl.Wgs84AutoUtmProjection.DefaultCrsId) { } diff --git a/MapProjections/Shared/Wgs84UpsProjections.cs b/MapProjections/Shared/Wgs84UpsProjections.cs new file mode 100644 index 00000000..867fc710 --- /dev/null +++ b/MapProjections/Shared/Wgs84UpsProjections.cs @@ -0,0 +1,62 @@ +#if WPF +using System.Windows; +#elif AVALONIA +using Avalonia; +#endif + +namespace MapControl.Projections +{ + public class Wgs84UpsNorthProjection : ProjNetMapProjection + { + public Wgs84UpsNorthProjection() + { + CoordinateSystemWkt + = "PROJCS[\"WGS 84 / UPS North (N,E)\"," + + ProjNetMapProjectionFactory.GeoGcsWgs84 + "," + + "PROJECTION[\"Polar_Stereographic\"]," + + "PARAMETER[\"latitude_of_origin\",90]," + + "PARAMETER[\"central_meridian\",0]," + + "PARAMETER[\"scale_factor\",0.994]," + + "PARAMETER[\"false_easting\",2000000]," + + "PARAMETER[\"false_northing\",2000000]," + + ProjNetMapProjectionFactory.UnitMeter + "," + + "AUTHORITY[\"EPSG\",\"32661\"]]"; + + Type = MapProjectionType.Azimuthal; + } + + public override Point RelativeScale(double latitude, double longitude) + { + var k = PolarStereographicProjection.RelativeScale(Hemisphere.North, Wgs84EquatorialRadius, Wgs84Flattening, 0.994, latitude); + + return new Point(k, k); + } + } + + public class Wgs84UpsSouthProjection : ProjNetMapProjection + { + public Wgs84UpsSouthProjection() + { + CoordinateSystemWkt + = "PROJCS[\"WGS 84 / UPS South (N,E)\"," + + ProjNetMapProjectionFactory.GeoGcsWgs84 + "," + + "PROJECTION[\"Polar_Stereographic\"]," + + "PARAMETER[\"latitude_of_origin\",-90]," + + "PARAMETER[\"central_meridian\",0]," + + "PARAMETER[\"scale_factor\",0.994]," + + "PARAMETER[\"false_easting\",2000000]," + + "PARAMETER[\"false_northing\",2000000]," + + ProjNetMapProjectionFactory.UnitMeter + "," + + "AUTHORITY[\"EPSG\",\"32761\"]]"; + + Type = MapProjectionType.Azimuthal; + } + + public override Point RelativeScale(double latitude, double longitude) + { + var k = PolarStereographicProjection.RelativeScale(Hemisphere.South, Wgs84EquatorialRadius, Wgs84Flattening, 0.994, latitude); + + return new Point(k, k); + } + } +} diff --git a/MapProjections/Shared/Wgs84UtmProjection.cs b/MapProjections/Shared/Wgs84UtmProjection.cs index bbac4b74..d0d2db57 100644 --- a/MapProjections/Shared/Wgs84UtmProjection.cs +++ b/MapProjections/Shared/Wgs84UtmProjection.cs @@ -6,7 +6,7 @@ namespace MapControl.Projections /// /// WGS84 Universal Transverse Mercator Projection. /// - public class Wgs84UtmProjection : GeoApiProjection + public class Wgs84UtmProjection : ProjNetMapProjection { public const int FirstZone = 1; public const int LastZone = 60; diff --git a/MapProjections/Shared/WorldMercatorProjection.cs b/MapProjections/Shared/WorldMercatorProjection.cs index 089e7759..2c0bf89c 100644 --- a/MapProjections/Shared/WorldMercatorProjection.cs +++ b/MapProjections/Shared/WorldMercatorProjection.cs @@ -7,35 +7,31 @@ using Avalonia; namespace MapControl.Projections { /// - /// Elliptical Mercator Projection implemented by setting the WKT property of a GeoApiProjection. + /// Elliptical Mercator Projection implemented by setting the WKT property of a ProjNetMapProjection. /// See "Map Projections - A Working Manual" (https://pubs.usgs.gov/pp/1395/report.pdf), p.44-45. /// - public class WorldMercatorProjection : GeoApiProjection + public class WorldMercatorProjection : ProjNetMapProjection { public WorldMercatorProjection() { CoordinateSystemWkt = "PROJCS[\"WGS 84 / World Mercator\"," - + "GEOGCS[\"WGS 84\"," - + "DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]]," - + GeoApiProjectionFactory.PrimeMeridianGreenwich + "," - + GeoApiProjectionFactory.UnitDegree + "," - + "AUTHORITY[\"EPSG\",\"4326\"]]," + + ProjNetMapProjectionFactory.GeoGcsWgs84 + "," + "PROJECTION[\"Mercator_1SP\"]," + "PARAMETER[\"latitude_of_origin\",0]," + "PARAMETER[\"central_meridian\",0]," + "PARAMETER[\"scale_factor\",1]," + "PARAMETER[\"false_easting\",0]," + "PARAMETER[\"false_northing\",0]," - + GeoApiProjectionFactory.UnitMeter + "," - + GeoApiProjectionFactory.AxisEasting + "," - + GeoApiProjectionFactory.AxisNorthing + "," + + ProjNetMapProjectionFactory.UnitMeter + "," + + ProjNetMapProjectionFactory.AxisEasting + "," + + ProjNetMapProjectionFactory.AxisNorthing + "," + "AUTHORITY[\"EPSG\",\"3395\"]]"; } public override Point RelativeScale(double latitude, double longitude) { - var k = MapControl.WorldMercatorProjection.ScaleFactor(latitude); + var k = MapControl.WorldMercatorProjection.RelativeScale(latitude); return new Point(k, k); } diff --git a/MapProjections/UWP/MapProjections.UWP.csproj b/MapProjections/UWP/MapProjections.UWP.csproj index d79be04a..19db11a0 100644 --- a/MapProjections/UWP/MapProjections.UWP.csproj +++ b/MapProjections/UWP/MapProjections.UWP.csproj @@ -9,7 +9,7 @@ $(GeneratePackage) XAML.MapControl.MapProjections.UWP $(AssemblyTitle) - Map projections library for XAML Map Control, based on ProjNET4GeoAPI + Map projections library for XAML Map Control, based on ProjNET true en-US @@ -23,6 +23,6 @@ - + diff --git a/MapProjections/WPF/MapProjections.WPF.csproj b/MapProjections/WPF/MapProjections.WPF.csproj index af398abf..0d859727 100644 --- a/MapProjections/WPF/MapProjections.WPF.csproj +++ b/MapProjections/WPF/MapProjections.WPF.csproj @@ -9,7 +9,7 @@ $(GeneratePackage) XAML.MapControl.MapProjections.WPF $(AssemblyTitle) - Map projections library for XAML Map Control, based on ProjNET4GeoAPI + Map projections library for XAML Map Control, based on ProjNET @@ -25,6 +25,6 @@ - + diff --git a/MapProjections/WinUI/MapProjections.WinUI.csproj b/MapProjections/WinUI/MapProjections.WinUI.csproj index 41882fd8..24207fc0 100644 --- a/MapProjections/WinUI/MapProjections.WinUI.csproj +++ b/MapProjections/WinUI/MapProjections.WinUI.csproj @@ -8,7 +8,7 @@ $(GeneratePackage) XAML.MapControl.MapProjections.WinUI $(AssemblyTitle) - Map projections library for XAML Map Control, based on ProjNET4GeoAPI + Map projections library for XAML Map Control, based on ProjNET @@ -21,6 +21,6 @@ - +