Proj.Net是开源地图投影库Proj.4的.net版本,许多GIS开源软件的投影都直接或间接地使用Proj.4的库,Proj.4是用C语言编写。.Net下的开源GIS项目NetTopologySuite中开发维护最新版的Proj.Net项目,地址地址是:https://github.com/NetTopologySuite/ProjNet4GeoAPI
 
一、空间坐标系的概念
 
空间中的某一个位置,通常是由一个坐标来表示,坐标和位置要想正确对应起来,则必须了解该坐标的坐标系是如何定义的,坐标系在有些软件中也称为空间参考(SpatialReference)。地图的每个坐标都必须知道其坐标系的定义方法,一幅地图中各图层或者各要素的数据,必须是在同一坐标系或者转化为同一个坐标系下,才能直接进行运算,比如计算面积,距离,或者判断空间关系等。空间坐标系的相关概念有大地水准面、参考椭球体、基准面、地理坐标系、投影坐标系等。
 
大地水准面(geoid):静止的平均海水面及其向陆地延伸后组成的封闭曲面,称为大地水准面,是一个不规则形状。大地水准面是对地球形状的最底层的描述,在大地水准面上,每一处的重力方向均与大地水准面垂直。大地水准面没有准确的数学公式。
 
参考椭球体(ellipsoid):将大地水准面用一个规则的椭球面进行拟合,该椭球体用长半轴、短半轴和扁率三个参数中的两个来表示。由于测量方法的不同,会有不同的参考椭球体的参数,北京54坐标系使用的是Krassovsky 1940椭球体,西安80坐标系使用的是IAG 75椭球体,GPS坐标使用的是WGS 1984椭球体。
 
基准面(datum):在参考椭球体的基础上,定义椭球体相对于地心的位置。基准面可分为地心基准面和区域基准面,地心基准面椭球体的中心位于地心(地球的质心),最广泛的基准是 WGS 1984,被用作在世界范围内进行定位测量。局域基准面是在特定区域内与地球表面极为吻合,椭球体表面上的某一点与地球表面上的特定点相匹配,该点称作基准面的原点,54坐标系基准面原点在前苏联的普尔科沃,80坐标系基准面原点在西安。
 
地理坐标系(GeographicCoordinateSystem):是一种球面坐标系,在基准面的基础上,加上本初子午线(原点的位置)、坐标轴方向(x方向向东为正,y方向向北为正)、坐标单位(角度还是弧度)的定义。地理坐标系下的坐标就是我们常见的经纬度坐标。
 
投影坐标系(ProjectedCoordinateSystem):是基于平面的坐标系(二维平面坐标),在地理坐标系的基础上,加上投影方法、参数、坐标轴方向和坐标单位的定义。
 
二、Proj.Net中创建坐标系的方法
 
Proj.NET支持基准面转换,地理坐标系,投影坐标系,地心坐标系,可在多种.NET框架下使用,并支持SilverLight。它可进行点对点之间的坐标变换,同时也可以把坐标系转换为 Well-Known Text (WKT) 和 XML。目前支持投影类型有:Mercator、横轴墨卡托投影(Transverse Mercator)、Albers、正轴等角割圆锥投影(Lambert Conformal Conic、兰勃特投影)等。
 
2.1 手工代码创建:
 
首先初始化一个工厂对象用来创建坐标系的相关对象:
  1. var cFac = new CoordinateSystemFactory();

1) 创建参考椭球体

  1. var ellipsoid = cFac.CreateFlattenedSphere("Bessel 1840", 6377397.155, 299.15281, LinearUnit.Metre);

2) 创建基准面

  1. var datum = cFac.CreateHorizontalDatum("Bessel 1840", DatumType.HD_Geocentric, ellipsoid, null);
3) 创建地理坐标系
  1. var gcs = cFac.CreateGeographicCoordinateSystem(
  2. "Bessel 1840", // 自定义名称
  3. AngularUnit.Degrees,
  4. datum,
  5. PrimeMeridian.Greenwich,
  6. new AxisInfo("Lon", AxisOrientationEnum.East),
  7. new AxisInfo("Lat", AxisOrientationEnum.North)
  8. );
