GDAL C++ API 学习之路 (3) Spatial Reference System篇 OGRSpatialReference类

28 篇文章 11 订阅

class OGRSpatialReference        #include <ogr_spatialref.h>

OGRSpatialReference 是 GDAL/OGR 库中的一个重要类,用于管理和操作地理空间数据的空间参考系统(Spatial Reference System,SRS)。它提供了一系列功能,允许用户定义、查询、解析和转换地理空间数据的坐标系统和投影信息

Public Functions

GetAxesCount

int GetAxesCount() const

返回 CRS 坐标系的轴数

    // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);
    
    // 获取空间参考系统中坐标轴的数量
    int axesCount = srs.GetAxesCount();
    
    // 输出坐标轴的数量
    printf("坐标轴的数量:%d\n", axesCount);

GetAxis

const char *GetAxis(const char *pszTargetKey, int iAxis, OGRAxisOrientation *peOrientation, double *pdfConvFactor = nullptr) const

获取一个轴的方向

参数:

  • pszTargetKey -- 要查询的坐标系部分(“PROJCS”或“GEOGCS”)。

  • iAxis -- 要查询的轴(0 表示第一个,1 表示第二个,2 表示第三个)。

  • peOrientation——放置获取方向的位置,可能为 NULL。

  • pdfConvUnit -- (GDAL >= 3.4) 放置轴转换因子的位置。可能为空。仅当 pszTargetKey == NULL 时才设置

返回:  失败时轴的名称或 NULL

    // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);
    
    // 获取指定坐标轴的信息
    const char* targetKey = "GEOGCS";
    int axisIndex = 0; // 纬度的索引为0,经度的索引为1
    OGRAxisOrientation orientation;
    double convFactor;
    const char* axisInfo = srs.GetAxis(targetKey, axisIndex, &orientation, &convFactor);

    if (axisInfo != nullptr) {
        printf("指定坐标轴的信息:%s\n", axisInfo);
        printf("坐标轴的方向:%s\n", (orientation == OAO_East || orientation == OAO_North) ? "正向" : "反向");
        printf("坐标轴的转换因子:%f\n", convFactor);
    } else {
        printf("未找到指定坐标轴的信息。\n");
    }

SetAxes

OGRErr SetAxes(const char *pszTargetKey, const char *pszXAxisName, OGRAxisOrientation eXAxisOrientation, const char *pszYAxisName, OGRAxisOrientation eYAxisOrientation )

设置坐标系的轴

设置投影 (PROJCS) 或地理 (GEOGCS) 坐标系的名称和轴方向

参数:

  • pszTargetKey - “PROJCS”或“GEOGCS”,必须已经存在于SRS中。

  • pszXAxisName -- 第一个轴的名称,通常为“长”或“东”。

  • eXAxisOrientation——通常OAO_East。

  • pszYAxisName -- 第二个轴的名称,通常为“纬度”或“北”。

  • eYAxisOrientation——通常OAO_North。

返回: OGRERR_NONE成功或错误代码

    // 创建一个空的 OGRSpatialReference 对象
    OGRSpatialReference srs;

    // 设置地理坐标系的坐标轴信息
    const char* targetKey = "GEOGCS";
    const char* xAxisName = "Longitude";
    OGRAxisOrientation xAxisOrientation = OAO_East; // 东经方向为正向
    const char* yAxisName = "Latitude";
    OGRAxisOrientation yAxisOrientation = OAO_North; // 北纬方向为正向

    OGRErr err = srs.SetAxes(targetKey, xAxisName, xAxisOrientation, yAxisName, yAxisOrientation);

GetAxisMappingStrategy

OSRAxisMappingStrategy GetAxisMappingStrategy() const

将数据轴返回到 CRS 轴映射策略

返回: 数据轴到 CRS 轴映射策略

    // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);
    
    // 获取坐标轴映射策略
    OSRAxisMappingStrategy axisMappingStrategy = srs.GetAxisMappingStrategy();
    
    // 输出坐标轴映射策略
    switch (axisMappingStrategy) {
        case OAMS_TRADITIONAL_GIS_ORDER:
            printf("坐标轴映射策略:传统GIS顺序\n");
            break;
        case OAMS_AUTHORITY_COMPLIANT:
            printf("坐标轴映射策略:符合权威机构要求\n");
            break;
        case OAMS_AUTO_COMPLIANT:
            printf("坐标轴映射策略:自动符合\n");
            break;
        case OAMS_NONE:
            printf("坐标轴映射策略:无映射\n");
            break;
        default:
            printf("未知的坐标轴映射策略\n");
            break;
    }

SetAxisMappingStrategy

void SetAxisMappingStrategyOSRAxisMappingStrategy)

将数据轴设置为 CRS 轴映射策略

    // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);

    // 设置坐标轴映射策略为符合权威机构要求
    srs.SetAxisMappingStrategy(OAMS_AUTHORITY_COMPLIANT);

    // 导出设置后的空间参考系统的WKT格式字符串并打印
    char* srsWKT = NULL;
    srs.exportToWkt(&srsWKT);
    printf("设置后的空间参考系统:\n%s\n", srsWKT);

    // 释放内存,避免内存泄漏
    CPLFree(srsWKT);

OSRAxisMappingStrategy 是一个枚举类型,用于表示坐标轴映射策略。在 GDAL/OGR 中,OSRAxisMappingStrategy 定义了以下几种枚举值:

  1. OAMS_TRADITIONAL_GIS_ORDER:传统GIS顺序,通常用于传统GIS软件。即 X 轴(经度)在前,Y 轴(纬度)在后。

  2. OAMS_AUTHORITY_COMPLIANT:符合权威机构要求,通常用于符合权威机构标准的坐标系统。具体顺序和要求可能由权威机构定义。

  3. OAMS_AUTO_COMPLIANT:自动符合,表示由库自动选择符合要求的坐标轴顺序。通常情况下,如果空间参考系统包含了权威机构规定的坐标轴顺序,则会自动采用符合要求的顺序。

  4. OAMS_NONE:无映射,表示坐标轴没有进行映射。这种情况下,坐标轴的顺序可能是不确定的,需要用户自己确认。

