乐于分享
好东西不私藏

GDAL 栅格工具:栅格矢量化(栅格转矢量)

GDAL 栅格工具:栅格矢量化(栅格转矢量)

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 详细使用方法见:

https://gdal.org/en/stable/programs/gdal_raster_polygonize.html#gdal-raster-polygonize

03

gdal pipeline

gdal pipeline 工具需 GDAL >= 3.12 版本才能使用。

使用 gdal pipeline 的 polygonize 步骤也可进行栅格矢量化操作,polygonize 步骤的选项参考 gdal raster polygonize

安装 GDAL 后,直接在 CMD 执行命令即可使用,如下:
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, 000, 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

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » GDAL 栅格工具:栅格矢量化(栅格转矢量)

猜你喜欢

  • 暂无文章