当OGRSpatialReference对象被创建时,就可以解析该对象所包含的信息。可以使用OGRSpatialReference提供的IsProjected()和IsGeographic() 函数分别判别投影坐标系或地理坐标系是否建立,GetSemiMajor()、GetSemiMinor() 和GetInvFlattening()函数分别获取椭球体的长半轴、短半轴以及扁率的倒数。GetAttrValue()获取PROJCS、GEOGCS、DATUM、SPHEROID和PROJECTION名称的字符串。 GetProjParm()函数获取投影的参数信息。GetLinearUnits()函数获取单位类型,并且转换为单位米。
OGRSpatialReference oPGS;
oPGS.SetWellKnownGeogCS( "WGS84" );
std::cout<< "SemiMajor->" << oPGS.GetSemiMajor() << std::endl;
std::cout<< "SemiMinor->" << oPGS.GetSemiMinor() << std::endl;
std::cout<< "InvFlattening->" << oPGS.GetInvFlattening() << std::endl;
运行结果:
OGRCoordinateTransformation类是用于不同坐标系之间的转换,利用OGRCoordinateTransformation()创建OGRCoordinateTransformation类转换对象。利用OGRCoordinateTransformation::Transform()方法进行坐标系转换.
//Transform()的函数原型
virtual int OGRCoordinateTransformation::Transform (
int nCount,
double * x,
double * y,
double * z = NULL
)
//对于这四个参数:nCount表示要转换点的个数;x,y,z应该分别是三维坐标点的三个值,z可以为NULL,表示只转换水准面上的点。不考虑高程值。
下面是WGS84与Xian 1980/Gauss-Kruger zone 13之间转换的测试代码:
OGRSpatialReference oSourceSRS, oTargetSRS;
OGRCoordinateTransformation *poCT;
double x, y;
oSourceSRS.importFromEPSG( 4326 );//WGS84
oTargetSRS.importFromEPSG( 2327 );//Xian 1980/Gauss-Kruger zone 13
poCT = OGRCreateCoordinateTransformation( &oSourceSRS,
&oTargetSRS );
x = 10.0;
y = 10.0;
if ( poCT == NULL || !poCT->Transform( 1, &x, &y ))
printf( "Transformation failed.\n" );
else
printf( "(%f,%f) -> (%f,%f)\n",
10.0,
10.0,
x, y );
运行结果:
(10.000000,10.000000) -> (4381699.110753,2447192.109090)
关于代码中importFromEPSG函数的EPSG代号,可以点击这里查看。
进行坐标转换的过程很可能会转换失败。如果OGRCreateCoordinateTransformation()函数执行失败,主要是因为指定的两个空间参考之间不能进行转换,这个可能是使用了PROJ.4库不支持的投影、不同的椭球体之间的转换关系没有定义,或者是其中的一个空间参考没有定义而造成的。如果函数 OGRCreateCoordinateTransformation() 执行失败,那么其返回值将是NULL。
函数OGRCoordinateTransformation::Transform() 本身也可能转换失败,原因除了上面的可能因素之外,还可能因为待转换的点中有一个或多个没有定义。函数返回TRUE表示成功,任意一个点转换失败,则返回FALSE。
该函数还可以对三维点进行转换,根据不同的椭圆球及基准面自动调整高程值。如果没有Z值,OGR则假设转换的点都是在水准面上。接下来的代码演示了地理坐标系与投影坐标系之间的转换。
OGRSpatialReference oUTM, *poLatLong;
OGRCoordinateTransformation *poTransform;
oUTM.SetProjCS( "UTM 17 / WGS84" );
oUTM.SetWellKnownGeogCS( "WGS84" );
oUTM.SetUTM( 17 );
poLatLong = oUTM.CloneGeogCS();
poTransform = OGRCreateCoordinateTransformation( &oUTM, poLatLong );
double x, y, z;
x = 0.0;
y = 0.0;
z = 50.0;
if ( poTransform == NULL || !poTransform->Transform( 1, &x, &y, &z ) )
printf( "Transformation failed.\n" );
else
{
printf( "(%f,%f,%f) -> (%f,%f,%f)\n",
0.0,
0.0,
50.0,
x, y, z );
}
运行结果:
(0.000000,0.000000,50.000000) -> (-85.488744,0.000000,50.000000)