在接触这部分内容前,应该对空间参考(Spatial Reference)、大地水准面基准面(datum)、地图投影(map projection)、地理坐标系(Geographic Coordinate System)和投影坐标系(Projeetion coordinate system)有一定了解。OGRSpatialReference类和OGRCoordinateTransformation类主要用来提供定义坐标系统(投影和水准面)和转换坐标。这两个类都基于OpenGIS的坐标转换说明,并且使用Well Known Text格式来进行表述坐标系统。下面分为几个步骤来说明如何实现不同坐标系之间的转换:

1、定义地理坐标系

一个地理坐标系统需要包含的信息有一个大地基准面(里面含有一个使用长半轴和扁率的倒数来表示的托球体),一个中央经线(通常是本初子午线,也就是0度经线Greenwich), 此外还有一个角度的度量单位,使用度而不是弧度。如果含有这些信息,就可以构造一个有效的地理坐标系统。

OGRSpatialReference oSRS;
oSRS.SetGeogCS( "Mygeographic coordinate system","WGS_1984","My WGS84 Spheroid",SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING,"Greenwich", 0.0,"degree", SRS_UA_DEGREE_CONV );

在上面的代码中,名称为“My geographic coordinate system”,“My WGS84 Spheroid”,“Greenwich”和“degree”的并不是关键词,这些主要是用来给用户进行说明的。然而,“WGS_1984”是一个定义大地基准的关键词,注意:这里的大地基准必须是一个有效的大地基准!(这句话的意思,前面的那些字符串就是随便指定的,用来显示的,后面的WGS_1984这个位置的字符串,必须是一个有效的,不能随便命名,具体后面会说到)。

也可以用OGRSpatialReference自带的一些标识符来进行建立一个常用的坐标系统,比如:“NAD27”、“NAD83”,“WGS72”和“WGS84”等。

oSRS.SetWellKnownGeogCS( "WGS84" );

也可以用EPSG数据库中含有的地理坐标系统编码(GSC code)定义坐标系:

oSRS.SetWellKnownGeogCS( "EPSG:4326" );

为了方便和其他库进行交互,OGRSpatialReference提供了可以和OpenGIS的WKT格式的相互转换的函数。OGRSpatialReference可以使用一个WKT格式文件来进行初始化,也可以将坐标系的信息导出为WKT格式。

char *pszWKT = NULL;oSRS.SetWellKnownGeogCS( "WGS84" );oSRS.exportToWkt( &pszWKT );printf( "%s\n", pszWKT );

打印出的结果如下:

GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]

可以利用OGRSpatialReference::importFromWkt()函数来定义OGRSpatialReference对象。

2、定义投影坐标系

一个投影坐标系统(比如UTM,兰伯特等角圆锥投影等)需要建立在一个地理坐标系统之上,在投影坐标系统中,坐标点使用米或者英尺等长度单位来表示,同时也可以用经纬度的角度坐标来表示。下面将定义一个UTM的第17带的投影坐标系统,基于WGS84的大地基准椭球体。

/** SetProjCS()设置投影坐标系的名称* SetWellKnownGeogCS()设置地理坐标系* SetUTM()设置投影变换参数*/OGRSpatialReference oPGS;oPGS.SetProjCS( "UTM 17 (wgs84) in northern hemisphere" );oPGS.SetWellKnownGeogCS( "WGS84" );oPGS.SetUTM( 17, TRUE );//打印oPGS.exportToWkt( &pszWKT);printf( "%s\n", pszWKT);

说明:(1)首先调用SetProjCS()函数设置投影坐标系统的名称,然后使用函数SetWellKnownGeogCS()指定地理坐标系统,最后调用函数SetUTM()设置投影转换参数信息。完成这些工作之后就定义了一个有效的投影坐标系统。这里必须要注意定义OGRSpatialReference的顺序!

(2)当然OGRSpatialReference不止提供SetUTM()这一种方法,设置横轴墨卡托投影参数可以使用SetTM()函数;设置兰勃特投影参数使用SetLCC()函数;设置墨卡托投影参数使用SetMercator()函数。

3、解析坐标系

