mirror of
https://github.com/ClemensFischer/XAML-Map-Control.git
synced 2025-12-06 07:12:04 +01:00
Added AutoUtmProjection
This commit is contained in:
parent
3ff7b3df50
commit
fe6d15fea6
50
MapProjections/Shared/AutoUtmProjection.cs
Normal file
50
MapProjections/Shared/AutoUtmProjection.cs
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
|
||||||
|
// © 2022 Clemens Fischer
|
||||||
|
// Licensed under the Microsoft Public License (Ms-PL)
|
||||||
|
|
||||||
|
using ProjNet.CoordinateSystems;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace MapControl.Projections
|
||||||
|
{
|
||||||
|
public class AutoUtmProjection : GeoApiProjection
|
||||||
|
{
|
||||||
|
private int zoneNumber;
|
||||||
|
private bool zoneIsNorth;
|
||||||
|
|
||||||
|
public AutoUtmProjection()
|
||||||
|
{
|
||||||
|
UpdateZone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Point LocationToMap(Location location)
|
||||||
|
{
|
||||||
|
UpdateZone();
|
||||||
|
return base.LocationToMap(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Location MapToLocation(Point point)
|
||||||
|
{
|
||||||
|
UpdateZone();
|
||||||
|
return base.MapToLocation(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateZone()
|
||||||
|
{
|
||||||
|
var north = Center.Latitude >= 0d;
|
||||||
|
var lon = Location.NormalizeLongitude(Center.Longitude);
|
||||||
|
var zone = (int)(lon + 180d) / 6 + 1;
|
||||||
|
|
||||||
|
if (zoneNumber != zone || zoneIsNorth != north)
|
||||||
|
{
|
||||||
|
zoneNumber = zone;
|
||||||
|
zoneIsNorth = north;
|
||||||
|
|
||||||
|
CoordinateSystem = ProjectedCoordinateSystem.WGS84_UTM(zoneNumber, zoneIsNorth);
|
||||||
|
CrsId = "AUTO2:42001";
|
||||||
|
|
||||||
|
System.Diagnostics.Debug.WriteLine(CoordinateSystem.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,11 +9,6 @@ namespace MapControl.Projections
|
||||||
public class Ed50UtmProjection : GeoApiProjection
|
public class Ed50UtmProjection : GeoApiProjection
|
||||||
{
|
{
|
||||||
public Ed50UtmProjection(int zone)
|
public Ed50UtmProjection(int zone)
|
||||||
{
|
|
||||||
SetZone(zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void SetZone(int zone)
|
|
||||||
{
|
{
|
||||||
if (zone < 28 || zone > 38)
|
if (zone < 28 || zone > 38)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,6 @@ namespace MapControl.Projections
|
||||||
public class Etrs89UtmProjection : GeoApiProjection
|
public class Etrs89UtmProjection : GeoApiProjection
|
||||||
{
|
{
|
||||||
public Etrs89UtmProjection(int zone)
|
public Etrs89UtmProjection(int zone)
|
||||||
{
|
|
||||||
SetZone(zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void SetZone(int zone)
|
|
||||||
{
|
{
|
||||||
if (zone < 28 || zone > 38)
|
if (zone < 28 || zone > 38)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ namespace MapControl.Projections
|
||||||
{
|
{
|
||||||
public const int WorldMercator = 3395;
|
public const int WorldMercator = 3395;
|
||||||
public const int WebMercator = 3857;
|
public const int WebMercator = 3857;
|
||||||
|
public const int AutoUtm = 42001;
|
||||||
public const int Ed50UtmFirst = 23028;
|
public const int Ed50UtmFirst = 23028;
|
||||||
public const int Ed50UtmLast = 23038;
|
public const int Ed50UtmLast = 23038;
|
||||||
public const int Etrs89UtmFirst = 25828;
|
public const int Etrs89UtmFirst = 25828;
|
||||||
|
|
@ -26,16 +27,19 @@ namespace MapControl.Projections
|
||||||
public override MapProjection GetProjection(string crsId)
|
public override MapProjection GetProjection(string crsId)
|
||||||
{
|
{
|
||||||
MapProjection projection = null;
|
MapProjection projection = null;
|
||||||
|
var str = crsId.StartsWith("EPSG:") ? crsId.Substring(5)
|
||||||
|
: crsId.StartsWith("AUTO2:") ? crsId.Substring(6)
|
||||||
|
: null;
|
||||||
|
|
||||||
if (crsId.StartsWith("EPSG:") && int.TryParse(crsId.Substring(5), out int epsgCode))
|
if (int.TryParse(str, out int code))
|
||||||
{
|
{
|
||||||
if (CoordinateSystemWkts.TryGetValue(epsgCode, out string wkt))
|
if (CoordinateSystemWkts.TryGetValue(code, out string wkt))
|
||||||
{
|
{
|
||||||
projection = new GeoApiProjection(wkt);
|
projection = new GeoApiProjection(wkt);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (epsgCode)
|
switch (code)
|
||||||
{
|
{
|
||||||
case WorldMercator:
|
case WorldMercator:
|
||||||
projection = new WorldMercatorProjection();
|
projection = new WorldMercatorProjection();
|
||||||
|
|
@ -45,20 +49,24 @@ namespace MapControl.Projections
|
||||||
projection = new WebMercatorProjection();
|
projection = new WebMercatorProjection();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AutoUtm:
|
||||||
|
projection = new AutoUtmProjection();
|
||||||
|
break;
|
||||||
|
|
||||||
case int c when c >= Ed50UtmFirst && c <= Ed50UtmLast:
|
case int c when c >= Ed50UtmFirst && c <= Ed50UtmLast:
|
||||||
projection = new Ed50UtmProjection(epsgCode % 100);
|
projection = new Ed50UtmProjection(code % 100);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case int c when c >= Etrs89UtmFirst && c <= Etrs89UtmLast:
|
case int c when c >= Etrs89UtmFirst && c <= Etrs89UtmLast:
|
||||||
projection = new Etrs89UtmProjection(epsgCode % 100);
|
projection = new Etrs89UtmProjection(code % 100);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case int c when c >= Wgs84UtmNorthFirst && c <= Wgs84UtmNorthLast:
|
case int c when c >= Wgs84UtmNorthFirst && c <= Wgs84UtmNorthLast:
|
||||||
projection = new Wgs84UtmProjection(epsgCode % 100, true);
|
projection = new Wgs84UtmProjection(code % 100, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case int c when c >= Wgs84UtmSouthFirst && c <= Wgs84UtmSouthLast:
|
case int c when c >= Wgs84UtmSouthFirst && c <= Wgs84UtmSouthLast:
|
||||||
projection = new Wgs84UtmProjection(epsgCode % 100, false);
|
projection = new Wgs84UtmProjection(code % 100, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Wgs84UpsNorth:
|
case Wgs84UpsNorth:
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,6 @@ namespace MapControl.Projections
|
||||||
public class Wgs84UtmProjection : GeoApiProjection
|
public class Wgs84UtmProjection : GeoApiProjection
|
||||||
{
|
{
|
||||||
public Wgs84UtmProjection(int zone, bool north)
|
public Wgs84UtmProjection(int zone, bool north)
|
||||||
{
|
|
||||||
SetZone(zone, north);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void SetZone(int zone, bool north)
|
|
||||||
{
|
{
|
||||||
if (zone < 1 || zone > 60)
|
if (zone < 1 || zone > 60)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,9 @@
|
||||||
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
|
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Shared\AutoUtmProjection.cs">
|
||||||
|
<Link>AutoUtmProjection.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\Shared\Ed50UtmProjection.cs">
|
<Compile Include="..\Shared\Ed50UtmProjection.cs">
|
||||||
<Link>Ed50UtmProjection.cs</Link>
|
<Link>Ed50UtmProjection.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue