【GDAL代码实践01】GDALOpenEx函数详解

为了方便下次找到文章,也方便联系我给大家提供帮助,欢迎大家点赞👍、收藏📂和关注🔔!一起讨论技术问题💻,一起学习成长📚!如果你有任何问题或想法,随时留言,我会尽快回复哦😊!


近年来,人工智能(AI)技术,尤其是大模型的快速发展,打开了全新的时代大门。对于想要在这个时代迅速成长并提升自身能力的个人而言,学会利用AI辅助学习已经成为一种趋势。不论是国内的文心一言、豆包,还是国外的ChatGPT、Claude,它们都能成为我们编程学习的有力助手。利用AI进行编程学习将大大提升自己的编程学习效率,这里给大家推荐一个我自己在用的集成ChatGPT和Claude的网站(国内可用,站点稳定):传送门

抓住AI时代每一个机会,加速自己成长,提高自己的核心价值!

1. 概述

GDALOpenEx 是 GDAL 库中用于打开矢量或栅格文件的主要函数之一。它是对早期 GDALOpen 的增强版,提供了更灵活的功能,当我们使用时可以通过设置不同的参数来控制打开文件的行为。无论是打开 Shapefile 这样的矢量文件,还是像 GeoTIFF 这样的栅格文件,GDALOpenEx 都可以轻松处理。

2. 函数原型

GDALDatasetH GDALOpenEx(
    const char *pszFilename,
    unsigned int nOpenFlags,
    const char *const *papszAllowedDrivers,
    const char *const *papszOpenOptions,
    const char *const *papszSiblingFiles
);

3. 参数详解

3.1 pszFilename (文件名)

  • 类型const char*
  • 作用:指定要打开的文件的名称。可以是本地路径或 URL,还可以是虚拟文件系统中的路径(例如 /vsizip//vsicurl/)。
  • 注意:该参数应当是 UTF-8 编码,尤其是在处理非英文路径时需要特别注意编码问题。

3.2 nOpenFlags (打开标志)

  • 类型unsigned int

  • 作用:控制文件打开的方式,可以通过逻辑 “或” 运算符组合多个标志。常见的标志有:

    • GDAL_OF_RASTER:打开栅格数据。
    • GDAL_OF_VECTOR:打开矢量数据。
    • GDAL_OF_READONLY:以只读模式打开文件。
    • GDAL_OF_UPDATE:以更新模式(读写模式)打开文件。
    • GDAL_OF_VERBOSE_ERROR:当文件打开失败时,提供详细的错误信息。
  • 示例:如果你想以只读方式打开矢量数据,可以这样使用:

    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpenEx("data.shp", GDAL_OF_VECTOR | GDAL_OF_READONLY, NULL, NULL, NULL));
    

3.3 papszAllowedDrivers (允许的驱动)

  • 类型const char* const*

  • 作用:指定要使用的驱动程序(如 ESRI ShapefileGeoTIFF 等)。如果传入 NULL,则考虑所有已注册的驱动。

  • 应用场景:在处理某些文件时,你可能希望只使用特定的驱动来确保兼容性或效率。例如,只使用 ESRI Shapefile 驱动来读取 .shp 文件:

    const char* drivers[] = { "ESRI Shapefile", NULL };
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpenEx("data.shp", GDAL_OF_VECTOR | GDAL_OF_READONLY, drivers, NULL, NULL));
    

3.4 papszOpenOptions (打开选项)

  • 类型const char* const*

  • 作用:给驱动程序传递特定的打开选项。例如,对于 GeoTIFF 文件,可能会使用压缩或指定某个特定的层级(overview level)。

  • 示例:如果你想选择特定的 overview 层,可以这样传递选项:

    const char* options[] = { "OVERVIEW_LEVEL=1", NULL };
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpenEx("data.tif", GDAL_OF_RASTER | GDAL_OF_READONLY, NULL, options, NULL));
    

3.5 papszSiblingFiles (同级文件)

  • 类型const char* const*

  • 作用:如果要打开的文件有多个相关联的文件(例如 Shapefile 的 .shp.shx.dbf 文件),可以通过这个参数传递这些文件的列表。传入 NULL 时,函数会自动扫描文件目录。

  • 应用场景:当打开包含多个文件的数据集时,传入文件列表可以加快搜索速度,减少文件系统的扫描时间。例如,打开 Shapefile 时传入所有关联文件:

    const char* siblingFiles[] = { "data.shp", "data.shx", "data.dbf", NULL };
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpenEx("data.shp", GDAL_OF_VECTOR | GDAL_OF_READONLY, NULL, NULL, siblingFiles));
    

4. 返回值

  • 返回类型GDALDatasetH(一个句柄)
  • 描述:如果打开成功,返回一个 GDALDatasetH 句柄(可以被强制转换为 GDALDataset* 类型)。如果失败,则返回 NULL,并且可以通过 GDAL 的错误机制获得更多详细信息。
  • 用法:你可以使用 static_cast<GDALDataset*> 将返回的 GDALDatasetH 转换为 GDALDataset*,这样便可以调用 GDAL 提供的操作数据集的方法。

👉 更多细节 可以到 GDAL 官网的 documentation 查看该函数定义:gdal.h: Raster C API — GDAL documentation 🌐📄


5. 示例代码

下面是一个使用 GDALOpenEx 打开一个 Shapefile 文件的示例代码:

#include "gdal_priv.h"
#include "ogrsf_frmts.h"
#include <iostream>

int main() {
    // 注册所有的 GDAL 驱动
    GDALAllRegister();

    // 打开一个 Shapefile 文件,以只读模式
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpenEx("example.shp", GDAL_OF_VECTOR | GDAL_OF_READONLY, NULL, NULL, NULL));

    if (dataset == NULL) {
        std::cerr << "Failed to open dataset." << std::endl;
        return 1;
    }

    // 获取并打印 Shapefile 中的第一个图层名称
    OGRLayer* layer = dataset->GetLayer(0);
    if (layer != NULL) {
        std::cout << "Layer name: " << layer->GetName() << std::endl;
    }

    // 关闭数据集
    GDALClose(dataset);
    return 0;
}

6. 总结

GDALOpenEx 是一个非常灵活和强大的函数,它允许你通过设置不同的标志和选项来打开各种数据集格式。无论你是处理栅格数据、矢量数据,还是压缩文件和远程文件,GDALOpenEx 都能提供有效的解决方案。

通过熟悉 GDALOpenEx 的各种参数和标志,你可以在项目中高效地使用它来读取和处理地理空间数据集。

转载请注明出处
作者:BQ
主页:bqcode.blog.csdn.net
公众号:BQ经验书
QQ群:958124241
Learn Together!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BQ-Code

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

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

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

打赏作者

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

抵扣说明:

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

余额充值