基于GDAL的地理坐标与投影坐标互转
在地理数据处理过程中,往往需要进行坐标之间的转换,地理坐标与投影坐标之间的转换是最常见的需求。然而由于在坐标转换时涉及过多参数,处理方式较为复杂,如何通过C++快速实现坐标转换成为亟需解决的难题。
GDAL是处理地理数据的高效开源库,支持C++、Python等多种语言,可实现绝大部分数据处理需求,因此本人采用C++语言基于GDAL库进行坐标转化处理。
操作如下:
方法1:地理坐标——>投影坐标
#include<iostream>
#include "ogrsf_frmts.h"
#include "gdal_priv.h"
#include "ogr_geometry.h"
#include "ogr_attrind.h"
#include "ogr_srs_api.h"
void projection(double &dLong, double &dLat)
{
//投影坐标系
OGRSpatialReference spatialReference;
//以下参数可查阅https://georepository.com/
//**********//
spatialReference.importFromEPSG(32649);
spatialReference.SetTM(0, 111, 0.9996, 500000, 0);
//**********//
//转换
OGRSpatialReference* pLonLat = spatialReference.CloneGeogCS();
OGRCoordinateTransformation* LonLat2XY = OGRCreateCoordinateTransformation(pLonLat, &spatialReference);
if (!LonLat2XY)
{
return;
}
//printf("经纬度坐标:%.9lf\t%.9lf\n", dLong, dLat);
if (!LonLat2XY->Transform(1, &dLong, &dLat))
{
return;
}
//printf("平面坐标:%.9lf\t%.9lf\n", dLong, dLat);
OGRCoordinateTransformation::DestroyCT(LonLat2XY);
LonLat2XY = nullptr;
}
//调用
double nLong = 114.666;
double nLat = 55.666;
projection(nLong , nLat);
cout<<"nLong , nLat"<<nLong <<" "<< nLat<<endl;
spatialReference.importFromEPSG(32649);
spatialReference.SetTM(0, 111, 0.9996, 500000, 0);
其中,以上2个函数涉及的参数请前往https://georepository.com/,本人基于当前参考投影 “WGS 84 / UTM zone 49N” 举个栗子
20210708_更新:更为简单的坐标转化:
地理坐标——>投影坐标
方法2:地理坐标——>投影坐标
void projection(double & X, double & Y)
{
OGRSpatialReference oSourceSRS, oTargetSRS;
OGRCoordinateTransformation *poCT;
double dX = X, dY = Y;
oSourceSRS.importFromEPSG(4490);//CGCS2000大地坐标
oTargetSRS.importFromEPSG(4526);//CGCS2000投影平面-中央经线114
poCT = OGRCreateCoordinateTransformation(&oSourceSRS,&oTargetSRS);
if (poCT == NULL || !poCT->Transform(1, &X, &Y))
printf("Transformation failed.\n");
else
printf("(%f,%f) -> (%f,%f)\n",dX,dY,X, Y);
}
投影坐标——>地理坐标
方法1:投影坐标——>地理坐标
void projection(double & X, double & Y)
{
OGRSpatialReference oSourceSRS, oTargetSRS;
OGRCoordinateTransformation *poCT;
double dX = X, dY = Y;
oSourceSRS.importFromEPSG(4526);//CGCS2000投影平面-中央经线114
oTargetSRS.importFromEPSG(4490);//CGCS2000大地坐标
poCT = OGRCreateCoordinateTransformation(&oSourceSRS,&oTargetSRS);
if (poCT == NULL || !poCT->Transform(1, &X, &Y))
printf("Transformation failed.\n");
else
printf("(%f,%f) -> (%f,%f)\n",dX,dY,X, Y);
}
我们发现,只需更新函数中的两个参数即可实现地理坐标与投影坐标互转,该方法更为简单快速!
OGRCreateCoordinateTransformation(&oSourceSRS,&oTargetSRS);
本文参考
【1】https://www.cnblogs.com/charlee44/p/6919412.html
【2】https://blog.csdn.net/u010670734/article/details/53144869