4) 创造投影坐标系
  1. // 投影参数
  2. var parameters = new List<ProjectionParameter>(5);
  3. parameters.Add(new ProjectionParameter("latitude_of_origin", 0));
  4. parameters.Add(new ProjectionParameter("central_meridian", 110));
  5. parameters.Add(new ProjectionParameter("scale_factor", 0.997));
  6. parameters.Add(new ProjectionParameter("false_easting", 3900000));
  7. parameters.Add(new ProjectionParameter("false_northing", 900000));
  8.  
  9. // 投影定义
  10. var projection = cFac.CreateProjection(
  11. "MercatorProjection", // 自定义名称
  12. "Mercator_1SP", // 系统可识别的投影方法名称
    parameters
  13. );
  14.  
  15. // 投影坐标系
  16. var pcs= cFac.CreateProjectedCoordinateSystem(
  17. "Makassar / NEIEZ", // 自定义名称
    gcs,
    projection,
    LinearUnit.Metre,
  18. new AxisInfo("East", AxisOrientationEnum.East),
  19. new AxisInfo("North", AxisOrientationEnum.North)
    );
5) 项目中预置的常用坐标系
  1. var centricCS = GeocentricCoordinateSystem.WGS84; // 地心坐标系
  2. var geoCs = GeographicCoordinateSystem.WGS84; // 地理坐标系
  3. var webMercator = ProjectedCoordinateSystem.WebMercator; // WebMercator投影坐标系
  4. var utm33 = ProjectedCoordinateSystem.WGS84_UTM(33, true); // UTM投影坐标系
2.2 根据WKT字符串创建
 
将描述一个坐标系所需要各种数据,按照GIS标准化组织所规定的格式,用字符串的形式来进行表达,该字符串就是表示该坐标系的wkt字符串,比如我国100万地形图所采用的地图投影是双标准纬线等角圆锥投影,其wkt字符串如下: 
 
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字符串,创建其对应的坐标系的代码如下:
  1. var pcs = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;

2.3 根据SRID文件创建

 
为记录和保存各种常用的坐标系,将wkt字符串中的各部分内容进行分解,以然后以表格的形式存入到SRID.csv文件中,表格中一行代表一种坐标系的定义,并由GIS标准化组织对每种坐标系进行了统一的编号和命名,我们可以根据编号即可创建其相应的坐标系。
  1. var cs = SRIDReader.GetCSbyID(4326);
三、投影类型与应用场合
 
前面已经介绍,投影坐标系是在地理坐标系的基础上,加上投影方法、参数、坐标轴方向和坐标单位等来进行定义的。其中最重要的是投影方法和参数,投影方法是指我们采用哪一种数学公式,将经纬度坐标转换为平面坐标,参数是确定投影方法后,需要设置其投影参数,不同的参数设置,可以满足不同地区数据的需要。
 
Proj.Net中通用的投影参数有5个,各自的含义如下:
central_meridian:中央经线(投影中心点经度)
latitude_of_origin:投影中心点纬度
scale_factor:比例系数
false_easting:东伪偏移(原点在新坐标系中的x值)
false_northing:北伪偏移(原点在新坐标系中的y值)
 
另外不同的投影方法,还有自己所特有的投影参数,在后面投影方法中具体介绍。
 
Proj.Net目前最新版本支持的投影方法有11种,在项目中由11个类来表示,分别是:Mercator、 PseudoMercator、 TransverseMercator、 AlbersProjection、 LambertConformalConic2SP、 ObliqueStereographicProjection、 KrovakProjection、 PolyconicProjection、 CassiniSoldnerProjection、 HotineObliqueMercatorProjection和ObliqueMercatorProjection,在创建投影坐标系时,需要指定投影方法名称,系统根据投影方法名称来查找对应的投影类,一个投影类可能对应多个投影方法名称,下面依次介绍其使用方法和场合。
 
