GDAL学习笔记——OGR投影(二)

解析坐标系

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)

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页