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

Spatial Reference System <ogr_spatialref.h>

Spatial Reference System (SRS) 是地理空间数据中用于描述地理坐标系、投影信息和地球椭球体参数的类或数据结构。在 GIS (地理信息系统) 中,SRS 是非常重要的概念,因为它定义了地理空间数据的几何特性和位置。

SRS 可以包含以下信息:

  1. 坐标参考系统 (Coordinate Reference System, CRS):描述地理数据的坐标系统,通常由坐标轴和原点组成。坐标参考系统定义了如何将地球表面上的点映射到二维地图上的坐标。

  2. 投影信息:地球表面是一个三维球体,而地图通常是在二维平面上表示的。投影定义了如何将地球的三维曲面映射到平面上,以实现地图的制作。

  3. 地球椭球体参数:地球并不是一个完美的球体,而是一个椭球体。地球椭球体参数包括椭球体的长半轴、短半轴、扁率等信息,用于更准确地描述地球的形状。

通过使用 OGRSpatialReference 类,您可以执行以下操作:

  • 设置地理坐标系和投影信息。
  • 进行坐标转换,将一个坐标点从一个 CRS 转换到另一个 CRS。
  • 解析和获取 CRS 的参数信息。
  • 比较两个 CRS 是否相等。
  • 确定地理空间数据是否具有相同的 CRS。

Public Member Functions

OGRCreateCoordinateTransformation

OGRCoordinateTransformation *OGRCreateCoordinateTransformation(const OGRSpatialReference *poSource, const OGRSpatialReference *poTarget**)**

创建转换对象

输入空间参考系统对象通过复制(调用 clone() 方法)进行分配,不会发生所有权转让

参数:

  • poSource -- 源空间参考系统。

  • poTarget -- 目标空间参考系统。

返回: 失败时为 NULL 或即用型转换对象

    // 创建源空间参考对象
    OGRSpatialReference *sourceSRS = new OGRSpatialReference();
    sourceSRS->importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 创建目标空间参考对象
    OGRSpatialReference *targetSRS = new OGRSpatialReference();
    targetSRS->importFromEPSG(32633); // UTM Zone 33N 投影坐标系

    // 创建坐标转换对象
    OGRCoordinateTransformation *transform = OGRCreateCoordinateTransformation(sourceSRS, targetSRS);
    
    if (transform) {
        // 要进行转换的坐标点
        double x = 10.0; // 经度
        double y = 50.0; // 纬度

        // 进行坐标转换
        if (transform->Transform(1, &x, &y)) {
            // 输出转换后的坐标
            printf("转换后的坐标:%.3f, %.3f\n", x, y);
        } else {
            printf("坐标转换失败!\n");
        }

        // 释放坐标转换对象
        OGRCoordinateTransformation::DestroyCT(transform);
    } else {
        printf("创建坐标转换对象失败!\n");
    }

    // 释放空间参考对象
    delete sourceSRS;
    delete targetSRS;

OGRCreateCoordinateTransformation

OGRCoordinateTransformation *OGRCreateCoordinateTransformation(const OGRSpatialReference *poSource, const OGRSpatialReference *poTarget, const OGRCoordinateTransformationOptions &options**)**

创建转换对象

参数:

  • poSource -- 源空间参考系统。

  • poTarget -- 目标空间参考系统。

  • options -- 协调变换选项。

返回: 失败时为 NULL 或即用型转换对象

    // 创建源空间参考对象
    OGRSpatialReference *sourceSRS = new OGRSpatialReference();
    sourceSRS->importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 创建目标空间参考对象
    OGRSpatialReference *targetSRS = new OGRSpatialReference();
    targetSRS->importFromEPSG(32633); // UTM Zone 33N 投影坐标系

    // 创建坐标转换选项对象
    OGRCoordinateTransformationOptions transformOptions;
    transformOptions.SetOption("METHOD", "GEOCENTRIC"); // 设置转换方法为 GEODETIC

    // 创建坐标转换对象
    OGRCoordinateTransformation *transform = OGRCreateCoordinateTransformation(sourceSRS, targetSRS, transformOptions);

    if (transform) {
        // 要进行转换的坐标点
        double x = 10.0; // 经度
        double y = 50.0; // 纬度

        // 进行坐标转换
        if (transform->Transform(1, &x, &y)) {
            // 输出转换后的坐标
            printf("转换后的坐标:%.3f, %.3f\n", x, y);
        } else {
            printf("坐标转换失败!\n");
        }

        // 释放坐标转换对象
        OGRCoordinateTransformation::DestroyCT(transform);
    } else {
        printf("创建坐标转换对象失败!\n");
    }

    // 释放空间参考对象
    delete sourceSRS;
    delete targetSRS;

