GDAL--栅格转矢量

前言

最近帮同学写了几个小程序,包括用GDAL实现栅格数据转矢量数据。网上相关文章不多,而且大多因为版本等一系列原因存在较多bug。我参考相关文章和GDAL官网的函数说明写了一个完整的程序,并记录下来。


代码

#include "gdal_priv.h"  
#include "ogrsf_frmts.h" //for ogr  
#include "gdal_alg.h"  //for GDALPolygonize  

int Raster2Vector(const char * pszSrcFile, const char* pszDstFile, const char* pszFormat);//栅格转矢量

int main()
{
    const char* pszSrcFile = "C:\\Users\\liuwei\\Desktop\\2.jpg";//输入栅格数据路径
    const char* pszDstFile = "C:\\Users\\liuwei\\Desktop\\shp\\out.shp";//输出矢量数据路径
    Raster2Vector(pszSrcFile, pszDstFile, "ESRI Shapefile");
    return 0;
}

int Raster2Vector(const char * pszSrcFile, const char* pszDstFile, const char* pszFormat)
{
    GDALAllRegister();//注册驱动
    CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");//解决中文乱码问题

    GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(pszSrcFile, GA_ReadOnly);
    if (poSrcDS == NULL)
    {
        return 0;
    }
    // 根据Shapefile驱动创建输出矢量文件  
    GDALDriver *poDriver;
    poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
    if (poDriver == NULL)
    {
        printf("%s driver not available.\n", pszFormat);
        exit(1);
    }
    //根据文件名创建输出矢量数据集 
    GDALDataset* poDstDS = poDriver->Create(pszDstFile, 0, 0, 0, GDT_Unknown, NULL);
    if (poDstDS == NULL)
    {
        printf("Creation of output file failed.\n");
        exit(1);
    }
    // 定义空间参考,与输入图像相同 
    OGRSpatialReference *poSpatialRef = new OGRSpatialReference(poSrcDS->GetProjectionRef());
    if (poSpatialRef == NULL)
    {
        return 0;
    }
    OGRLayer* poLayer = poDstDS->CreateLayer("DstLayer", poSpatialRef, wkbPolygon, NULL);//创建图层
    if (poDstDS == NULL)
    {
        GDALClose(poSrcDS);
        GDALClose(poDstDS);
        delete poSpatialRef;
        return 0;
    }

    OGRFieldDefn oField("value", OFTInteger);//创建属性表,只有一个字段即“value”,里面保存对应栅格的像元值
    if (poLayer->CreateField(&oField) != OGRERR_NONE)
    {
        printf("Creating Name field failed.\n");
        exit(1);
    }

    GDALRasterBandH hSrcBand = (GDALRasterBandH)poSrcDS->GetRasterBand(1); //获取图像的第一个波段
    GDALPolygonize(hSrcBand, NULL, (OGRLayerH)poLayer, 0, NULL, NULL, NULL); //调用栅格矢量化 
    GDALClose(poSrcDS); //关闭文件  
    GDALClose(poDstDS);
    return 1;
}

说明

1.栅格转矢量是使用GDAL库实现的,GDAL环境配置可以参考以下博客:配置GDAL环境。
2.关键是GDALPolygonize()这个栅格矢量化函数,可以直接在GDAL官网Files目录gdal_alg.h中查看函数详情。
3.网上GDAL资料参差不齐,建议直接去官网查看相关类和函数。

你可能感兴趣的:(GIS)