From b16d2b8c9ba88523c71d82a4a85824a2b70ceef8 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Sat, 10 Jan 2026 08:28:10 +0100 Subject: [PATCH] Updated Auto-UTM projections --- MapControl/Shared/Etrs89UtmProjection.cs | 2 +- MapControl/Shared/MapProjectionFactory.cs | 2 +- MapControl/Shared/Nad27UtmProjection.cs | 2 +- MapControl/Shared/Nad83UtmProjection.cs | 2 +- .../Shared/TransverseMercatorProjection.cs | 3 +- MapControl/Shared/Wgs84AutoUtmProjection.cs | 61 +++++++++++++++++++ MapControl/Shared/Wgs84UtmProjection.cs | 46 +------------- MapProjections/Shared/Ed50UtmProjection.cs | 2 +- MapProjections/Shared/Etrs89UtmProjection.cs | 2 +- MapProjections/Shared/Nad27UtmProjection.cs | 3 +- MapProjections/Shared/Nad83UtmProjection.cs | 2 +- .../Shared/Wgs84AutoUtmProjection.cs | 59 ++++++++++++++++++ MapProjections/Shared/Wgs84UtmProjection.cs | 44 +------------ 13 files changed, 132 insertions(+), 98 deletions(-) create mode 100644 MapControl/Shared/Wgs84AutoUtmProjection.cs create mode 100644 MapProjections/Shared/Wgs84AutoUtmProjection.cs diff --git a/MapControl/Shared/Etrs89UtmProjection.cs b/MapControl/Shared/Etrs89UtmProjection.cs index 44673444..757105a8 100644 --- a/MapControl/Shared/Etrs89UtmProjection.cs +++ b/MapControl/Shared/Etrs89UtmProjection.cs @@ -3,7 +3,7 @@ namespace MapControl { /// - /// ETRS89 UTM Projection with zone number. + /// ETRS89 Universal Transverse Mercator Projection. /// public class Etrs89UtmProjection : TransverseMercatorProjection { diff --git a/MapControl/Shared/MapProjectionFactory.cs b/MapControl/Shared/MapProjectionFactory.cs index 260fbeb4..e021947e 100644 --- a/MapControl/Shared/MapProjectionFactory.cs +++ b/MapControl/Shared/MapProjectionFactory.cs @@ -33,7 +33,7 @@ namespace MapControl break; case Wgs84AutoUtmProjection.DefaultCrsId: - projection = new Wgs84AutoUtmProjection(); + projection = new Wgs84AutoUtmProjection(""); break; case Wgs84AutoTmProjection.DefaultCrsId: diff --git a/MapControl/Shared/Nad27UtmProjection.cs b/MapControl/Shared/Nad27UtmProjection.cs index c061189e..8c14514c 100644 --- a/MapControl/Shared/Nad27UtmProjection.cs +++ b/MapControl/Shared/Nad27UtmProjection.cs @@ -3,7 +3,7 @@ namespace MapControl { /// - /// NAD27 UTM Projection with zone number. + /// NAD27 Universal Transverse Mercator Projection. /// public class Nad27UtmProjection : TransverseMercatorProjection { diff --git a/MapControl/Shared/Nad83UtmProjection.cs b/MapControl/Shared/Nad83UtmProjection.cs index 207dcc58..0686d6ba 100644 --- a/MapControl/Shared/Nad83UtmProjection.cs +++ b/MapControl/Shared/Nad83UtmProjection.cs @@ -3,7 +3,7 @@ namespace MapControl { /// - /// NAD83 UTM Projection with zone number. + /// NAD83 Universal Transverse Mercator Projection. /// public class Nad83UtmProjection : TransverseMercatorProjection { diff --git a/MapControl/Shared/TransverseMercatorProjection.cs b/MapControl/Shared/TransverseMercatorProjection.cs index 9af93a34..eff98aad 100644 --- a/MapControl/Shared/TransverseMercatorProjection.cs +++ b/MapControl/Shared/TransverseMercatorProjection.cs @@ -9,7 +9,8 @@ namespace MapControl { /// /// Transverse Mercator Projection. - /// See https://en.wikipedia.org/wiki/Transverse_Mercator_projection. + /// See https://en.wikipedia.org/wiki/Transverse_Mercator_projection + /// and https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system. /// public class TransverseMercatorProjection : MapProjection { diff --git a/MapControl/Shared/Wgs84AutoUtmProjection.cs b/MapControl/Shared/Wgs84AutoUtmProjection.cs new file mode 100644 index 00000000..1fadc803 --- /dev/null +++ b/MapControl/Shared/Wgs84AutoUtmProjection.cs @@ -0,0 +1,61 @@ +using System; + +namespace MapControl +{ + /// + /// WGS84 Universal Transverse Mercator Projection with + /// automatic zone selection from projection center. + /// + public class Wgs84AutoUtmProjection : Wgs84UtmProjection + { + public const string DefaultCrsId = "AUTO2:42001"; + + private readonly string autoCrsId; + + public Wgs84AutoUtmProjection() + : this(DefaultCrsId) + { + // XAML needs parameterless constructor + } + + /// + /// When the crsId parameter is null or empty, the projection will use EPSG:32***. + /// + public Wgs84AutoUtmProjection(string crsId) + : base(31, true) + { + autoCrsId = crsId; + + if (!string.IsNullOrEmpty(autoCrsId)) + { + CrsId = autoCrsId; + } + } + + public override Location Center + { + get => base.Center; + protected internal set + { + if (!base.Center.Equals(value)) + { + base.Center = value; + + var lon = Location.NormalizeLongitude(value.Longitude); + var zone = (int)Math.Floor(lon / 6d) + 31; + var north = value.Latitude >= 0d; + + if (Zone != zone || IsNorth != north) + { + SetZone(zone, north); + + if (!string.IsNullOrEmpty(autoCrsId)) + { + CrsId = autoCrsId; + } + } + } + } + } + } +} diff --git a/MapControl/Shared/Wgs84UtmProjection.cs b/MapControl/Shared/Wgs84UtmProjection.cs index db6c8e92..5d909c28 100644 --- a/MapControl/Shared/Wgs84UtmProjection.cs +++ b/MapControl/Shared/Wgs84UtmProjection.cs @@ -3,8 +3,7 @@ namespace MapControl { /// - /// WGS84 UTM Projection with zone number and north/south flag. - /// See https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system. + /// WGS84 Universal Transverse Mercator Projection. /// public class Wgs84UtmProjection : TransverseMercatorProjection { @@ -42,47 +41,4 @@ namespace MapControl FalseNorthing = north ? 0d : 1e7; } } - - /// - /// WGS84 UTM Projection with automatic zone selection from projection center. - /// - public class Wgs84AutoUtmProjection : Wgs84UtmProjection - { - public const string DefaultCrsId = "AUTO2:42001"; - - public Wgs84AutoUtmProjection() - : this(DefaultCrsId) - { - // XAML needs parameterless constructor - } - - public Wgs84AutoUtmProjection(string crsId) - : base(31, true) - { - CrsId = crsId; - } - - public override Location Center - { - get => base.Center; - protected internal set - { - if (!base.Center.Equals(value)) - { - base.Center = value; - - var lon = Location.NormalizeLongitude(value.Longitude); - var zone = (int)Math.Floor(lon / 6d) + 31; - var north = value.Latitude >= 0d; - - if (Zone != zone || IsNorth != north) - { - var crsId = CrsId; - SetZone(zone, north); - CrsId = crsId; - } - } - } - } - } } diff --git a/MapProjections/Shared/Ed50UtmProjection.cs b/MapProjections/Shared/Ed50UtmProjection.cs index 473698f2..18ab4b18 100644 --- a/MapProjections/Shared/Ed50UtmProjection.cs +++ b/MapProjections/Shared/Ed50UtmProjection.cs @@ -3,7 +3,7 @@ namespace MapControl.Projections { /// - /// ED50 UTM Projection with zone number. + /// ED50 Universal Transverse Mercator Projection. /// public class Ed50UtmProjection : GeoApiProjection { diff --git a/MapProjections/Shared/Etrs89UtmProjection.cs b/MapProjections/Shared/Etrs89UtmProjection.cs index 9e251e0b..9043dd9f 100644 --- a/MapProjections/Shared/Etrs89UtmProjection.cs +++ b/MapProjections/Shared/Etrs89UtmProjection.cs @@ -3,7 +3,7 @@ namespace MapControl.Projections { /// - /// ETRS89 UTM Projection with zone number. + /// ETRS89 Universal Transverse Mercator Projection. /// public class Etrs89UtmProjection : GeoApiProjection { diff --git a/MapProjections/Shared/Nad27UtmProjection.cs b/MapProjections/Shared/Nad27UtmProjection.cs index 6fd217c4..891474ea 100644 --- a/MapProjections/Shared/Nad27UtmProjection.cs +++ b/MapProjections/Shared/Nad27UtmProjection.cs @@ -3,8 +3,7 @@ namespace MapControl.Projections { /// - /// NAD27 UTM Projection with zone number. - /// Appears to be less accurate than MapControl.Nad27UtmProjection. + /// NAD27 Universal Transverse Mercator Projection. /// public class Nad27UtmProjection : GeoApiProjection { diff --git a/MapProjections/Shared/Nad83UtmProjection.cs b/MapProjections/Shared/Nad83UtmProjection.cs index ce7adef7..c3ddaa34 100644 --- a/MapProjections/Shared/Nad83UtmProjection.cs +++ b/MapProjections/Shared/Nad83UtmProjection.cs @@ -3,7 +3,7 @@ namespace MapControl.Projections { /// - /// NAD83 UTM Projection with zone number. + /// NAD83 Universal Transverse Mercator Projection. /// public class Nad83UtmProjection : GeoApiProjection { diff --git a/MapProjections/Shared/Wgs84AutoUtmProjection.cs b/MapProjections/Shared/Wgs84AutoUtmProjection.cs new file mode 100644 index 00000000..20c0d72d --- /dev/null +++ b/MapProjections/Shared/Wgs84AutoUtmProjection.cs @@ -0,0 +1,59 @@ +using System; + +namespace MapControl.Projections +{ + /// + /// WGS84 Universal Transverse Mercator Projection with + /// automatic zone selection from projection center. + /// + public class Wgs84AutoUtmProjection : Wgs84UtmProjection + { + private readonly string autoCrsId; + + public Wgs84AutoUtmProjection() + : this(MapControl.Wgs84AutoUtmProjection.DefaultCrsId) + { + // XAML needs parameterless constructor + } + + /// + /// When the crsId parameter is null or empty, the projection will use EPSG:32***. + /// + public Wgs84AutoUtmProjection(string crsId) + : base(31, true) + { + autoCrsId = crsId; + + if (!string.IsNullOrEmpty(autoCrsId)) + { + CrsId = autoCrsId; + } + } + + public override Location Center + { + get => base.Center; + protected set + { + if (!base.Center.Equals(value)) + { + base.Center = value; + + var lon = Location.NormalizeLongitude(value.Longitude); + var zone = (int)Math.Floor(lon / 6d) + 31; + var north = value.Latitude >= 0d; + + if (Zone != zone || IsNorth != north) + { + SetZone(zone, north); + + if (!string.IsNullOrEmpty(autoCrsId)) + { + CrsId = autoCrsId; + } + } + } + } + } + } +} diff --git a/MapProjections/Shared/Wgs84UtmProjection.cs b/MapProjections/Shared/Wgs84UtmProjection.cs index 11784408..c2add366 100644 --- a/MapProjections/Shared/Wgs84UtmProjection.cs +++ b/MapProjections/Shared/Wgs84UtmProjection.cs @@ -4,8 +4,7 @@ using System; namespace MapControl.Projections { /// - /// WGS84 UTM Projection with zone number and north/south flag. - /// See https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system. + /// WGS84 Universal Transverse Mercator Projection. /// public class Wgs84UtmProjection : GeoApiProjection { @@ -36,45 +35,4 @@ namespace MapControl.Projections CoordinateSystem = ProjectedCoordinateSystem.WGS84_UTM(Zone, IsNorth); } } - - /// - /// WGS84 UTM Projection with automatic zone selection from projection center. - /// - public class Wgs84AutoUtmProjection : Wgs84UtmProjection - { - public Wgs84AutoUtmProjection() - : this(MapControl.Wgs84AutoUtmProjection.DefaultCrsId) - { - // XAML needs parameterless constructor - } - - public Wgs84AutoUtmProjection(string crsId) - : base(31, true) - { - CrsId = crsId; - } - - public override Location Center - { - get => base.Center; - protected set - { - if (!base.Center.Equals(value)) - { - base.Center = value; - - var lon = Location.NormalizeLongitude(value.Longitude); - var zone = (int)Math.Floor(lon / 6d) + 31; - var north = value.Latitude >= 0d; - - if (Zone != zone || IsNorth != north) - { - var crsId = CrsId; - SetZone(zone, north); - CrsId = crsId; - } - } - } - } - } }