class OGRSpatialReference #include <ogr_spatialref.h>

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

Public Functions

OGRSpatialReference

explicit OGRSpatialReference(const char* = nullptr )

构造函数

OGRSpatialReference

OGRSpatialReference(const OGRSpatialReference&****)

参数:

pszWKT -- 对象应初始化为的已知文本定义,或 NULL(默认值)

int Reference**(****)**

将引用计数递增 1

返回: 更新的引用计数

int Reference**(****)**

将引用计数递减 1

返回: 更新的引用计数

int GetReferenceCount() const

获取当前引用计数

返回: 当前引用计数

void Release**(****)**

将引用计数递减 1,如果为零则销毁

GetName

const char *GetName() const

返回: CRS 名称

OGRSpatialReference srs; srs.importFromEPSG(4326);
// WGS 84 经纬度坐标系 

// 使用 GetName() 函数获取空间参考系统的名称 
const char *srsName = srs.GetName();

// 输出空间参考系统的名称 

printf("空间参考系统名称:%s\n", srsName);


空间参考系统名称:WGS 84

Clone

OGRSpatialReference *Clone() const

复制此 OGRSpatialReference

返回: 新的 SRS,这将成为调用方的责任

exportToWkt

OGRErr exportToWkt(char**) const

将此 SRS 转换为 WKT 格式

参数:

ppszResult -- 在此指针中返回结果字符串。

返回: OGRERR_NONE如果成功

​    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出空间参考系统为 WKT 字符串
    char* srsWkt = NULL;
    OGRErr err = srs.exportToWkt(&srsWkt);

    if (err == OGRERR_NONE) {
        // 输出导出的 WKT 字符串
        printf("导出的 WKT 字符串:\n%s\n", srsWkt);

        // 释放内存,避免内存泄漏
        CPLFree(srsWkt);
    } else {
        printf("导出失败!\n");
    }



导出的 WKT 字符串:
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.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]

exportToWkt

OGRErr exportToWkt(char **ppszWKT, const char *const *papszOptions)

将此 SRS 转换为 WKT 字符串

参数:

  • ppszResult -- 在此指针中返回结果字符串。

  • papszOptions -- NULL 终止的选项列表,或 NULL。

返回: OGRERR_NONE如果成功。

目前在 GDAL/OGR 库中,exportToWkt() 方法支持以下导出选项:

  1. SPACING: 设置导出的 WKT 字符串中参数之间的间隔字符,默认是空格。

  2. INDENT: 设置导出的 WKT 字符串中的缩进字符,默认是四个空格。

  3. SINGLE_LINE: 如果设置为 "YES",则导出的 WKT 字符串将在一行中,不换行,否则使用多行格式,默认是使用多行格式。

  4. SIMPLE_IRREGULAR: 如果设置为 "YES",则导出的 WKT 字符串将尽量使用简化的不规则椭球体描述,默认是不使用简化的描述。

  5. WKT_FORMAT_ISO: 如果设置为 "ON",则导出的 WKT 字符串将使用 ISO 19162 规范格式,默认是不使用 ISO 19162 规范格式。

  6. AXIS_ORDER: 设置导出的坐标轴顺序。可选的值有 "EAST_NORTH", "NORTH_EAST", "OTHER", "LAT_LONG", "LONG_LAT" 等。默认是根据 EPSG 代码中的约定来确定坐标轴顺序。

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出选项数组,设置导出选项
    const char *papszOptions[] = {"SINGLE_LINE=YES", "WKT_FORMAT_ISO=ON", NULL};

    // 导出空间参考系统为 WKT 字符串
    char* srsWkt = NULL;
    OGRErr err = srs.exportToWkt(&srsWkt, papszOptions);

    if (err == OGRERR_NONE) {
        // 输出导出的 WKT 字符串
        printf("导出的 WKT 字符串:\n%s\n", srsWkt);

        // 释放内存,避免内存泄漏
        CPLFree(srsWkt);
    } else {
        printf("导出失败!\n");
    }

