XAML-Map-Control/MapProjections/Shared/ProjNetMapProjectionFactory.cs

255 lines
14 KiB
C#
Raw Normal View History

2025-02-27 18:46:32 +01:00
using System.Collections.Generic;
2022-01-24 20:43:22 +01:00
2022-01-19 23:40:05 +01:00
namespace MapControl.Projections
{
2026-01-15 11:04:11 +01:00
public class ProjNetMapProjectionFactory : MapProjectionFactory
2022-01-19 23:40:05 +01:00
{
2026-01-13 09:07:44 +01:00
public Dictionary<int, string> CoordinateSystemWkts { get; } = new Dictionary<int, string>
{
{
2100, "PROJCS[\"GGRS87 / Greek Grid\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsGgrs87 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",24],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",0],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"2100\"]]"
},
{
2180, "PROJCS[\"ETRF2000-PL / CS92\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsEtrf2000Pl + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",19],"
+ "PARAMETER[\"scale_factor\",0.9993],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",-5300000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"2180\"]]"
},
{
4647, "PROJCS[\"ETRS89 / UTM zone 32N (zE-N)\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsEtrs89 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",9],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",32500000],"
+ "PARAMETER[\"false_northing\",0],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"4647\"]]"
},
{
29187, "PROJCS[\"SAD69 / UTM zone 17S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-81],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29187\"]]"
},
{
29188, "PROJCS[\"SAD69 / UTM zone 18S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-75],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29188\"]]"
},
{
29189, "PROJCS[\"SAD69 / UTM zone 19S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-69],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29189\"]]"
},
{
29190, "PROJCS[\"SAD69 / UTM zone 20S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-63],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29190\"]]"
},
{
29191, "PROJCS[\"SAD69 / UTM zone 21S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-57],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29191\"]]"
},
{
29192, "PROJCS[\"SAD69 / UTM zone 22S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69_96 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-51],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29192\"]]"
},
{
29193, "PROJCS[\"SAD69 / UTM zone 23S\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsSad69_96 + ","
+ "PROJECTION[\"Transverse_Mercator\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",0],"
+ "PARAMETER[\"central_meridian\",-45],"
+ "PARAMETER[\"scale_factor\",0.9996],"
+ "PARAMETER[\"false_easting\",500000],"
+ "PARAMETER[\"false_northing\",10000000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"29193\"]]"
},
{
3034, "PROJCS[\"ETRS89-extended / LCC Europe\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsEtrs89 + ","
+ "PROJECTION[\"Lambert_Conformal_Conic_2SP\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",52],"
+ "PARAMETER[\"central_meridian\",10],"
+ "PARAMETER[\"standard_parallel_1\",35],"
+ "PARAMETER[\"standard_parallel_2\",65],"
+ "PARAMETER[\"false_easting\",4000000],"
+ "PARAMETER[\"false_northing\",2800000],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"3034\"]]"
},
2026-01-15 21:48:53 +01:00
{
3035, "PROJCS[\"ETRS89-extended / LAEA Europe\","
+ WktConstants.GeoGcsEtrs89 + ","
+ "PROJECTION[\"Lambert_Azimuthal_Equal_Area\"],"
+ "PARAMETER[\"latitude_of_center\",52],"
+ "PARAMETER[\"longitude_of_center\",10],"
+ "PARAMETER[\"false_easting\",4321000],"
+ "PARAMETER[\"false_northing\",3210000]"
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AUTHORITY[\"EPSG\",\"3035\"]]"
},
2026-01-13 09:07:44 +01:00
{
4839, "PROJCS[\"ETRS89 / LCC Germany (N-E)\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsEtrs89 + ","
+ "PROJECTION[\"Lambert_Conformal_Conic_2SP\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",51],"
+ "PARAMETER[\"central_meridian\",10.5],"
+ "PARAMETER[\"standard_parallel_1\",48.6666666666667],"
+ "PARAMETER[\"standard_parallel_2\",53.6666666666667],"
+ "PARAMETER[\"false_easting\",0],"
+ "PARAMETER[\"false_northing\",0],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"4839\"]]"
},
{
5243, "PROJCS[\"ETRS89 / LCC Germany (E-N)\","
2026-01-15 21:48:53 +01:00
+ WktConstants.GeoGcsEtrs89 + ","
+ "PROJECTION[\"Lambert_Conformal_Conic_2SP\"],"
2026-01-13 09:07:44 +01:00
+ "PARAMETER[\"latitude_of_origin\",51],"
+ "PARAMETER[\"central_meridian\",10.5],"
+ "PARAMETER[\"standard_parallel_1\",48.6666666666667],"
+ "PARAMETER[\"standard_parallel_2\",53.6666666666667],"
+ "PARAMETER[\"false_easting\",0],"
+ "PARAMETER[\"false_northing\",0],"
2026-01-15 21:48:53 +01:00
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
2026-01-13 09:07:44 +01:00
+ "AUTHORITY[\"EPSG\",\"5243\"]]"
2026-01-15 21:48:53 +01:00
},
{
21781, "PROJCS[\"CH1903 / LV03\","
+ WktConstants.GeoGcsCh1903 + ","
+ "PROJECTION[\"Hotine_Oblique_Mercator_Azimuth_Center\"],"
+ "PARAMETER[\"latitude_of_center\",46.9524055555556],"
+ "PARAMETER[\"longitude_of_center\",7.43958333333333],"
+ "PARAMETER[\"azimuth\",90],"
+ "PARAMETER[\"rectified_grid_angle\",90],"
+ "PARAMETER[\"scale_factor\",1],"
+ "PARAMETER[\"false_easting\",600000],"
+ "PARAMETER[\"false_northing\",200000],"
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
+ "AUTHORITY[\"EPSG\",\"21781\"]]"
},
{
2056, "PROJCS[\"CH1903 / LV95\","
+ WktConstants.GeoGcsCh1903 + ","
+ "PROJECTION[\"Hotine_Oblique_Mercator_Azimuth_Center\"],"
+ "PARAMETER[\"latitude_of_center\",46.9524055555556],"
+ "PARAMETER[\"longitude_of_center\",7.43958333333333],"
+ "PARAMETER[\"azimuth\",90],"
+ "PARAMETER[\"rectified_grid_angle\",90],"
+ "PARAMETER[\"scale_factor\",1],"
+ "PARAMETER[\"false_easting\",2600000],"
+ "PARAMETER[\"false_northing\",1200000],"
+ "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],"
+ "AXIS[\"Easting\",EAST],"
+ "AXIS[\"Northing\",NORTH],"
+ "AUTHORITY[\"EPSG\",\"2056\"]]"
2026-01-13 09:07:44 +01:00
}
};
2024-07-12 13:57:27 +02:00
2025-09-20 14:01:51 +02:00
public override MapProjection GetProjection(string crsId) => crsId switch
2022-01-19 23:40:05 +01:00
{
2025-09-20 14:01:51 +02:00
MapControl.WebMercatorProjection.DefaultCrsId => new WebMercatorProjection(),
MapControl.WorldMercatorProjection.DefaultCrsId => new WorldMercatorProjection(),
2026-01-15 11:04:11 +01:00
MapControl.Wgs84UpsNorthProjection.DefaultCrsId => new Wgs84UpsNorthProjection(),
MapControl.Wgs84UpsSouthProjection.DefaultCrsId => new Wgs84UpsSouthProjection(),
MapControl.Wgs84AutoUtmProjection.DefaultCrsId => new Wgs84AutoUtmProjection(),
2025-09-20 14:01:51 +02:00
_ => base.GetProjection(crsId)
};
2025-09-20 14:01:51 +02:00
public override MapProjection GetProjection(int epsgCode) => epsgCode switch
2024-07-12 14:14:42 +02:00
{
2025-09-20 14:01:51 +02:00
var code when code >= Ed50UtmProjection.FirstZoneEpsgCode && code <= Ed50UtmProjection.LastZoneEpsgCode => new Ed50UtmProjection(epsgCode % 100),
var code when code >= Etrs89UtmProjection.FirstZoneEpsgCode && code <= Etrs89UtmProjection.LastZoneEpsgCode => new Etrs89UtmProjection(epsgCode % 100),
var code when code >= Nad27UtmProjection.FirstZoneEpsgCode && code <= Nad27UtmProjection.LastZoneEpsgCode => new Nad27UtmProjection(epsgCode % 100),
var code when code >= Nad83UtmProjection.FirstZoneEpsgCode && code <= Nad83UtmProjection.LastZoneEpsgCode => new Nad83UtmProjection(epsgCode % 100),
2026-01-12 19:31:21 +01:00
var code when code >= Wgs84UtmProjection.FirstZoneNorthEpsgCode && code <= Wgs84UtmProjection.LastZoneNorthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, Hemisphere.North),
var code when code >= Wgs84UtmProjection.FirstZoneSouthEpsgCode && code <= Wgs84UtmProjection.LastZoneSouthEpsgCode => new Wgs84UtmProjection(epsgCode % 100, Hemisphere.South),
2026-01-15 11:04:11 +01:00
_ => CoordinateSystemWkts.TryGetValue(epsgCode, out string wkt) ? new ProjNetMapProjection(wkt) : base.GetProjection(epsgCode)
2025-09-20 14:01:51 +02:00
};
2022-01-19 23:40:05 +01:00
}
}