3.1 Mercator(墨卡托投影)
墨卡托投影是等角正轴圆柱投影,投影后经纬线为互相正交的平行直线。该投影在航海航空应用很广,使用该投影,等角航线在地图上是一条直线。该投影方法名称为mercator、mercator_1sp和mercator_2sp均对应该类。mercator_1sp为切圆柱投影、mercator_2sp为割圆柱投影。投影方法名称mercator_1sp有5个通用参数(SRID.cvs中没有找到mercator和mercator_2sp的投影)
 
3.2 PseudoMercator(伪墨卡托投影)
伪墨卡托投影,又称为Web Mercator ,这个坐标系统是 Google Map 最先使用的,或者更确切地说,是Google 最先发明的。在投影过程中,将表示地球的参考椭球体近似的作为正球体处理(正球体半径 R = 椭球体半长轴 a),然后使用等角正轴切圆柱投影。使用该投影,纬度-85度(近似值)至85度的区域在投影平面上是一个正方形。该投影方法名称可以是pseudo-mercator、popular_visualisation pseudo-mercator或者google_mercator。
这个坐标系的ID经历了曲折的过程,好多做Web开发的朋友都感到困惑。简单地顺一下: OpenLayers:900913 由于得不到官方的认证ID,Google为Web Mercator 任性地制定了这个ID,google=900913
EPSG:3785 这是 EPSG 在 2008 年给 Web Mercator 设立的WKID,但是这个坐标系的基准面是正圆球,不是WGS 1984。 存在了一段时间后被弃用。
EPSG:3857 EPSG为 Web Wercator 最终设立的WKID,也就是现在我们常用的Web 地图的坐标系,并且给定官方命名 “WGS 84 / Pseudo-Mercator“。
ESRI:102113 Esri内部使用ID,与 EPSG:3785 相应。已被弃用。
ESRI:102100 Esri内部使用ID,与 EPSG:3857 相应。
 
3.3 TransverseMercator(横轴墨卡托投影)
横轴墨卡托投影(Transverse Mercator)墨卡托投影类似,不同之处在于圆柱沿经线而不是沿赤道相切。通过这种方法生成的等角投影不会保持真实的方向。该投影是把地球看作半径=R的球,如果把地球看作椭球即为通用横轴墨卡托投影或高斯-克吕格投影。该投影等高圈和垂直圈互相正交,经纬线为曲线。墨卡托投影因其经线为平行直线,便于显示时区划分,如时区图、航空图、航海图等。
通用横轴墨卡托投影(Universal Transverse Mercator) (UTM):通用横轴墨卡托坐标系是对横轴墨卡托投影的专门化应用。地球被分为 60 个区域,每个区域所跨经度为 6 度。已被许多国家作为地形图的数学基础。一般从南纬度80到北纬度84度的范围内使用该投影, 对于两极地区则采用UPS投影(通用球面极投影)。
高斯-克吕格投影(Gauss-Krüger):此投影与墨卡托投影类似,不同之处在于圆柱沿经线而不是沿赤道相切。通过这种方法生成的等角投影不会保持真实的方向。高斯-克吕格(GAUSS-KRUGER)是等角横切椭圆柱投影。该投影以中央经线和赤道投影后为坐标轴,中央经线长度比=1。该投影将地球划分为60个投影带,每带经差为6度,已被许多国家作为地形图的数学基础。一般从南纬度80到北纬度84度的范围内使用该投影。 对于两极地区则采用UPS投影(通用球面极投影)。高斯-克吕格投影通常投影带为6度范围或3度,超过了6度后变形会增大。一般常用来制作大比例尺的地图投影,如1/50万、1/10万、1/5万、1/1万等。
投影方法名为transverse_mercator,5个通用参数
 
3.4 AlbersProjection(亚尔勃斯投影)
亚尔伯斯等积圆锥投影(Albers equal area conic) 即为双标准纬线投影,也即正轴等面积割圆锥投影。该投影经纬网的经线为辐射直线,纬线为同心圆圆弧。亚尔伯斯等积圆锥投影的应用在编制一些行政区划图,人口地图,地势图等方面应用较广。如中国地势图,即是以Q1=25度,Q2=45度的亚尔伯斯等积圆锥投影。这种圆锥投影使用两条标准纬线,相比使用一条标准纬线的投影可在某种程度上减少变形。标准纬线之间的形状和线性比例变形最小。
投影方法名为albers、 albers_conic_equal_area。
albers_conic_equal_area的参数为:standard_parallel_1、standard_parallel_2、latitude_of_origin、longitude_of_center、false_easting、false_northing
 
