`
webcenterol
  • 浏览: 950941 次
文章分类
社区版块
存档分类
最新评论

多种坐标系之间的转换之Proj.NET

 
阅读更多

Proj.NET ( http://www.codeplex.com/ProjNET )是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准。负责人(Coordinators )是D_Guidi 和SharpGIS,开发者(Developers)还有codekaizen、rstuven等,这些人也是.NET下其他的开源系统如GeoAPI.NET、SharpMap等主要贡献者。License: GNU Library General Public License (LGPL).

Proj.NET支持基准面转换,地理坐标系,投影坐标系,地心坐标系,可在多种.NET框架下使用,并支持SilverLight。它可进行点对点之间的坐标变换,同时也可以把坐标系转换为 Well-Known Text (WKT) 和 XML。目前支持投影类型有:Mercator、横轴墨卡托投影(Transverse Mercator)、Albers、正轴等角割圆锥投影(Lambert Conformal Conic、兰勃特投影)等。

目前最新版发布版本是1.0,2007年8月,binaries内含Proj.NET.dll和Proj.NET.XML两个文件,创建程序时引入dll文件,即可使用相关类、函数、接口等。若想深入了解,建议把源码和示例一并下载。下面以实例来注解Proj.NET进行坐标转换的用法。

对地图投影基本概念,如投影参数,坐标系,SRID,WKT等概念不清楚的话,LionGG前面几篇文章都已介绍。理解则有助于阅读下面的示例程序,像我先前一知半解,看着示例修改代码也可以完成你自己的工作。

一个多月前,同学提供投影参数和四个投影坐标,让帮忙转换成经纬度坐标。ArcGIS我玩得不熟练,当时便使用刚接触不久的著名开源投影库proj4解决了问题。这一个月闲散时间主要集中在.NET开源GIS上,看了GeoAPI.NET和Proj.NET,于是顺便用Proj.NET完成同样的工作,两相验证结果。

投影参数:椭球体Krasovsky_1940;Datum:北京1954;投影:兰勃特双标准纬线,25N,47N。
坐标数据: 20634500,4660000; 20635500,466000; 20634500, 4659000;20635500,4659000 。

求经纬度无非就是从自定义投影坐标系转换到WGS1984坐标系反之若求地理坐标则是从WGS84geogCS转换到要求的投影坐标系。首先了解下在Proj.NET创建坐标系的方法: predefined、SRID、WKT、Code。

用预定义方法或SRID创建WGS84地理坐标系:
GeographicCoordinateSystem toCS = GeographicCoordinateSystem.WGS84;
预定义方法,十分简单,但系统预定义坐标系为数不多。
ICoordinateSystem toCS = SridReader.GetCSbyID(4326);
使用SRID也比较容易,前提是引入EPSG的数据集,还有SridReader类文件,在源码中有。不知道什么EPSG什么SRID?参考《SRID、EPSG》。

用WKT或Code创建给定的投影坐标系(写代码时注意转义字符\"和删除换行):
string bj1954Lcc = PROJCS["liongg",
GEOGCS["GCS_Beijing_1954",
DATUM["D_Beijing_1954",SPHEROID["Krasovsky_1940",6378245.0,298.3]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]],
PROJECTION["Lambert_Conformal_Conic"],
PARAMETER["False_Easting",20500000.0],
PARAMETER["False_Northing",0.0],
PARAMETER["Central_Meridian",0.0],
PARAMETER["Standard_Parallel_1",25.0],
PARAMETER["Standard_Parallel_2",47.0],
PARAMETER["Scale_Factor",1.0],
PARAMETER["Latitude_Of_Origin",0.0],
UNIT["Meter",1.0]] ;

不知道什么WKT?比瓢画葫芦,请参考《WKT (Well Known Text)》。然后用下行语句解析为投影坐标系。
IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;

对于用户自定义坐标系,即系统和EPSG没有预设的坐标系,只有通过WKT和Code方式来定义。所谓Code方式即把WKT中的“元素”如DATUM、SPHEROID、UNIT等分别定义,最后组合,何必那么麻烦?就像没必要用WKT方式去创建WGS84地理坐标系一样。

看一下转换多个坐标对的函数原型:List<double[]> TransformList(List<double[]> points);
参数和返回值都是List型,List的每个元素是一个一维double型数组每个一维数组即一个坐标对:两个或三个元素,取决于有没有高程等第三个坐标Z,顺序为(x,y,z)。因此我们需要把给的坐标存储到List中。(不懂泛型?不是吧……)

LionGG写了一个多点到多点的转换函数:参数分别是源坐标系,目标坐标系,要转换的坐标值List,返回的坐标值List。函数内容就不再解释,不精通设计模式?知道工厂模式不至于迷糊就行。

static void PtsToPts(ICoordinateSystem fromCS, ICoordinateSystem toCS,List<double[]> pts, out List<double[]> results)
{
CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(fromCS, toCS);
results = trans.MathTransform.TransformList(pts);
}

下面是主函数,简略起见,命名空间的引用,异常捕捉等省略,并不再注释。

static void Main(string[] args)
{
string bj1954Lcc= "……"; //见上文
IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;
GeographicCoordinateSystem toCS = GeographicCoordinateSystem.WGS84;

double[] xPts = new double[4] { 20634500, 20635500, 20634500, 20635500 };
double[] yPts = new double[4] { 4660000, 4660000, 4659000, 4659000 };

List<double[]> pts = new List<double[]>();
for (int i = 0; i < 4; i++)
{
double[] xy = new double[] { xPts[i], yPts[i] };
pts.Add(xy);

List<double[]> results = new List<double[]>();
PtsToPts(fromCS, toCS, pts, out results);

foreach (double[] result in results)
{
Console.WriteLine("{0},{1}", result[0], result[1]);
}
}

下面是计算结果,可以看出来和使用proj4的计算结果只有精度位数的差异。
118.611065451529,40.4621006468135
118.623041399559,40.4619479215536
118.610866262964,40.4529532936788
118.622840730867,40.4528005852267

proj4是用C写的,很好很强大,我暂且只会简单使用,没看过源代码。Proj4的计算结果:
Beijing 1954: 20634500.0 4660000.00
pj_inv result: 118.611065 40.462077

Beijing 1954: 20635500.0 4660000.00
pj_inv result: 118.623041 40.461924

Beijing 1954: 20634500.0 4659000.00
pj_inv result: 118.610866 40.452929

Beijing 1954: 20635500.0 4659000.00
pj_inv result: 118.622841 40.452777

本文介绍了Proj.NET的基本情况,如何创建坐标系,如何在坐标系间进行多个坐标点的转换,满足了最基本的需求。后续会逐步介绍更加深入一点功能。

分享到:
评论

相关推荐

    最新坐标系转换Proj

    "最新坐标系转换Proj" 提供了最新的投影库,用于处理不同地理坐标系统之间的转换问题。Proj库是一个广泛使用的开源软件,它提供了多种地理坐标变换的算法和工具,确保地理位置数据在不同坐标系间的准确无误。 Proj...

    坐标转换proj4工具

    它提供了多种坐标系统的转换算法,使得开发者可以在不同坐标系之间无缝地转换数据。 Proj4库的核心是其投影参数定义系统,这些参数描述了特定坐标系统的几何特性。它支持WGS84(世界大地测量系统1984)、UTM(统一...

    proj4net.zip

    这个库的主要功能是将点坐标从一个坐标系转换到另一个,同时也支持地心转换,使得在处理地图数据时能够准确无误地进行坐标间的相互操作。Proj4Net的根基在于Proj4J,这是一个Java平台上的类似库,它实现了Proj.4投影...

    C#实现坐标转换,七参数之间进行数据转换

    1. 库和框架:在C#中,可以使用.NET框架提供的空间分析类库,如GeoAPI或者Proj.NET,它们包含了对坐标转换的支持。开发者可以通过调用这些库中的方法,实现七参数转换的计算。 2. 七参数计算:首先需要获取到两个...

    WGS84BJ54两种空间直角坐标系的转换,由空间直角坐标到大地坐标的转换.zip

    在IT领域,尤其是在地理信息系统(GIS)中,坐标系转换是一项关键操作。WGS84和BJ54是两种常用的空间坐标系,它们分别代表了不同的基准和参考框架。本资料包显然关注如何在C#编程环境下实现这两种坐标系之间的转换,...

    C#经纬度坐标与大地坐标相互转换工具

    在IT行业中,尤其是在地理信息...总之,“C#经纬度坐标与大地坐标相互转换工具”是将地理空间数据在不同坐标系之间进行有效转换的关键,涉及到的数学原理、编程技巧以及坐标系统知识都是IT专业人士需要掌握的重要技能。

    坐标转化,坐标转换工具,C#源码.zip

    C#中的坐标转换可以利用.NET Framework或.NET Core提供的空间计算库,如GeoAPI、Proj.NET等。这些库实现了 Proj.4 库的功能,支持多种坐标转换方法,包括七参数布尔沙模型、四参数模型和三参数模型等。 在C#中进行...

    57.(leaflet篇)leaflet高德坐标转天地图坐标(gcj02转大地2000).zip

    在实际应用中,你可能需要将这些转换函数整合到Leaflet的事件处理或图层操作中,确保地图上的标记或图层正确地显示在CGCS2000坐标系的天地图上。 为了更深入地学习和实践,建议参考提供的博客链接...

    openlayer使用方位坐标系显示北极地区

    在OpenLayers中,显示北极地区的地图需要特殊处理,因为常规的经纬度坐标系(WGS84)在极地区域可能会出现扭曲。...同时,理解不同坐标系之间的转换也是至关重要的,这有助于正确解析和显示来自不同来源的数据。

    地理坐标转换 支持各种投影(包含 北京54 西安80等)

    地理坐标转换是地理信息系统(GIS)中的关键技术之一,用于将不同地理坐标系统之间的坐标点进行相互转换,以达到一致的数据表达和处理目的。由于地球是一个不规则的椭球体,不同国家和地区为了适应自己的地理特点及...

    基于C#平台的高斯投影转换源代码

    5. **Proj.NET库**:Proj.NET是一个C#版本的PROJ.4库,它提供了各种地理坐标系之间的转换功能。在源代码中,可能会使用Proj.NET进行坐标系统的定义和转换。 6. **单元测试**:`UnitTests`目录中的文件可能包含了...

    坐标转化,坐标转换工具,C#源码 (1).zip

    坐标转换涉及将坐标从一个坐标系转换到另一个坐标系的过程。本主题主要关注使用C#编程语言实现的坐标转换工具。 C#是一种面向对象的、类型安全的、现代的编程语言,由微软开发并广泛用于Windows应用程序、Web服务...

    c# 7参数转换源代码

    假设`CoordTransfer`是一个处理坐标转换的类或方法,可能涉及到地理坐标系(如WGS84)与平面坐标系(如UTM)之间的转换。这可能需要用到数学公式、特定库(如Proj.NET)或者.NET Framework提供的地理空间服务。理解...

    GDAL11.1C#版本编译后的dll,集成了geo、proj、hdf(本人亲测可用)

    GDAL能够处理不同坐标系统的转换,包括WGS84、UTM、地方坐标系等,这对于地理空间数据的准确分析和展示至关重要。 3. **Proj库集成**:Proj是另一个重要的地理空间库,专注于坐标转换。它提供了大量的投影定义,...

    两点经纬度距离

    这里我们基于.NET环境,探讨如何进行北京54坐标系到其他坐标系(如WGS84)的转换,并计算这两点之间的地理距离。 首先,我们需要理解坐标系的概念。在地球表面定位一个点,我们可以使用经纬度系统,它由经度和纬度...

    编译好的C#版最新gdal-1.11.1(集成GEOS,PROJ,HDF)

    使用PROJ进行坐标系转换,适应全球不同的地理坐标系统;处理HDF格式的大规模科学数据,如地球科学或气候学研究中的遥感数据。总之,GDAL-1.11.1的C#版本为GIS开发提供了一个强大的工具箱,极大地简化了处理地理空间...

    [VB.NET源码]地理信息系统平台

    理解地理坐标系和投影转换是GIS的关键,开发者需要熟悉EPSG(欧洲石油勘测学会)代码和相关的投影算法。 3. 层次管理:GIS平台往往包含多个图层,每个图层对应不同类型的地理信息。VB.NET可以通过集合类来组织和...

    天地图改版后的修改以及google无偏移卫星影像(google卫星影像叠加天地图影像注记).rar

    在IT行业中,地理信息系统(GIS)的使用越来越广泛,其中涉及到地图服务的集成与定制是常见操作之一。本文将深入探讨“天地图改版后的修改”以及...同时,掌握坐标系转换和多源地图服务的集成也是GIS开发者的必备技能。

    为.NET编写GIS和制图软件

    7. **开源GIS库**:可能涉及到与开源GIS库如GDAL/OGR、Proj.NET等的集成,用于数据读取和投影转换。 8. **Visual Studio IDE**:使用VS2005、VS2008等版本的开发工具进行项目构建和调试,它们提供了强大的代码编辑...

    64位C#版本的GDAL最新编译文件以及注册文件

    GDAL通常与PROJ结合使用,以处理不同坐标系之间的转换问题。 在实际应用中,有了这些文件,C#开发者就可以在项目中引入GDAL,进行地图数据的读取、写入、投影转换、栅格和矢量数据的操作等工作。例如,你可以创建一...

Global site tag (gtag.js) - Google Analytics