gdal的矢量栅格化接口GDALRasterizeLayers使用(一)

作者:朱金灿

来源:http://blog.youkuaiyun.com/clever101

      

            gdal库提供了一个矢量栅格化接口函数GDALRasterizeLayers。今天让我们学习一下这个接口函数的使用。该函数的原型如下:

CPLErr GDALRasterizeLayers 	( 	GDALDatasetH  	hDS,
		int  	nBandCount,
		int *  	panBandList,
		int  	nLayerCount,
		OGRLayerH *  	pahLayers,
		GDALTransformerFunc  	pfnTransformer,
		void *  	pTransformArg,
		double *  	padfLayerBurnValues,
		char **  	papszOptions,
		GDALProgressFunc  	pfnProgress,
		void *  	pProgressArg	 
	) 	

下面解释下该接口的参数:

hDS  —— 输出的栅格数据,注意该数据必须以update模式打开

nBandCount —— 栅格数据要更新的波段数

panBandList  —— 要更新的波段列表

nLayerCount —— 矢量图层数,对应参数矢量图层数组pahLayers的元素个数

pahLayers  —— 矢量图层数组

pfnTransformer —— 将几何图形转换为栅格图像的像素/行列的转换器,如果该参数为空,则在内部创建一个。

pTransformArg ——将几何图形转换为栅格图像的像素/行列的转换器所用到的参数

padfLayerBurnValues—— 指定各个输出波段的输出像素值,因此一定是nBandCount个

papszOptions —— 控制栅格化的一系列选项值,是最复杂的一个参数,包括如下选项:

"ATTRIBUTE":

    指定属性字段中的字段值作为栅格值写入栅格文件中,该值将输出到所有输出波段中。假如该值指定了,padfLayerBurnValues参数的值将失效并且padfLayerBurnValues参数可以设置为NULL。

"CHUNKYSIZE":

指定该运行操作的块的高度。该值越大所需的计算时间越小。如果该值没有设置或者设置为0则由GDAL的缓存大小根据公式:缓存所占的字节数/扫描函数的字节数得到。所以该值不会超出缓存的大小。

"ALL_TOUCHED":

    设置为TRUE表示所有的像素接触到矢量中线或多边形(全部参与矢量化?),否则只是多边形中心或被brezenhams line algorithm算法(注:brezenhams line algorithm算法为一有名的矢量栅格化算法)选中的部分。默认值为FALSE。该选项暂时搞不明白,知道的同学请留言告诉我。

"BURN_VALUE_FROM":

    gdal的函数说明说该参数是用于设置几何图形的Z值,就是高程值。我搞不明白设置该值对栅格化有何影响。

"MERGE_ALG":

设置重写或增加新值到栅格数据中。选择REPLACE为 重写,选择ADD为添加一个新值到已存在的栅格数据中。默认值为REPLACE。

pfnProgress —— gdal的进度函数

pProgressArg —— 传递给进度函数的参数值

 

返回值:

CE_None 表示处理成功,CE_Failure表示有错误发生。

 

        值得注意的是,gdal的命令行程序gdal_rasterize也可以实现矢量栅格化,但该程序并不是直接调用GDALRasterizeLayers函数的,有兴趣的朋友可以看看gdal_rasterize的实现。计划以后提供一个GDALRasterizeLayers的使用例子程序。

 

参考文献:

 

1. gdal_alg.hFile Reference

2. GDAL源码剖析(四)之命令行程序说明二,作者李民录。

 

 



### 如何在 QT 中使用 GDAL 进行矢量处理 #### 1. 环境搭建 为了在 QT 中集成 GDAL 并进行矢量处理,首先需要确保 GDAL 和 QT 的环境已经正确配置。可以通过安装 GDAL 库以及设置其头文件和库路径来完成这过程[^4]。 #### 2. 使用 `GDALRasterizeLayers` 函数 GDAL 提供了个核心函数 `GDALRasterizeLayers` 来实现矢量数据的栅格功能。以下是该函数的核心签名: ```cpp CPLErr GDALRasterizeGeometries( GDALDatasetH hDS, int nBandCount, const int *panBandList, int nLayerCount, OGRLayerH *pahLayers, double dfBurnValue, char **papszOptions, GDALProgressFunc pfnProgress, void *pProgressData ); ``` 此函数允许指定输入矢量图层、目标栅格数据集以及其他选项(如烧录值等),并通过回调机制报告进度信息[^5]。 #### 3. 示例代码 以下是个完整的示例代码片段,展示如何在 QT 中利用 GDAL 实现矢量操作: ```cpp #include <qgsapplication.h> #include <qgsvectorlayer.h> #include <gdal_priv.h> int main(int argc, char* argv[]) { // 初始 QGIS 应用程序 QgsApplication app(argc, argv, true); QgsApplication::init(); QgsApplication::initQgis(); // 打开矢量图层 QString vectorFilePath = "/path/to/vector.shp"; QgsVectorLayer* vectorLayer = new QgsVectorLayer(vectorFilePath, "input_vector", "ogr"); if (!vectorLayer->isValid()) { qDebug() << "Failed to load vector layer!"; return -1; } // 创建个新的内存栅格数据集 GDALAllRegister(); GDALDriver *poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); GDALDataset *poDstDS = poDriver->Create("/path/to/output.tif", 100, 100, 1, GDT_Byte, nullptr); // 定义地理变换矩阵 (GeoTransform) double adfGeoTransform[6]; adfGeoTransform[0] = 0; // 左上角 X 坐标 adfGeoTransform[1] = 0.01; // 像素宽度 adfGeoTransform[2] = 0; // 行旋转角度 adfGeoTransform[3] = 0; // 左上角 Y 坐标 adfGeoTransform[4] = 0; // 列旋转角度 adfGeoTransform[5] = -0.01; // 像素高度 poDstDS->SetGeoTransform(adfGeoTransform); // 设置投影信息 OGRSpatialReference oSRS; oSRS.importFromEPSG(4326); // WGS84 投影 char *pszProjection = nullptr; oSRS.exportToWkt(&pszProjection); poDstDS->SetProjection(pszProjection); // 获取矢量图层句柄 OGRLayerH hSrcLayer = reinterpret_cast<OGRLayer *>(vectorLayer->handle()); // 调用 GDALRasterizeLayers 函数执行矢量 CPLErr eErr = GDALRasterizeLayers(poDstDS, 1, nullptr, 1, &hSrcLayer, 1, nullptr, nullptr, nullptr); if (eErr != CE_None) { qDebug() << "Error during rasterization!"; } else { qDebug() << "Rasterization completed successfully."; } // 清理资源 GDALClose(reinterpret_cast<GDALDatasetH>(poDstDS)); delete vectorLayer; QgsApplication::exitQgis(); return EXIT_SUCCESS; } ``` 上述代码展示了如何加载矢量图层,并将其转换为栅格图像存储到磁盘中。注意,这里假设输入矢量具有有效的几何形状,并且输出栅格的空间范围已预先定义好。 #### 4. 关键点解释 - **初始 QGIS**: 在 QT 程序中使用 QGIS 功能前需先调用 `QgsApplication::init()` 方法[^2]。 - **GDAL 数据集创建**: 使用 `GDALDriver::Create` 方法生成新的栅格数据集,并为其分配空间参考系和地理变换参数[^3]。 - **矢量图层获取**: 将 QGIS 矢量图层对象转为适合传递给 GDAL API 的原始指针形式。 - **进度监控**: 如果希望跟踪矢量进程,则可通过自定义回调函数替换默认的 NULL 参数。 --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

clever101

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

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

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

打赏作者

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

抵扣说明:

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

余额充值