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

TransformList(List

points);

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

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

static void

PtsToPts(ICoordinateSystem fromCS, ICoordinateSystem

toCS,List pts, out

List 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 pts = new

List();

for (int i = 0; i < 4; i++)

{

double[] xy = new double[] { xPts[i], yPts[i] };

pts.Add(xy);

List results = new

List();

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的基本情况,如何创建坐标系,如何在坐标系间进行多个坐标点的转换,满足了最基本的需求。后续会逐步介绍更加深入一点功能。

proj4经纬度bl转换xy_多种坐标系之间的转换之Proj.NET_转载相关推荐

  1. 经纬度坐标系与UTM MGRS坐标系之间的转换 c# 版本

    摘要: 经纬度坐标系与UTM, MGRS坐标系之间的转换代码 c# 原文地址: http://lu.9efish.com/Blog/longitude-latitude-utm-mgrs-csharp ...

  2. 地图坐标系之间的转换(百度地图、GCJ、WGS84)

    文章目录 文章参考 坐标系介绍 常见坐标系 WGS84坐标系(标准的GPS坐标) WGS84 Web墨卡托(平面地图) GCJ02经纬度投影(火星坐标系) GCJ02 Web 墨卡托投影 BD09 经 ...

  3. Python 实现常见的坐标系之间的转换

    常见的一些坐标系之间的转换 话不多说,直接上代码 import mathx_pi = 3.14159265358979324 * 3000.0 / 180.0 pi = 3.1415926535897 ...

  4. 常用的几种在线地图(天地图、百度地图、高德地图)坐标系之间的转换算法

    1.首先弄明白几种在线地图的坐标系: (1)天地图:CGCS2000,2000国家大地坐标系:我们其实很多时候直接用WGS84的坐标来代替CGCS2000坐标.因为CGCS2000的定义与WGS84实 ...

  5. 坐标系转换工具_借助工具实现不同坐标系之间的转换

    在设计院日常工作中避免不了不同坐标系之间矢量数据.栅格数据等的转换,由于涉及到不同的参考椭球可能在某些情况要转换需要额外的参数,实现转换.但是有时候却受限于一些原因需要我们自己进行转换,下面就工作中的 ...

  6. 三维视觉基础之世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

    三维视觉基础之世界坐标系.相机坐标系.图像坐标系和像素坐标系之间的转换关系 一.各坐标系介绍 二.世界坐标系和相机坐标系之间的转换 三.相机坐标系和图像坐标系之间的转换 四.图像坐标系和像素坐标系之间 ...

  7. 相机成像---世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

    新学期第一天开始写的这篇文章,看看我啥时候能把他发出去.假期当然是啥也没干了,之前还信誓旦旦说回家一定能学习,学个毛线.开始学习啦,去年年末把环境配置好了之后,实验发现他不准,用的D435i摄像头是红 ...

  8. html空间坐标系,世界坐标空间与观察坐标系之间的转换

    1.世界坐标空间与观察坐标系之间的转换 已知:观察坐标系相对世界坐标系的u,v,w轴与起点q,将世界坐标系中一点变换到观察坐标系 使用左手坐标系推导 u = ( ux , uy , uz , 0 ) ...

  9. Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

    一 :3d空间坐标系  x,y,z 轴 z轴方向确定有两种方式 左手坐标系和右手坐标系 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向. 右手坐标系:伸开右 ...

最新文章

  1. ETSI MEC — 参考架构模型
  2. 不动产登记进入倒计时 哪些房子必须要卖掉?
  3. DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字
  4. SpringMVC执行流程源码分析
  5. 操作系统原理之进程调度与死锁(三)
  6. 在JAVA中如何跳出当前的多重嵌套循环
  7. ASP.NET下QueryString不同字符编码间强制转换的解决方案
  8. 新经济、新选择——人才流动与迁徙2021
  9. Java I/O系统之OutputStream
  10. 使用SonarQube Scanner for Maven 分析
  11. ArcGIS根据矢量图层范围裁剪影像
  12. 应用软件学习心得之mapgis功能学习
  13. UVA - 1589 Xiangqi (象棋)
  14. 制作3D游戏时如何避免或减轻玩家的晕3D现象?
  15. (个体户)注册公众平台步骤
  16. 【现代机器人学】学习笔记七:开链动力学(前向动力学Forward dynamics 与逆动力学Inverse dynamics)
  17. R 语言怎么保存工作目录到当前路径_第一讲 R基本介绍及安装
  18. php做引流脚本,引流脚本效果极速引流脚本分享
  19. Fluent Meshing分离边界层网格
  20. freeline加速编译

热门文章

  1. 服务端的第六周第二次的课程
  2. HBase基本操作命令整理
  3. hadoop yarn集群HA安装及配置
  4. idea配置Run Dashboard的方法(亲测有效)
  5. Python字符串前加u/r/b的作用
  6. Linux shell变量的命名规范
  7. nginx全局内存缓存
  8. idea安装行号快速定位行快捷键以及设置方法
  9. springmvc @PathVariable注解进行传参操作
  10. Spring 体系结构详解