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开源库都可方便实现坐标转换。具体实践过程中,可根据项目开源库的依赖情况灵活选用。