使用 Mapsui,如何为从 shapefile prj 文件读取的坐标系创建一个新的转换 class?
Using Mapsui, how do I create a new transformation class for coordinate system read from shapefile prj file?
如何使用从 prj 文件读取源坐标系的 ProjNet4GeoAPI 创建与 MapSui.Projections.ITransformation 接口兼容的新转换 class。
从Mapsui源码中,有一个MinimalTransformation实现了ITransformation接口,实现了SphericalMercator和WGS84之间的转换。
From Mapsui documentation :
开箱即用的 Mapsui 对投影的支持是有限的。 MinimalProjection class 仅在 SphericalMercator (EPSG:3857) 和 WGS84 (EPSG:4326) 之间投影。但是,可以创建自己的转换。您需要实现 ITransformation 接口。在此实现中,您需要使用其他一些投影库。推荐的是 ProjNet4GeoAPI.
我可以使用 ProjNet4GeoAPI 创建一个有效的转换 class,但它实现的是 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\Arcview57.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 class?
我是否在 Mapsui.Projection 中创建像 SphericalMercator 这样的投影 class
(见下面的代码)?
来自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 包,我从 master.
手动构建 Mapsui.desktop.dll
您已经完成了使 ProjNet4GeoAPI 投影正确的困难部分。
对于您自己的投影 class,您可以复制 MinimalTransformation class。然后将“从”和“到”投影的字典条目添加到您的自定义投影中。
_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"。
如何使用从 prj 文件读取源坐标系的 ProjNet4GeoAPI 创建与 MapSui.Projections.ITransformation 接口兼容的新转换 class。
从Mapsui源码中,有一个MinimalTransformation实现了ITransformation接口,实现了SphericalMercator和WGS84之间的转换。
From Mapsui documentation : 开箱即用的 Mapsui 对投影的支持是有限的。 MinimalProjection class 仅在 SphericalMercator (EPSG:3857) 和 WGS84 (EPSG:4326) 之间投影。但是,可以创建自己的转换。您需要实现 ITransformation 接口。在此实现中,您需要使用其他一些投影库。推荐的是 ProjNet4GeoAPI.
我可以使用 ProjNet4GeoAPI 创建一个有效的转换 class,但它实现的是 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\Arcview57.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 class? 我是否在 Mapsui.Projection 中创建像 SphericalMercator 这样的投影 class (见下面的代码)?
来自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 包,我从 master.
手动构建 Mapsui.desktop.dll您已经完成了使 ProjNet4GeoAPI 投影正确的困难部分。
对于您自己的投影 class,您可以复制 MinimalTransformation class。然后将“从”和“到”投影的字典条目添加到您的自定义投影中。
_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"。