exportToPrettyWkt

OGRErr exportToPrettyWkt(char**, int = FALSE) const

将此 SRS 转换为格式良好的 WKT 字符串

这个导出函数相比于 exportToWkt(char**) const 函数,主要优点在于导出的 WKT 字符串会被格式化,使其更易读。格式化后的字符串会在适当的位置添加缩进和换行,从而增加可读性,方便人工阅读。

参数:

  • ppszResult -- 在此指针中返回结果字符串。

  • bSimplify -- 如果应剥离 AXIS、AUTHORITY 和 EXTENSION 节点,则为 TRUE。

返回: OGRERR_NONE如果成功

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出格式化的 WKT 字符串
    char* srsWkt = NULL;
    OGRErr err = srs.exportToPrettyWkt(&srsWkt, TRUE); // 设置为 TRUE 进行格式化

    if (err == OGRERR_NONE) {
        // 输出导出的格式化的 WKT 字符串
        printf("导出的格式化的 WKT 字符串:\n%s\n", srsWkt);

        // 释放内存,避免内存泄漏
        CPLFree(srsWkt);
    } else {
        printf("导出失败!\n");
    }

导出的格式化的 WKT 字符串:
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.0174532925199433, AUTHORITY["EPSG", "9122"]],
    AUTHORITY["EPSG", "4326"]
]

exportToPROJJSON

OGRErr exportToPROJJSON(char**, const char *const *papszOptions) const

将此 SRS 转换为 PROJJSON 字符串

参数:

  • ppszResult -- 在此指针中返回结果字符串。

  • papszOptions -- NULL 终止的选项列表,或 NULL。

返回: OGRERR_NONE如果成功

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出选项数组,可以设置一些导出的配置选项(在这个例子中为空)
    const char *const *papszOptions = NULL;

    // 导出空间参考系统为 PROJJSON 字符串
    char* srsJson = NULL;
    OGRErr err = srs.exportToPROJJSON(&srsJson, papszOptions);

    if (err == OGRERR_NONE) {
        // 输出导出的 PROJJSON 字符串
        printf("导出的 PROJJSON 字符串:\n%s\n", srsJson);

        // 释放内存,避免内存泄漏
        CPLFree(srsJson);
    } else {
        printf("导出失败!\n");
    }

导出的 PROJJSON 字符串:
{
    "type": "GeographicCRS",
    "name": "WGS 84",
    "datum_ensemble": {
        "name": "World Geodetic System 1984",
        "identifiers": [
            {
                "name": "EPSG",
                "code": 6326
            }
        ],
        "ellipsoid": {
            "name": "WGS 84",
            "semi_major_axis": 6378137,
            "inverse_flattening": 298.257223563
        }
    },
    "coordinate_system": {
        "subtype": "ellipsoidal",
        "axis": [
            {
                "name": "Latitude",
                "abbreviation": "lat",
                "direction": "north",
                "unit": "degree"
            },
            {
                "name": "Longitude",
                "abbreviation": "lon",
                "direction": "east",
                "unit": "degree"
            }
        ]
    },
    "area": "World",
    "bbox": {
        "west_longitude": -180,
        "east_longitude": 180,
        "south_latitude": -90,
        "north_latitude": 90
    }
}

exportToProj4

OGRErr exportToProj4(char**) const

以 PROJ.4 旧格式导出坐标系

参数:

ppszProj4 -- 将向其分配动态分配的 PROJ 定义的指针。

返回: 成功时OGRERR_NONE或失败时错误代码

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出空间参考系统为 Proj.4 字符串
    char* proj4String = NULL;
    OGRErr err = srs.exportToProj4(&proj4String);

    if (err == OGRERR_NONE) {
        // 输出导出的 Proj.4 字符串
        printf("导出的 Proj.4 字符串:%s\n", proj4String);

        // 释放内存,避免内存泄漏
        CPLFree(proj4String);
    } else {
        printf("导出失败!\n");
    }

