Используя Mapsui, как мне создать новый класс преобразования для системы координат, считываемой из файла shapefile prj? - PullRequest
0 голосов
/ 21 марта 2019

Как создать новый класс преобразования, совместимый с интерфейсом 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 Используется Mapsui 2.0.0-beta.22 пакет nuget, и я вручную собрал Mapsui.desktop.dll из master.

1 Ответ

1 голос
/ 21 марта 2019

Вы уже выполнили сложную часть, чтобы получить правильную проекцию 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 источника данных.

...