首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Mapsui为从shapefile prj文件读取的坐标系创建新的转换类?

如何使用Mapsui为从shapefile prj文件读取的坐标系创建新的转换类?
EN

Stack Overflow用户
提问于 2019-03-21 08:58:57
回答 1查看 399关注 0票数 0

如何使用ProjNet4GeoAPI创建与MapSui.Projections.ITransformation接口兼容的新转换类,以便从prj文件中读取源坐标系统。

Mapsui源代码中有一个MinimalTransformation,它实现了在SphericalMercator和WGS84之间进行转换的ITransformation接口。

From Mapsui documentation:Mapsui对预测的开箱即用支持是有限的。MinimalProjection类仅在SphericalMercator (EPSG:3857)和WGS84 (EPSG:4326)之间投影。但是,您可以创建自己的转换。您需要实现ITransformation接口。在此实现中,您需要使用其他一些投影库。推荐使用ProjNet4GeoAPI

我可以使用ProjNet4GeoAPI创建一个有效的转换类,但它实现的是GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation,而不是Mapsui.Projection.ITransformation

代码语言:javascript
复制
            // (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);

如何在Mapsui中使用ICoordinateTransformation类?我是否要在Mapsui.Projection中创建一个像SphericalMercator这样的投影类(参见下面的代码)?

来自Mapsui.Projection:

代码语言:javascript
复制
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使用Mapsui2.0.0-beta.22Nuget包,我从master手动构建Mapsui.desktop.dll。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-21 16:58:14

您已经完成了最困难的部分,即正确地进行ProjNet4GeoAPI投影。

对于您自己的投影类,您可以复制MinimalTransformation类。然后将from和to投影的字典条目添加到您的自定义投影中。

代码语言:javascript
复制
            _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;

在数据源的CRS上设置"EPSG:CUSTOM“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55272284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档