3.5 LambertConformalConic2SP(兰勃特投影)
兰伯特等角圆锥投影是最适用于中纬度的一种投影。其类似于亚尔勃斯等积圆锥投影,不同之处在于兰勃特等角圆锥投影描绘形状更准确。兰伯特等角圆锥投影也称兰勃特正形圆锥投影,该投影的微分圆投影后仍为圆形。经线为辐射直线,纬线为同心圆圆弧。指定两条标准纬度线Q1,Q2,在这两条纬度线上没有长度变形,即M=N=1。此种投影也叫等角割圆锥投影,可用来编制中,小比例尺地图。我国的分省图,即为两条标准纬度线为Q1=25度,Q2=45度的兰伯特等角圆锥投影。1962年以后,百万分一地图采用了等角圆锥投影,极区附近,采用等角方位投影(极球面投影)。
投影方法名为lambert_conformal_conic、lambert_conformal_conic_2sp、LambertConformalConic2SP
SRID.cvs中有Lambert_Conformal_Conic_1SP,具有5个通用参数
Lambert_Conformal_Conic_2SP的参数为:standard_parallel_1、standard_parallel_2、latitude_of_origin、central_meridian、false_easting、false_northing
 
3.6 ObliqueStereographicProjection(斜球面投影)
Proj.Net 1.3.2以上版本支持该投影。此投影为等角方位投影,最适合的地区是两极地区,投影中心点在北极或者南极时(latitude_of_origin参数值为90或者-90),称为极球面投影(Polar stereographic)。通用极球面投影(Universal Polar Stereographic) (UPS)是美国于1948年设计的专用地形图投影,用于南北纬80°以上地区。UPS的投影平面割椭球于81度纬线圈(scale_factor参数值为0.994),central_meridian参数为0,false_easting和false_northing参数均为2000000
 
3.7 KrovakProjection(Krovak投影)
Krovak 投影是一种斜兰勃特等角圆锥投影,专为前捷克斯洛伐克而设计。
 
3.8 PolyconicProjection(多圆锥投影)
多圆锥投影(Polyconic):此投影的名称可理解为“许多圆锥”,也指出了投影方法。
普通多圆锥投影(ordinary polyconic projection):普通多圆锥投影的经线为对称于中央经线和赤道的曲线,纬线投影为同轴圆圆弧,弧 心位于中央直径线上,中央经线是直线,M=1,纬线与中央经线正交,N=1.该投影适用于沿中央经线延伸的区域(15度范围内)。常用于编制中、小比例尺的数学基础。该投影在美国被广泛应用,是百万分一地图投影的基础。
 
3.9 CassiniSoldnerProjection(卡西尼-斯洛德投影)
卡西尼-斯洛德投影(Cassini-Soldner):沿中央子午线及与其平行的所有线方向,该横轴圆柱投影的比例保持不变。此投影既不是等积投影也不是等角投影。
 
3.10 HotineObliqueMercatorProjection(洪特尼斜轴墨卡托投影)
洪特尼斜轴墨卡托投影(Hotine Oblique Mercator):此投影是沿斜轴旋转墨卡托投影所得的投影,开发该投影的目的是针对既不朝南北方向也不朝东西方向,而是方向倾斜的区域绘制等角地图。
 
3.11 ObliqueMercatorProjection(斜轴墨卡托投影)
空间斜轴墨卡托投影(Space Oblique Mercator):对于此投影,在轨道地图绘制卫星(如,美国陆地资源卫星)的探测范围内形状几乎保持不变,且几乎不发生比例变形。