导出的 Proj.4 字符串:+proj=longlat +datum=WGS84 +no_defs

exportToPCI

OGRErr exportToPCI(char**, char**, double**) const

在 PCI 投影定义中导出坐标系

参数:

  • ppszProj -- 将向其分配动态分配的 PCI 投影定义的指针。

  • ppszUnits -- 将向其分配动态分配单位定义的指针。

  • ppadfPrjParams -- 将动态分配的 17 个投影参数数组的指针。有关参数列表,请参阅 importFromPCI()。

返回: 成功时OGRERR_NONE或失败时错误代码

exportToUSGS

OGRErr exportToUSGS(long*, long*, double**, long*) const

导出 USGS GCTP 投影定义中的坐标系

参数:

  • piProjSys -- 指向变量的指针,其中将返回投影系统代码。

  • piZone -- 指向变量的指针,其中将返回 UTM 和美国国家平面投影系统的区域。

  • ppadfPrjParams -- 将动态分配的 15 个投影参数数组分配给该数组的指针。有关参数列表,请参阅 importFromUSGS()。负责释放此数组的调用方。

  • piDatum -- 指向变量的指针,将在其中返回基准代码。

返回: 成功时OGRERR_NONE或失败时错误代码

exportToXML

OGRErr exportToXML(char**, const char* = nullptr) const

以 XML 格式导出坐标系

参数:

  • ppszRawXML -- 将向其分配动态分配的 XML 定义的指针。

  • pszDialect - 目前被忽略。使用的方言是基于GML的。

返回: 成功时OGRERR_NONE或失败时错误代码

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出选项,这里不设置任何选项,传入 nullptr 表示使用默认选项
    const char* pszOptions = nullptr;

    // 导出空间参考系统为 XML 字符串
    char* xmlString = nullptr;
    OGRErr err = srs.exportToXML(&xmlString, pszOptions);

    if (err == OGRERR_NONE) {
        // 输出导出的 XML 字符串
        printf("导出的 XML 字符串:\n%s\n", xmlString);

        // 释放内存,避免内存泄漏
        CPLFree(xmlString);
    } else {
        printf("导出失败!\n");
    }

导出的 XML 字符串:
<GEOGCS>
  <DATUM>
    <SPHEROID AUTHORITY="EPSG" CODE="7030">WGS 84</SPHEROID>
    <TOWGS84 DX="0" DY="0" DZ="0" EX="0" EY="0" EZ="0" PPM="0"/>
    <AUTHORITY EPSG="6326"/>
  </DATUM>
  <PRIMEM AUTHORITY="EPSG" CODE="8901">Greenwich</PRIMEM>
  <UNIT AUTHORITY="EPSG" CODE="9122">degree</UNIT>
  <AUTHORITY EPSG="4326"/>
</GEOGCS>

exportToPanorama

OGRErr exportToPanorama(long*, long*, long*, long*, double*) const

导出坐标系统在"全景"GIS投影定义。

参数:

  • piProjSys -- 指向变量的指针,其中将返回投影系统代码。

  • piDatum -- 指向变量的指针,将在其中返回坐标系代码。

  • piEllips -- 指向变量的指针,其中将返回椭球体代码。

  • piZone -- 指向变量的指针,其中将返回 UTM 投影系统的区域。

  • padfPrjParams -- 一个现有的 7 个双缓冲区,投影参数将放置在其中。有关参数列表,请参阅 importFromPanorama()。

返回: 成功时OGRERR_NONE或失败时错误代码

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 初始化变量,用于接收导出的 Panorama 参数
    long linearUnits = 0, angularUnits = 0, primeMeridian = 0, geographicCSType = 0;
    double* parameters = nullptr;

    // 导出空间参考系统为 Panorama 参数
    OGRErr err = srs.exportToPanorama(&linearUnits, &angularUnits, &primeMeridian, &geographicCSType, parameters);

    if (err == OGRERR_NONE) {
        // 输出导出的 Panorama 参数
        printf("导出的 Panorama 参数:\n");
        printf("Linear Units: %ld\n", linearUnits);
        printf("Angular Units: %ld\n", angularUnits);
        printf("Prime Meridian: %ld\n", primeMeridian);
        printf("Geographic CS Type: %ld\n", geographicCSType);

        // 释放内存,避免内存泄漏
        if (parameters != nullptr) {
            CPLFree(parameters);
        }
    } else {
        printf("导出失败!\n");
    }

