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

1 Proj.4

通过坐标系proj4字符串创建projPJ类型坐标系,调用pj_transform函数实现。

其中坐标系proj4字符串可在PROJ4-data文件夹中的epsg文件中搜索得到。

double x = dblSrcX;
double y = dblSrcY;
double z = dblSrcZ;

projPJ fRef, tRef;
tRef = pj_init_plus(strDstProj.c_str());
fRef = pj_init_plus(strSrcProj.c_str());

pj_transform(fRef, tRef, 1, 1, &x, &y, &z);

 

2 GDAL

GDAL底层坐标转换对Proj.4接口进行了封装,设置坐标系的方式变得更加多样。支持常用名、EPSG码、WKT、Proj4等多种方式。对坐标转换功能也进行了面向对象封装。

double dbx = dbLon;
double dby = dbLat;
double dbz = dbHgt;

OGRSpatialReference fRef, tRef;
fRef.SetWellKnownGeogCS("WGS84");
//EPSG::4547 CGCS2000 / 3-degree Gauss-Kruger CM 114E 
tRef.importFromEPSG(4547);

OGRCoordinateTransformation *coordTrans;
coordTrans = OGRCreateCoordinateTransformation(&fRef, &tRef);
coordTrans->Transform(1, &dbx, &dby, &dbz);

3 osgEarth

osgEarth坐标转换进一步调用了GDAL的坐标转换接口,使用更加方便。

osg::ref_ptr<osgEarth::SpatialReference> pSrcSRS;
osg::ref_ptr<osgEarth::SpatialReference> pDstSRS;

pSrcSRS = osgEarth::SpatialReference::createFromPROJ4(strSrcProj);
pDstSRS = osgEarth::SpatialReference::createFromPROJ4(strDstProj);

osg::Vec3d vecOut;
pSrcSRS->transform(vecPositon, pDstSRS, vecOut);

以上三种GIS开源库都可方便实现坐标转换。具体实践过程中,可根据项目开源库的依赖情况灵活选用。

 

 

 

public class CoordTrans7Param { public double[,] values=new double[7,1]; //{{dx},{dy},{dz},{rx},{ry},{rz},{k}}; //public double   两个坐标系转换一般需要平移,旋转,缩放共七参数。 Y=(1+k)*M(x,y,z)*X+dX; public double[,] values=new double[7,1]; //{{dx},{dy},{dz},{rx},{ry},{rz},{k}}; //public double dx,dy,dz,rx,ry,rz,k; public void Set4Param(double dx,double dy,double dz,double k) { this.dx=dx; this.dy=dy; this.dz=dz; this.k=k; this.rx=this.ry=this.rz=0; } public void SetRotationParamRad(double rx,double ry,double rz) { this.rx=rx; this.ry=ry; this.rz=rz; } public void SetRotationParamMM(double rx,double ry,double rz) { SetRotationParamRad(rx*Math.PI/648000,ry*Math.PI/648000,rz*Math.PI/648000); } private double[,] GetMx() { double [,] Mx=new double[,] {{1,0,0}, {0,Math.Cos(rx),Math.Sin(rx)}, {0,-Math.Sin(rx),Math.Cos(rx)}}; return Mx; } private double[,] GetMy() { double [,] My=new double[,] {{Math.Cos(ry),0,-Math.Sin(ry)}, {0,1,0}, {Math.Sin(ry),0,Math.Cos(ry)}}; return My; } private double[,] GetMz() { double [,] Mz=new double[,] {{Math.Cos(rz),Math.Sin(rz),0}, {-Math.Sin(rz),Math.Cos(rz),0}, {0,0,1}}; return Mz; } private double[,] GetM() //M=Mx*My*Mz? or M=Mz*My*Mx? { double [,] M=new double[3,3]; MatrixTool.Multi(GetMz(),GetMy(),ref M); MatrixTool.Multi(M,GetMx(),ref M); return M; } private double[,] GetMdx() { double[,] mt = {{ 0, 0, 0 }, { 0, -Math.Sin(rx), Math.Cos(rx) }, { 0, -Math.Cos(rx), -Math.Sin(rx) }}; double[,] m=new double[3,3]; MatrixTool.Multi(GetMz(),GetMy(),ref m); MatrixTool.Multi(m,mt,ref m); return m; } private double[,] GetMdy() { double[,] mt = {{ -Math.Sin(ry), 0, -Math.Cos(ry) }, { 0, 0, 0 }, { Math.Cos(ry), 0, -Math.Sin(ry) }}; double[,] m=new double[3,3]; MatrixTool.Multi(GetMz(),mt,ref m); MatrixTool.Multi(m,GetMx(),ref m); return m; } private double[,] GetMdz() { double[,] mt = {{ -Math.Sin(rz), Math.Co
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值