当OGRSpatialReference对象被创建时,就可以解析该对象所包含的信息。可以使用OGRSpatialReference提供的IsProjected()和IsGeographic() 函数分别判别投影坐标系或地理坐标系是否建立,GetSemiMajor()、GetSemiMinor() 和GetInvFlattening()函数分别获取椭球体的长半轴、短半轴以及扁率的倒数。GetAttrValue()获取PROJCS、GEOGCS、DATUM、SPHEROID和PROJECTION名称的字符串。 GetProjParm()函数获取投影的参数信息。GetLinearUnits()函数获取单位类型,并且转换为单位米。

OGRSpatialReference oPGS;
oPGS.SetWellKnownGeogCS( "WGS84" );
std::cout<< "SemiMajor->" << oPGS.GetSemiMajor() << std::endl;
std::cout<< "SemiMinor->" << oPGS.GetSemiMinor() << std::endl;
std::cout<< "InvFlattening->" << oPGS.GetInvFlattening() << std::endl;

4、坐标转换

OGRCoordinateTransformation类可以用来在不同的坐标系统中进行坐标转换。可以使用函数OGRCreateCoordinateTransformation()创建一个新的坐标转换对象,然后使用OGRCoordinateTransformation::Transform()方法来进行坐标转换。

//Transform()的函数原型
virtual int OGRCoordinateTransformation::Transform (int  nCount,double *  x,double *  y,double *  z = NULL
)
//对于这四个参数:nCount表示要转换点的个数;x,y,z应该分别是三维坐标点的三个值,z可以为NULL,表示只转换水准面上的点。不考虑高程值。

(1)下面是WGS84与Xian 1980/Gauss-Kruger zone 13之间转换的测试代码:

OGRSpatialReference oSourceSRS, oTargetSRS;OGRCoordinateTransformation *poCT;double                  x, y;oSourceSRS.importFromEPSG( 4326 );//WGS84oTargetSRS.importFromEPSG( 2327 );//Xian 1980/Gauss-Kruger zone 13poCT = OGRCreateCoordinateTransformation( &oSourceSRS,&oTargetSRS );x = 10.0;y = 10.0;if ( poCT == NULL || !poCT->Transform( 1, &x, &y ))printf( "Transformation failed.\n" );elseprintf( "(%f,%f) -> (%f,%f)\n",10.0,10.0,x, y );

运行结果: 
(10.000000,10.000000) -> (4381699.110753,2447192.109090)

关于代码中importFromEPSG函数的EPSG代号,可以点击这里查看,或者点我呀也可以查看。

(2)该函数还可以对三维点进行转换,根据不同的椭圆球及基准面自动调整高程值。如果没有Z值,OGR则假设转换的点都是在水准面上。接下来的代码演示了地理坐标系与投影坐标系之间的转换。

OGRSpatialReference    oUTM, *poLatLong;OGRCoordinateTransformation *poTransform;oUTM.SetProjCS( "UTM 17 / WGS84" );oUTM.SetWellKnownGeogCS( "WGS84" );oUTM.SetUTM( 17 );poLatLong = oUTM.CloneGeogCS();poTransform = OGRCreateCoordinateTransformation( &oUTM, poLatLong );double x, y, z;x = 0.0;y = 0.0;z = 50.0;if ( poTransform == NULL || !poTransform->Transform( 1, &x, &y, &z ) )printf( "Transformation failed.\n" );else{printf( "(%f,%f,%f) -> (%f,%f,%f)\n",0.0,0.0,50.0,x, y, z );}

运行结果: 
(0.000000,0.000000,50.000000) -> (-85.488744,0.000000,50.000000)

本文主要参考:https://blog.csdn.net/u010670734/article/details/53134365

https://blog.csdn.net/u010670734/article/details/53144869

https://blog.csdn.net/liminlu0314/article/details/7599989