由于涉及到多个参数,输出内容会比较多,所以没有完整打印在这里

exportVertCSToPanorama

OGRErr exportVertCSToPanorama(int*) const

将垂直坐标系导出为"全景"GIS 投影定义

    OGRSpatialReference srs;
    srs.importFromEPSG(5703); // EPSG:5703 - NGVD 29 height

    // 初始化变量,用于接收导出的 Panorama 参数
    int vertCS = 0;

    // 导出垂直坐标系为 Panorama 参数
    OGRErr err = srs.exportVertCSToPanorama(&vertCS);

    if (err == OGRERR_NONE) {
        // 输出导出的 Panorama 参数
        printf("导出的 Panorama 参数:%d\n", vertCS);
    } else {
        printf("导出失败!\n");
    }

exportToERM

OGRErr exportToERM(char *pszProj, char *pszDatum, char *pszUnits**)**

将坐标系转换为 ERMapper 格式

参数:

  • pszProj -- 用于接收投影名称的 32 个字符的缓冲区。

  • pszDatum -- 用于接收基准名称的 32 个字符的缓冲区。

  • pszUnits -- 用于接收单位名称的 32 个字符的缓冲区。

返回: OGRERR_NONE成功,OGRERR_SRS_UNSUPPORTED(如果不是)找到翻译,或者OGRERR_FAILURE其他失败

exportToMICoordSys

OGRErr exportToMICoordSys(char**) const

以地图信息样式坐标系统格式导出坐标系

参数:

ppszResult -- 动态分配的 Mapinfo CoordSys 定义将被分配到的指针。

返回:OGRERR_NONE成功时,OGRERR_FAILURE失败时,OGRERR_UNSUPPORTED_OPERATION MITAB 库是否未链接

    OGRSpatialReference srs;
    srs.importFromEPSG(4326); // WGS 84 经纬度坐标系

    // 导出空间参考系统为 MapInfo CoordSys 字符串
    char* coordSysString = NULL;
    OGRErr err = srs.exportToMICoordSys(&coordSysString);

    if (err == OGRERR_NONE) {
        // 输出导出的 MapInfo CoordSys 字符串
        printf("导出的 MapInfo CoordSys 字符串:\n%s\n", coordSysString);

        // 释放内存,避免内存泄漏
        CPLFree(coordSysString);
    } else {
        printf("导出失败!\n");
    }

导出的 MapInfo CoordSys 字符串:
CoordSys Earth Projection 1, 104
Units "degree"
Origin 0, 0
相关推荐
摇滚侠3 分钟前
java http body的格式 ‌application/x-www-form-urlencoded‌不支持文件上传
java·开发语言·http
流着口水看上帝7 分钟前
JavaScript学习路线
学习
Ting丶丶8 分钟前
安卓应用安装过程学习
android·学习·安全·web安全·网络安全
被猫枕的咸鱼8 分钟前
项目学习:仿b站的视频网站项目03-注册功能
学习
檀越剑指大厂13 分钟前
【Python系列】 Base64 编码:使用`base64`模块
开发语言·python
誓约酱17 分钟前
(动画)Qt控件 QLCDNumer
开发语言·c++·git·qt·编辑器
夫琅禾费米线17 分钟前
leetcode2650. 设计可取消函数 generator和Promise
开发语言·javascript·leetcode·ecmascript
@小博的博客28 分钟前
C++初阶学习第十三弹——容器适配器和优先级队列的概念
开发语言·数据结构·c++·学习
Dola_Pan31 分钟前
C语言:函数指针精讲
c语言·开发语言
离歌漠31 分钟前
C#调用C++ DLL方法之P/Invoke
c++·c#·p/invoke