GDAL进度信息编写

GDAL库中的算法以及读写数据的时候一般都会提供两个与进度信息相关的参数,下面分别进行描述:

  • GDALProgressFunc pfnProgress
  • void * pProgressArg

GDALProgressFunc pfnProgress

GDALProgressFunc pfnProgress这个是一个回调函数,GDALProgressFunc的定义如下所示:

typedef int (CPL_STDCALL *GDALProgressFunc)(double dfComplete, const char *pszMessage, void *pProgressArg);

该回调函数接口中共声明了三个参数,分别是:

- dfComplete 处理进度信息,0~1之间的数字

- pszMessage 处理进度消息,用于显示在进度控件上

- pProgressArg 回调函数参数

void * pProgressArg

pProgressArg直接会作为回调函数的第三个参数,传入回调函数中。关于这个函数参数的使用请参考我之前的相关博客


一个简单的进度示例

/**
* @brief 示例函数
* @param pszSrcFile 输入数据
* @param pszDstFie 输出数据
* @param pfnProgress 进度信息回调函数
* @param pProgressArg 进度信息回调函数参数
* @return 返回值,处理成功返回CE_None
*/
CPLErr TestFunction(const char* pszSrcFile,
const char* pszDstFile,
GDALProgressFunc pfnProgress = NULL,
void * pProgressArg = NULL)
{
// 如果没有指定进度条回调函数,使用GDAL库中的默认回调函数
if(pfnProgress == NULL)
pfnProgress = GDALDummyProgress; // 设置进度信息以及初值为0,可同时设置处理信息
if(!pfnProgress(0.0, "Start ....", pProgressArg))
{
CPLError(CE_Failure, CPLE_UserInterrupt, "User terminated");
return CE_Failure;
} // 一个示例的循环,里面描述了更新进度信息
for (int i=0; i<100; i++)
{
//do something if(!pfnProgress((i+1.0)/100, "Processing ....", pProgressArg))
{
CPLError(CE_Failure, CPLE_UserInterrupt, "User terminated");
return CE_Failure;
}
} // 处理完成,将进度信息更新为1,可同时设置处理信息
if(!pfnProgress(1.0, "End ....", pProgressArg))
{
CPLError(CE_Failure, CPLErnterrupt, "User terminated");
retun CE_Failure;
} return CE_None;
}

在调用时与调用GDAL其他的进度信息一致,下面是一个简单的调用示例:

void main()
{
//进度条回调函数,这里使用GDAL自带的一个控制台进度函数
GDALProgressFunc pfnProgress = GDALTermProgress;
//进度条回调函数参数,该参数需与回调函数配合使用 void * pProgressArg = NULL;
const char *pszSrcFile = "input.tif";
const char *pszDstFile = "Output.tif"; CPLErr Err = TestFunction(pszSrcFile, pszDstFile, pfnProgress, pProgressArg); return;
}

GDAL库进度信息编写示例的更多相关文章

  1. C#调用GDAL算法进度信息传递

    GDAL库中提供了很多的算法,同时也提供了进度条的参数.对于C++调用来说,应该没什么问题,但是对C#调用来说,在进度条这块需要写一个代理来进行传递.首先写一个简单的测试代码. 首先定义一个委托函数原 ...

  2. 老李推荐: 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例

    老李推荐: 第3章1节<MonkeyRunner源码剖析>脚本编写示例: MonkeyRunner API使用示例   MonkeyRunner这个类可以说是编写monkeyrunner脚 ...

  3. GDAL库扩展Landsat系列MTL文件格式支持

    Landsat系列卫星提供的数据,一般都是每个波段一个tif文件,然后外加一个MTL.txt的元数据文件,使用gdal可以直接打开每个波段的tif文件,但是有时候想在打开tif数据的同时能够自动读取M ...

  4. GDAL库中WFS服务中含有中文不能获取数据的问题

    GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别.通过调试发现,其原因有下面两点: 1.输入的URL路径没有使用UTF8编码而从网 ...

  5. 基于GDAL库海洋表温日平均计算工具设计与实现 C++版

    技术背景 在对物理海洋数据处理过程中,表层温度是众多要素中的一种,本文书要是针对海洋表温数据批量日平均处理的一个工具设计.首先要在对当前的SST数据文件作一下简要的说明,SST全称为sea surfe ...

  6. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  7. C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

    部分源码选自GDAL库的官方网址:www.gdal.org,其余的代码为笔者自己编写. // readfile.cpp : 定义控制台应用程序的入口点. // /* part of the codes ...

  8. GDAL库——读取图像并提取基本信息

    GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL ...

  9. 使用VB6写一个自定义的进度信息框窗口

    一.起因说明 之前有些项目是用Access完成的,当时为了给用户显示一些进度信息,自制了一个进度信息窗体,类似下图所示: 随着项目不断变迁,需要将进度信息按阶段及子进度进行显示,并且出于代码封装的需求 ...

随机推荐

  1. Windows安装SVN服务器和客户端

    我的操作系统版本是windows10 64位.接下来我会先介绍SVN服务器的安装,然后再介绍安装SVN客户端,并进行测试. 下载 首先我们需要到官网上去下载svn服务器程序. [svn官网地址] (h ...

  2. Java基础——字符串String

    String类 1. String类位于java.lang包中,使用时无需导包. 2. 创建字符串的两种方式: ① 直接指定(字面量声明):String str = "abc"; ...

  3. 阿里移动云专场专题.md

    小激动 一年一度的阿里云栖大会是我们开发者的盛会,带着着激动的心情参加了这次开发者盛会,二话不说进入会场就被震感到了,先来张图聊表敬意. 主会场马云爸爸还是很有范的,将未来定义为无法定义,在这里宣布成 ...

  4. js判断网络连通性

    js判断网络连通性 if (window.navigator.onLine == true) {                         console.log("首次 -- 已连接 ...

  5. 开发一款APP所需要的时间

    "要多少钱""要多少时间"这应该是一个企业在打算开发一款APP时问到最多的问题了.的确,现在的人不管做什么事情都讲究计划,更何况在这个时间就是金钱的时代,企业如 ...

  6. [LeetCode] Number Complement 补数

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  7. 基于线程池的多线程售票demo2.0(原创)

    继上回基于线程池的多线程售票demo,具体链接: http://www.cnblogs.com/xifenglou/p/8807323.html以上算是单机版的实现,特别使用了redis 实现分布式锁 ...

  8. 用js来实现那些数据结构08(链表02-双向链表)

    其实无论在任何语言中,一种数据结构往往会有很多的延伸和变种以应对不同场景的需要.其实前面我们所学过的栈和队列也是可以用链表来实现的.有兴趣的小伙伴可以自己尝试着去实现以下. 有点跑题了...,我们还是 ...

  9. 用redis的订阅发布解决了扫码支付实时响应的问题

    一.场景描述: PC收银台的浏览器展示了收款二维码,用户扫了支付二维码,支付完成后,浏览器需要实时响应支付结果. 二.问题描述: 扫码支付的支付结果一般通过服务端回调和主动查询来获取,显示二维码之后, ...

  10. [NOI 2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...