SetLinearUnitsAndUpdateParameters

OGRErr SetLinearUnitsAndUpdateParameters(const char *pszName, double dfInMeters, const char *pszUnitAuthority = nullptr, const char *pszUnitCode = nullptr)

设置投影的线性单位

参数:

  • pszName -- 要使用的单位名称。一些首选单位名称可以在 ogr_srs_api.h 中找到,例如 SRS_UL_METER、SRS_UL_FOOT 和 SRS_UL_US_FOOT。

  • dfInMeter -- 以指示单位转换为米的长度的倍数。一些标准换算系数可以在ogr_srs_api.h中找到。

  • pszUnitAuthority -- 单位授权名称。或空

  • pszUnitCode -- 单位代码。或空

返回: OGRERR_NONE成功

    // 创建一个空的 OGRSpatialReference 对象
    OGRSpatialReference srs;

    // 设置线性单位为“米”(meters),并更新相关参数
    const char* unitName = "Meter";
    double unitInMeters = 1.0; // 1 米
    const char* unitAuthority = "EPSG"; // 单位的权威机构(EPSG)
    const char* unitCode = "9001"; // 单位的代码(EPSG代码:9001代表Meter)

    OGRErr err = srs.SetLinearUnitsAndUpdateParameters(unitName, unitInMeters, unitAuthority, unitCode);

    if (err == OGRERR_NONE) {
        printf("线性单位设置成功!\n");

        // 导出设置后的空间参考系统的WKT格式字符串并打印
        char* srsWKT = NULL;
        srs.exportToWkt(&srsWKT);
        printf("设置后的空间参考系统:\n%s\n", srsWKT);

        // 释放内存,避免内存泄漏
        CPLFree(srsWKT);
    } else {
        printf("线性单位设置失败!\n");
    }

GetLinearUnits

double GetLinearUnits(char**) const

获取线性投影单位

参数:

ppszName -- 要用指向设备名称的指针更新的指针。返回的值保留在 OGRSpatialReference 的内部,不应释放或修改。它可能在下一次 OGRSpatialReference 调用时失效。

返回: 乘以线性距离以将其转换为米的值

    // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);
    
    // 获取空间参考系统中线性单位的值
    double linearUnits = srs.GetLinearUnits();

    // 输出线性单位的值
    printf("线性单位的值:%f\n", linearUnits);

SetAngularUnits

OGRErr SetAngularUnitsconst char *pszName, double dfInRadians)

设置地理坐标系的角度单位

参数:

  • pszName -- 要使用的单位名称。一些首选单位名称可以在 ogr_srs_api.h 中找到,例如 SRS_UA_DEGREE。

  • dfInRadians -- 以指示单位转换为弧度的角度的倍数。一些标准换算系数可以在ogr_srs_api.h中找到。

返回:  OGRERR_NONE成功

    // 创建一个空的 OGRSpatialReference 对象
    OGRSpatialReference srs;

    // 设置角度单位为“度”(degree),并更新相关参数
    const char* unitName = "Degree";
    double unitInRadians = CPLAtof(SRS_UA_DEGREE_CONV);
    
    OGRErr err = srs.SetAngularUnits(unitName, unitInRadians);

GetAngularUnits

double GetAngularUnits(char**) const

获取角度地理坐标系单位

参数:

ppszName -- 要用指向设备名称的指针更新的指针。返回的值保留在 OGRSpatialReference 的内部,不应释放或修改。它可能在下一次 OGRSpatialReference 调用时失效。

返回: 乘以角距离以将其转换为弧度的值

   // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);
    
    // 获取空间参考系统中的角度单位
    double angularUnits = srs.GetAngularUnits();

    // 输出角度单位的值
    printf("角度单位的值:%f\n", angularUnits);

GetPrimeMeridian

double GetPrimeMeridian(char**) const

获取本初子午线信息

参数:

ppszName -- 返回本初子午线名称的位置。如果为 NULL,则不返回名称。

返回: 从格林威治到GEOGCS本初子午线的偏移量(以十进制度为单位)

    // 定义一个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs;
    srs.importFromWkt(&wktString);
    
    // 获取空间参考系统中的本初子午线
    double primeMeridian = srs.GetPrimeMeridian();

    // 输出本初子午线的值
    printf("本初子午线的值:%f\n", primeMeridian);

IsEmpty

bool IsEmpty() const

如果未设置 SRS,则返回

IsGeographic

int IsGeographic() const

返回: 如果此空间参考是地理参考,则为 TRUE

IsProjected

int IsProjected() const

返回: 如果包含指示投影坐标系的 PROJCS 节点,则为 TRUE

IsGeocentric

int IsGeocentric() const

检查地心坐标系

返回: 如果它包含一个指示它是地心坐标系的 GEOCCS 节点,则为 TRUE

IsLocal

int IsLocal() const

检查是否为局部坐标系

返回: 如果此空间参考是局部的,则为 TRUE...即根是LOCAL_CS节点

IsVertical

int IsVertical() const

检查是否垂直坐标系

返回: 如果它包含一个指示它是垂直坐标系的VERT_CS节点,则为 TRUE

IsCompound

int IsCompound() const

检查坐标系是否为复合坐标系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

场主不吃鍋巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值