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

57 lines
2.1 KiB
C#
Raw Normal View History

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