GDAL将内存数据生成等高线——GDAL_CG_Create创建等高线生成器

前言

网上关于GDAL等高线生成的示例全是GDALContourGenerate函数相关的,为加快等高线生成速度,某项目需要对内存数据进行等高线生成,恰好GDAL提供了相应的算法。

要想调用GDAL的算法进行等高线生成,需包含头文件:

#include <gdal_alg.h>

该头文件包含了GDAL的算法接口,等高线生成的函数接口也在其中。

1. 如何使用?

以下将从GDAL的函数原型、参数解释、示例代码等方面对GDAL等高线算法进行介绍。
注意:以下内容是对内存数据(数组)进行操作!!!

1.1 GDAL函数原型

从GDAL源码中(gdal_alg.h)可以看到,创建等高线生成器的函数原型如下:

GDALContourGeneratorH CPL_DLL
GDAL_CG_Create( int nWidth, int nHeight,
                int bNoDataSet, double dfNoDataValue,
                double dfContourInterval, double dfContourBase,
                GDALContourWriter pfnWriter, void *pCBData );

该函数返回一个等高线生成器—GDALContourGeneratorH,其参数解释如下:

int nWidth:数据块的宽度
int nHeight:数据块的高度
int bNoDataSet:数据块中是否存在无数据值
double dfNoDataValue:如果数据块中存在无数据值,该无数据值是多少
double dfContourInterval:等高线间隔
double dfContourBase:等高线起始值
GDALContourWriter pfnWriter:等高线写操作器
void *pCBData:传给等高线写操作器的数据

上述等高线写操作器是什么东西??
这是GDAL的gdal_alg.h头文件中定义的一个回调函数,该函数原型如下:

typedef CPLErr (*GDALContourWriter)( double dfLevel, int nPoints,
                                     double *padfX, double *padfY, void * );

该函数的参数解释如下:

double dfLevel:等高线的层级
int nPoints:当前行数据里等高线的点数
double *padfX:当前行数据里等高线点的X坐标数组
double *padfY:当前行数据里等高线点的Y坐标数组
void *:传给等高线写操作器的数据

上述GDAL接口只是创建了等高线生成器,那么内存数据块是如何传给等高线生成器进行等高线的生成呢?
从GDAL的源码中,紧跟在GDAL_CG_Create函数后的是GDAL_CG_FeedLine函数,该函数就是将内存数据块传递给GDAL的等高线生成器的重要函数。
下面的代码是GDAL_CG_FeedLine函数的一般用法:

    for (int i = 0; i < m_pInput->height(); ++i)
    {
        GDAL_CG_FeedLine(cg, pScanLine);
        pScanLine += m_pInput->width();
    }

上述代码中,m_pInput就是输入的内存数据块,是一个width * height大小的数组,通过遍历数组的每一行,将行数据传递给等高线生成器,再在上文提到的等高线写操作器里将等高线数据进行处理(导出或者绘制)。

1.2 等高线生成器的示例代码

  1. 创建等高线生成器
    GDALContourGeneratorH cg = GDAL_CG_Create(m_pInput->width(), m_pInput->height(),
                                              m_pInput->hasNoDataValue(), m_pInput->noDataValue(),
                                              m_dContourInterval, m_dContourBase,
                                              rasterContourWriter, static_cast<void*>(&cwd));

    double *pScanLine = (double*)(m_pInput->data());

    for (int i = 0; i < m_pInput->height(); ++i)
    {
        GDAL_CG_FeedLine(cg, pScanLine);
        pScanLine += m_pInput->width();
    }
  1. 自定义等高线写操作器及其需要的数据
CPLErr rasterContourWriter(double dfLevel, int nPoints, double *padfX, double *padfY, void *ptr)
{
    ContourWriterData *data = static_cast<ContourWriterData *>(ptr);

    QPolygonF polygon(nPoints);
    QPointF *d = polygon.data();
    for (int i = 0; i < nPoints; i++)
    {
        d[i] = QPointF(padfX[i], padfY[i]);
    }

    data->painter->drawPolyline(polygon);
    return CE_None;
}

该函数即是GDAL的等等高线写操作器

  1. 等高线写操作器的数据
struct ContourWriterData
{
    QPainter* painter;
};

上述示例代码中,等高线写操作器仅仅只是将生成的等高线数据绘制到QImage上,并未进行等高线数据导出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

geocat

球球大佬们赏赐点吃喝!

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

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

打赏作者

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

抵扣说明:

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

余额充值