XAML-Map-Control/MapControl/Shared/MapProjectionFactory.cs

58 lines
2.3 KiB
C#
Raw Normal View History

2025-02-27 18:46:32 +01:00
using System;
2022-01-19 16:43:00 +01:00
namespace MapControl
{
public class MapProjectionFactory
{
2026-02-01 01:42:24 +01:00
public MapProjection GetProjection(string crsId)
2022-01-19 16:43:00 +01:00
{
2026-02-01 01:42:24 +01:00
var projection = CreateProjection(crsId);
if (projection == null &&
crsId.StartsWith("EPSG:") &&
int.TryParse(crsId.Substring(5), out int epsgCode))
{
projection = CreateProjection(epsgCode);
}
return projection ?? throw new NotSupportedException($"MapProjection \"{crsId}\" is not supported.");
}
protected virtual MapProjection CreateProjection(string crsId)
{
MapProjection projection = crsId switch
2022-01-19 16:43:00 +01:00
{
2026-01-20 23:05:33 +01:00
WebMercatorProjection.DefaultCrsId => new WebMercatorProjection(),
WorldMercatorProjection.DefaultCrsId => new WorldMercatorProjection(),
Wgs84UpsNorthProjection.DefaultCrsId => new Wgs84UpsNorthProjection(),
Wgs84UpsSouthProjection.DefaultCrsId => new Wgs84UpsSouthProjection(),
2026-02-01 01:42:24 +01:00
EquirectangularProjection.DefaultCrsId or "CRS:84" => new EquirectangularProjection(crsId),
2026-02-04 20:25:47 +01:00
_ => null
2026-01-20 23:05:33 +01:00
};
2026-02-01 01:42:24 +01:00
if (projection == null && crsId.StartsWith(StereographicProjection.DefaultCrsId))
{
2026-02-03 15:13:10 +01:00
projection = new StereographicProjection(crsId);
2026-02-01 01:42:24 +01:00
}
return projection;
}
2026-02-01 01:42:24 +01:00
protected virtual MapProjection CreateProjection(int epsgCode)
2026-01-21 12:08:12 +01:00
{
return epsgCode switch
{
var c when c is >= Etrs89UtmProjection.FirstZoneEpsgCode
and <= Etrs89UtmProjection.LastZoneEpsgCode => new Etrs89UtmProjection(c % 100),
var c when c is >= Nad83UtmProjection.FirstZoneEpsgCode
and <= Nad83UtmProjection.LastZoneEpsgCode => new Nad83UtmProjection(c % 100),
var c when c is >= Wgs84UtmProjection.FirstZoneNorthEpsgCode
2026-02-01 17:25:04 +01:00
and <= Wgs84UtmProjection.LastZoneNorthEpsgCode => new Wgs84UtmProjection(c % 100, true),
2026-01-21 12:08:12 +01:00
var c when c is >= Wgs84UtmProjection.FirstZoneSouthEpsgCode
2026-02-01 17:25:04 +01:00
and <= Wgs84UtmProjection.LastZoneSouthEpsgCode => new Wgs84UtmProjection(c % 100, false),
2026-01-21 12:08:12 +01:00
_ => null
};
}
2022-01-19 16:43:00 +01:00
}
}