使用GDAL实现坐标转换相关推荐

  1. 【C++】GDAL读取HDF数据

    (45条消息) VS2019c++配置GDAL和HDF库新手入门_程程gg酱的博客-CSDN博客_gdal vs2019 (45条消息) 使用GDAL获取HDF等数据集中的图像_箜_Kong的博客-C ...

  2. 基于VS2017编译配置GDAL教程

    源代码下载 git clone https://github.com/OSGeo/gdal.git PROJ安装配置 GDAL3.0以上版本必须依赖于PROJ库(6.0以上版本),因此需要在编译前安装 ...

  3. 三种开源库实现GIS坐标转换

    1 Proj.4 通过坐标系proj4字符串创建projPJ类型坐标系,调用pj_transform函数实现. 其中坐标系proj4字符串可在PROJ4-data文件夹中的epsg文件中搜索得到. d ...

  4. 使用GDAL进行RPC坐标转换

    使用GDAL进行RPC坐标转换 对于高分辨率遥感卫星数据而言,目前几乎都提供了有理函数模型(RFM)来进行图像校正(SPOT系列提供了有理函数模型之外还提供了严格轨道模型).对遥感影像进行校正目前最常 ...

  5. gdal坐标转换总结(转换)

    转自https://blog.csdn.net/qq_32657025/article/details/80176520 首先,在进行坐标转换之前,有必要先了解一下有关坐标系的几个基本概念. 地理坐标 ...

  6. 经纬度定义、经纬度格式、GDAL中地理坐标转换及地理坐标屏幕显示

    一直在做遥感图像处理的东西,多是一些数字图像处理的分类算法,忘了自己竟是学地学这块的,现在连基本的经纬线都忘了,真是惭愧!现补充如下,以备后用. 关于经纬度的相关定义: 经线: 经线也称子午线,是人类 ...

  7. 利用Qt+GDAL库制作经纬度坐标转换工具

    1.功能界面 下面是用Global Mapper计算的结果,证明计算正确. 2.功能介绍 支持CGCS2000/WGS84/XIAN80/BEIJING54四种常用坐标系: 自动判断输入经纬度和X/Y ...

  8. GDAL坐标转换——TransformPoint

    值得注意的是GDAL 3.x 改变了坐标策略,需要使用SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)来纠正 from osgeo impo ...

  9. 度分 格式 转换 GPS 经纬度定义、经纬度格式、GDAL中地理坐标转换及地理坐标屏幕显示

    转自:http://blog.csdn.net/lijie45655/article/details/6771524 手持GPS,正在学习当中,晚上我在谷歌地球上找到端午节要去的目的地,找出了它的经纬 ...

  10. 8影像计算ndvi landsat_使用GDAL读取遥感影像的信息

    读取影像数据集的元数据 GDAL已经提供了足够方便的函数,可以读取影像的一些元数据信息, 从而方便对数据进行处理.GDAL一般是以字典的形式对元数据进行组织的, 但是对于不同的栅格数据类型,元数据的类 ...

最新文章

  1. 简单读懂微生物基因组的泛基因组学
  2. 40个方法优化你的PHP
  3. 画图分析ehcach的缓存流程图
  4. 大数据日知录(一)数据分片与路由
  5. [CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)
  6. 临沂经济技术开发区 智慧让城市建设更美好
  7. Atitit 信息检索 之音乐检索实践 艾提拉注 目录 1. 常规检索 歌手 歌名 1 1.1. 年代检索 1 1.2. 歌词检索(可以依靠web 1 1.3. 哼唱检索 原曲检索(可以使用酷
  8. TensorFlow 核心流程剖析 -- 2 神经网络模型的构建、分割和优化
  9. word 的图片如何设置随意拖动或者说关闭任意拖动?
  10. 《遥远的救世主》遵守客观规律(五)——文化属性
  11. 游戏出海欧洲有哪些可以接入的支付渠道
  12. 百思不得其姐的注意点
  13. odbc An unsupported operation was attempted
  14. 真传奇:看看这群清华学生的牛X岁月
  15. 不吃早餐/自噬效应/断食
  16. DOS下格式化移动硬盘
  17. 【基础知识】事件模型
  18. java同步的意思_“同步”是什么意思?
  19. 同时设置伪类样式a:link和a:visited,a:link样式被a:visited样式覆盖问题
  20. 不能忘了看XUL Tutorial。

热门文章

  1. 使用脚本自制 SSL 域名证书
  2. python刷今日头条访问量_python爬虫实战:刷某博客站点的访问量(转)
  3. 多张图片合成一张jpg工具_如何将两张图片合成一张图片?
  4. php 邮箱附件 大小限制,Exmail+Postfix修改邮件附件大小
  5. win的反义词_英语中最常见 反义词、近义词、同义词及词形转换。欢迎大家收藏...
  6. 电脑只能上微信不能打开网页_能上微信不能打开网页
  7. 作为一个面试官如何准备一场面试
  8. 计算机学院运动会海报,《图文》运动会宣传海报资料
  9. java基础之枚举类
  10. 【office卸载】如何彻底卸载office2016