GDAL 栅格工具:栅格矢量化(栅格转矢量)
-
gdal_polygonize(命令行工具) -
gdal raster polygonize(命令行工具) -
gdal pipeline(命令行工具) -
GDALPolygonize()(C API 函数) -
GDALFPolygonize()(C API 函数)
01
—
gdal_polygonize
gdal_polygonize 是一个 Python 脚本,需要安装 GDAL Python 绑定才能使用。
在 Python 环境执行 gdal_polygonize 脚本命令即可使用:
gdal_polygonize input.tif polygonize.shp
转换后的矢量数据包含一个默认的 DN 属性,记录转换前的像元值。
但是 gdal_polygonize 只适合处理像元值为整型的图像,对于浮点型像元值,gdal_polygonize 会先将其转为整型后,再进行矢量化,所以转换后的矢量属性值也只保留整型。
gdal_polygonize 详细使用方法见:
https://gdal.org/en/stable/programs/gdal_polygonize.html
02
—
gdal raster polygonize
gdal raster polygonize 工具需 GDAL >= 3.11 版本才能使用。
安装 GDAL 后,直接在 CMD 执行命令即可使用,如下:
gdal raster polygonize input.tif polygonize.shp
gdal raster polygonize 矢量化后的属性值根据原图像数据类型保留整型或浮点型。
gdal raster polygonize 详细使用方法见:
03
—
gdal pipeline
gdal pipeline 工具需 GDAL >= 3.12 版本才能使用。
使用 gdal pipeline 的 polygonize 步骤也可进行栅格矢量化操作,polygonize 步骤的选项参考 gdal raster polygonize。
gdal pipeline ! read input.tif ! polygonize ! write polygonize.shp
gdal pipeline 详细使用方法见:
https://gdal.org/en/stable/programs/gdal_pipeline.html#gdal-pipeline
04
—
GDALPolygonize()
GDALFPolygonize()
栅格矢量化也可以通过 GDAL C API 的 GDALPolygonize() 和 GDALFPolygonize() 函数实现,分别用于处理整数类型图像和浮点数类型图像。
使用方法如下:
#include"gdal_priv.h"#include"gdal_alg.h"#include"ogr_api.h"intmain(){GDALAllRegister();// 读取栅格数据const char* pszSrcFilename = "input.tif";const GDALAccess eAccess = GA_ReadOnly;GDALDatasetH hDataset = GDALOpen(pszSrcFilename, eAccess);// 获取第一个波段,判断数据类型是否为整型GDALRasterBandH hBand = GDALGetRasterBand(hDataset, 1);GDALDataType eDT = GDALGetRasterDataType(hBand);int isDataTypeInteger = GDALDataTypeIsInteger(eDT);// 定义输出图层const char* pszDriverName = "ESRI Shapefile";GDALDriver* hDriver = (GDALDriver*)GDALGetDriverByName(pszDriverName);const char* pszDstFilename = "polygonize.shp";GDALDatasetH hDS = GDALCreate(hDriver, pszDstFilename, 0, 0, 0, GDT_Unknown, NULL);OGRSpatialReferenceH hSRS = GDALGetSpatialRef(hDataset);OGRLayerH hLayer = GDALDatasetCreateLayer(hDS, "polygonize", hSRS, wkbPolygon, NULL);// 创建图层属性字段const char* pszElevAttrib = "DN";OGRFieldDefnH hFieldDefn = OGR_Fld_Create(pszElevAttrib,!isDataTypeInteger ? OFTReal: eDT == GDT_Int64 || eDT == GDT_UInt64? OFTInteger64: OFTInteger);OGR_L_CreateField(hLayer, hFieldDefn, FALSE);OGR_Fld_Destroy(hFieldDefn);// 矢量化CPLErr eErr;if (isDataTypeInteger){eErr = GDALPolygonize(hBand,GDALGetMaskBand(hBand),hLayer,0,NULL,NULL,NULL);}else{eErr = GDALFPolygonize(hBand,GDALGetMaskBand(hBand),hLayer,0,NULL,NULL,NULL);}GDALClose(hDataset);GDALDestroyDriverManager();OGRCleanupAll();return (eErr == CE_None) ? 0 : 1;}
详细使用方法见:
https://gdal.org/en/stable/api/gdal_alg.html#_CPPv414GDALPolygonize15GDALRasterBandH15GDALRasterBandH9OGRLayerHiPPc16GDALProgressFuncPv
https://gdal.org/en/stable/api/gdal_alg.html#_CPPv415GDALFPolygonize15GDALRasterBandH15GDALRasterBandH9OGRLayerHiPPc16GDALProgressFuncPv
夜雨聆风