2018-08-29 20:54:42 +02:00
|
|
|
|
// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
|
2022-01-14 20:22:56 +01:00
|
|
|
|
// © 2022 Clemens Fischer
|
2018-08-29 20:54:42 +02:00
|
|
|
|
// Licensed under the Microsoft Public License (Ms-PL)
|
|
|
|
|
|
|
2018-12-20 21:55:12 +01:00
|
|
|
|
using ProjNet.CoordinateSystems;
|
2022-01-21 00:17:01 +01:00
|
|
|
|
using System;
|
2018-08-29 20:54:42 +02:00
|
|
|
|
|
|
|
|
|
|
namespace MapControl.Projections
|
|
|
|
|
|
{
|
|
|
|
|
|
public class UtmProjection : GeoApiProjection
|
|
|
|
|
|
{
|
2022-01-21 00:17:01 +01:00
|
|
|
|
public UtmProjection(int zone, bool north)
|
2022-01-19 23:40:05 +01:00
|
|
|
|
{
|
2022-01-21 00:17:01 +01:00
|
|
|
|
SetZone(zone, north);
|
2022-01-19 23:40:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public UtmProjection(Location location)
|
|
|
|
|
|
{
|
2022-01-21 16:55:00 +01:00
|
|
|
|
var zone = Math.Min((int)Math.Floor(Location.NormalizeLongitude(location.Longitude) + 180d) / 6 + 1, 60);
|
2018-10-03 11:27:55 +02:00
|
|
|
|
|
2022-01-21 16:55:00 +01:00
|
|
|
|
SetZone(zone, location.Latitude >= 0d);
|
2018-08-29 20:54:42 +02:00
|
|
|
|
}
|
2018-10-03 11:27:55 +02:00
|
|
|
|
|
2022-01-21 16:55:00 +01:00
|
|
|
|
protected void SetZone(int zone, bool north)
|
2018-10-03 11:27:55 +02:00
|
|
|
|
{
|
2022-01-21 00:17:01 +01:00
|
|
|
|
if (zone < 1 || zone > 60)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentException("Invalid UTM zone number.", nameof(zone));
|
|
|
|
|
|
}
|
2018-10-03 11:27:55 +02:00
|
|
|
|
|
2022-01-21 00:17:01 +01:00
|
|
|
|
CoordinateSystem = ProjectedCoordinateSystem.WGS84_UTM(zone, north);
|
2018-10-03 11:27:55 +02:00
|
|
|
|
}
|
2018-08-29 20:54:42 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|