Proj.Net 投影介绍的更多相关文章

  1. Proj.4库的编译及使用

    Proj.4库的编译及使用 Proj.4是开源GIS最著名的地图投影库,GRASS GIS, MapServer, PostGIS, Thuban, OGDI, Mapnik, TopoCad, GD ...

  2. PCL滤波介绍(2)

    (1)使用statisticalOutlierRemoval滤波器移除离群点 使用统计分析技术,从一个点云数据中集中移除测量噪声点(也就是离群点)比如:激光扫描通常会产生密度不均匀的点云数据集,另外测 ...

  3. GDAL编译(转)

    一.简单的编译 1.使用VisualStudio IDE编译 首先进入GDAL的源代码目录,可以看到有几个sln为后缀的文件名,比如makegdal10.sln,makegdal80.sln,make ...

  4. PostgreSQL+PostGIS的使用 函数清单

    一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...

  5. PostgreSQL+PostGIS 的使用

    一.PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Features”类型,同时在此基础上扩展了对3DZ.3DM.4D坐标的支持. 1. OGC的WKB和WKT格式 OG ...

  6. 地图投影与ArcGIS坐标系转换

    1. 通常GIS项目涉及到的坐标系 (1)面向局部区域的大比例尺二维平面:高斯投影(横轴墨卡托) 说明:在市一级的小范围区域的GIS系统,比如规划局.国土局.建设局的系统,大都使用高斯投影,以便与地方 ...

  7. 徒手打造基于Spark的数据工厂(Data Factory):从设计到实现

    在大数据处理和人工智能时代,数据工厂(Data Factory)无疑是一个非常重要的大数据处理平台.市面上也有成熟的相关产品,比如Azure Data Factory,不仅功能强大,而且依托微软的云计 ...

  8. 介绍Unity中相机的投影矩阵与剪切图像、投影概念

    这篇作为上一篇的补充介绍,主要讲Unity里面的投影矩阵的问题: 上篇的链接写给VR手游开发小白的教程:(三)UnityVR插件CardboardSDKForUnity解析(二) 关于Unity中的C ...

  9. 使用Proj库进行大地坐标转空间坐标、投影坐标的一个示例

    最近研究了proj库的使用,自己写了一个小demo,仅供参考. void demoPROJ() { const char* wgs84 = "+proj=tmerc +ellps=WGS84 ...

随机推荐

  1. TCP/IP Http 和Https socket之间的区别

    TCP/IP Http 和Https  socket之间的区别 TCP/IP是个协议组,它分为网络层,传输层和应用层, 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议.   ...

  2. git merge 撤销与git 回滚

    git merge提交后恢复 http://blog.psjay.com/posts/git-revert-merge-commit/ git回滚 https://www.jianshu.com/p/ ...

  3. 创建ndarray

    Numpy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器,是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的. 创建数组最简单的方法就 ...

  4. Struts标签库详解【3】

    struts2标签库详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri= ...

  5. jsp页面日期格式不正确

    第一种: 如果是从数据库获取的时间(数据库中日期格式是乱的)可以在数据库取数据时   进行格式化   例如  ;TO_CHAR(SYSDATE,'YYYY-MM-DD') 第二种: 在数据库取出数据后 ...

  6. 出现“Unable to resolve target 'android-XXX'”怎么处理?

    这句话的中文意思就是说安卓API版本没有能适配22的,需要将sdk更新一下,必要的话,adt都要跟着更新,但就我尝试来看,还是要先更新adt,然后您或许发现,这个表单好不容易刷出来,但是没有我们想要的 ...

  7. python函数调用的四种方式 --基础重点

    第一种:参数按顺序从第一个参数往后排#标准调用 # -*- coding: UTF-8 -*- def normal_invoke(x, y): print "--normal_invoke ...

  8. 微信小程序开发之formId使用(模板消息)

    基于微信小程序的模板消息:基于微信的通知渠道,我们为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验.模板推送位置:服务通知模板下发条件:用户本人在微信体系内与页面有交互 ...

  9. 【转】linux系统中如何进入退出vim编辑器,方法及区别

    在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了. 偶有小白,刚接触linux,要修改某个文本文件,不可能像WINDOWS那样操作,更有甚者,进入VI编辑器后,无法退出以致 ...

  10. 【原】用Java编写第一个区块链(二)

    这篇文章将去介绍如何使用区块链进行交易. [本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔] 目标: 在上一篇文章中,我们已经创建了一个可信任的区块链.但是目前所创建的链中包含的有 ...