基于GDAL的地理坐标与投影坐标互转

文章介绍了如何使用C++和GDAL库进行地理坐标和投影坐标的转换,通过OGRCoordinateTransformation类实现两种转换方法,包括从地理坐标到投影坐标和从投影坐标回溯到地理坐标。
摘要由CSDN通过智能技术生成

在地理数据处理过程中,往往需要进行坐标之间的转换,地理坐标与投影坐标之间的转换是最常见的需求。然而由于在坐标转换时涉及过多参数,处理方式较为复杂,如何通过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” 举个栗子

更为简单的坐标转化:

地理坐标——>投影坐标

方法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】GDAL学习笔记——OGR投影(二)_ogrcreatecoordinatetransformation-CSDN博客

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值