Используя Mapsui, как мне создать новый класс преобразования для системы координат, считываемой из файла shapefile prj?
Как создать новый класс преобразования, совместимый с интерфейсом MapSui.Projection.ITransformation, используя ProjNet4GeoAPI, который считывает исходную систему координат из файла prj.
Из исходного кода Mapsui есть MinimalTransformation, который реализует интерфейс ITransformation для преобразования между SphericalMercator и WGS84.
Из документации Mapsui: Стандартная поддержка Mapsui для проекций ограничена. Класс MinimalProjection работает только между SphericalMercator (EPSG:3857) и WGS84 (EPSG:4326). Однако возможно создать ваше собственное Преобразование. Вам необходимо реализовать интерфейс ITransformation. В этой реализации вам нужно использовать другую библиотеку проекций. Рекомендованным является ProjNet4GeoAPI.
Я могу создать рабочий класс преобразования с ProjNet4GeoAPI, но он реализует GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation, а не Mapsui.Projection.ITransformation.
// (FROM SOURCE) prj name: NAD_1983_StatePlane_Massachusetts_Mainland_FIPS_2001"
ICoordinateSystemFactory csFac = new ProjNet.CoordinateSystems.CoordinateSystemFactory();
string file = @"C:\DRC_Data\Arcview\USA\Townships\NYTOWNS_POLY.prj";
string wkt= System.IO.File.ReadAllText(file);
var csFrom = csFac.CreateFromWkt(wkt);
//(TO) Prj name: "WGS 84 / Pseudo-Mercator"
file = @"C:\DRC_Data\Arcview\3857.prj";
wkt = System.IO.File.ReadAllText(file);
ICoordinateSystem csTo = csFac.CreateFromWkt(wkt);
//Step 2) Create transformation class.
CoordinateTransformationFactory ctFac = new CoordinateTransformationFactory();
//To 3857
//var is ICoordinateTransformation
ICoordinateTransformation ct = ctFac.CreateFromCoordinateSystems(csFrom, ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator);
Как использовать класс ICoordinateTransformation с Mapsui? Нужно ли создавать класс проекции, например, SphericalMercator, в Mapsui.Projection (см. Код ниже)?
Из Mapsui.Projection:
public class MinimalTransformation : ITransformation
{
private readonly IDictionary<string, Func<double, double, Point>> _toLonLat = new Dictionary<string, Func<double, double, Point>>();
private readonly IDictionary<string, Func<double, double, Point>> _fromLonLat = new Dictionary<string, Func<double, double, Point>>();
public MinimalTransformation()
{
_toLonLat["EPSG:4326"] = (x, y) => new Point(x, y);
_fromLonLat["EPSG:4326"] = (x, y) => new Point(x, y);
_toLonLat["EPSG:3857"] = SphericalMercato.ToLonLat;
_fromLonLat["EPSG:3857"] = SphericalMercator.FromLonLat;
}
Исходный код: https://github.com/garykindel/ShapefileProjectionDemo Использовал пакет nuget Mapsui 2.0.0-beta.22, и я вручную создал Mapsui.desktop.dll из master.
1 ответ
Вы уже выполнили сложную часть, чтобы получить правильную проекцию ProjNet4GeoAPI.
Для вашего собственного класса проекции вы можете скопировать класс MinimalTransformation. Затем добавьте словарные записи для проекций from и to в свою пользовательскую проекцию.
_toLonLat["EPSG:4326"] = (x, y) => new Point(x, y);
_fromLonLat["EPSG:4326"] = (x, y) => new Point(x, y);
_toLonLat["EPSG:3857"] = SphericalMercato.ToLonLat;
_fromLonLat["EPSG:3857"] = SphericalMercator.FromLonLat;
_toLonLat["EPSG:CUSTOM"] = MethodToProjectFromMyCustomProjectionToLonLat;
_fromLonLat["EPSG:CUSTOM"] = MethodToProjectToMyCustomProjectionFromLonLat;
Установите "EPSG:CUSTOM" в CRS источника данных.