遥感影像中投影坐标系转换

您所在的位置:网站首页 erdas拼接遥感影像步骤 遥感影像中投影坐标系转换

遥感影像中投影坐标系转换

2023-09-12 02:20| 来源: 网络整理| 查看: 265

概述

投影转换一般是讲A投影转换为B投影,包括地理坐标系和投影坐标系之间的互相转换等,这里要提到一点的是不同地理坐标系之间的转换,不同地理坐标系采用的椭球体和基准面有差异,因此,这之间的转换还涉及到椭球体之间的转换,这时候需要考虑到椭球体转换的问题,一般采用7参数转换模型或者3参数模型,这种转换是一种严格的投影转换,转换之后数据由于椭球体和基准面的不同,导致坐标会有位置偏差,一般偏差几十米。有时候为了数据能够完好叠加,采用不严格转换方法,将待转换数据的投影信息中的坐标系参数进行修改,比如UTM28N转换为WGS84坐标系,转换之前,将UTM28N坐标系中的基准面通过定义投影修改为WGS84所采用的的基准面,然后进行转换,这样的转换之后前后数据可以完好叠加。

投影转换条件

存在投影坐标系的遥感影像数据;GDAL和PROJ三方库。

数据

输入数据

UTM等投影坐标系的遥感影像。

输出数据

WGS84投影坐标系的遥感影像。

投影转换流程图

关键点分析

在整个流程图转换过程中,需要注意以下几点:

判断是否存在投影信息和投影坐标

从GIS数据中获取投影信息,通过GDAL中的GetProjectionRef()函数即可获取;从GIS数据中获取坐标信息时就需要注意,有些GIS数据的坐标信息存储在影像数据内,其坐标信息格式为:

左上角X坐标;地图单元中的一个象素在X方向上的X分辨率尺度;旋转量, 0表示没有旋转;左上角Y坐标;旋转量, 0表示没有旋转;地图单元中的一个象素在Y方向上的Y分辨率尺度的负值。

有些坐标信息是存储在世界坐标文件中,其坐标信息格式为:

地图单元中的一个象素在X方向上的X分辨率尺度;旋转量, 0表示没有旋转;旋转量, 0表示没有旋转;地图单元中的一个象素在Y方向上的Y分辨率尺度的负值;左上角X坐标;左上角Y坐标。 // 存储地理位置的参数信息 // dWorldFileParameters[0] /* 左上角 x */ // dWorldFileParameters[1] /* 东西方向一个像素对应的距离 */ // dWorldFileParameters[2] /* 旋转, 0表示上面为北方 */ // dWorldFileParameters[3] /* 左上角 y */ // dWorldFileParameters[4] /* 旋转, 0表示上面为北方 */ // dWorldFileParameters[5] /* 南北方向一个像素对应的距离 */ //存储位置调整,以便和GDAL的参数要求一样 dWorldFileParameters[0] = aTempWorldFileParameters[4]; dWorldFileParameters[1] = aTempWorldFileParameters[0]; dWorldFileParameters[2] = aTempWorldFileParameters[2]; dWorldFileParameters[3] = aTempWorldFileParameters[5]; dWorldFileParameters[4] = aTempWorldFileParameters[1]; dWorldFileParameters[5] = aTempWorldFileParameters[3];

两者的存储坐标信息内容一样,但是两者存储的坐标信息顺序不一样,为避免应用过程中出现错误则需要人工对读取后的坐标信息顺序进行调整。

获取投影名称

获取GIS投影信息后,发现无法进行各个投影信息的比较,比如:

原始影像投影坐标系:PROJCS["WGS 84 / UTM zone 28N",GEOGCS["WGS  84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-15],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32628"]]。

转换后投影坐标系:GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]。

OGRSpatialReference fRef; char *tmp = NULL; tmp = (char *)malloc(strlen(pProj) + 1); strcpy_s(tmp, strlen(pProj)+1, pProj); fRef.importFromWkt(&tmp); OGR_SRSNode* pOgrNode = fRef.GetRoot(); OGR_SRSNode* pOgrNodeChild = pOgrNode->GetChild(0); if (pOgrNodeChild == NULL) { return false; } const char* pProjName = pOgrNodeChild->GetValue();

这时就得建立OGRSpatialReference类中OGR_SRSNode节点类,再通过GetValue函数获取投影坐标系名称,比如获取示例原始影像投影坐标系名称为WGS 84 / UTM zone 28N,获取转换后的投影坐标系名称为WGS 84,然后对坐标系进行比较就可以满足要求。

进行投影坐标转换

OGRSpatialReference fRef, tRef; char *tmp = NULL; /** 获得projRef的一份拷贝 **/ /** 由于projRef是const char*,下面的一个函数不接受,所以需要转换成非const **/ tmp = (char *)malloc(strlen(projRef) + 1); strcpy_s(tmp, strlen(projRef)+1, projRef); /** 设置原始的坐标参数,和test.tif一致 **/ fRef.importFromWkt(&tmp); /** 设置转换后的坐标 **/ tRef.SetWellKnownGeogCS(m_strProjName.c_str()); /** 进行坐标转换,下面的内容如果不安装proj将会无法编译 **/ OGRCoordinateTransformation *coordTrans; coordTrans = OGRCreateCoordinateTransformation(&fRef, &tRef); coordTrans->Transform(1, &DPt.m_dX, &DPt.m_dY);

由OGRSpatialReference类中的importFromWkt函数和SetWellKnownGeogCS函数创建对象,再根据OGRCoordinateTransformation类中Transform函数进行转换。由OGRCreateCoordinateTransformation创建OGRCoordinateTransformation类对象时需判断OGRSpatialReference类对象是否创建成功,然后再导入PROJ4.0库,如果不导入proj4.0将无法创建OGRCoordinateTransformation类对象,进而无法进行坐标转换。

结论

在C++编程中,通过转换投影可以将各种投影坐标系数据显示在同一坐标系中,极大方便GIS数据显示。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3