C++栅格转矢量

本文参考自https://blog.csdn.net/liminlu0314/article/details/6203554

在上面的基础上做了一些改动,适用于gdal201或更高版本。

这里主要对gdal提供的GDALPolygonize接口封装了一个函数,但是里面一些东西应该按照具体情况做修改。比如说:

  1. 默认处理栅格的第一个波段。
  2. 转化的矢量图层属性字段写死为"DF",字段类型写死为"OFTInteger"。

接口介绍

CPLErr CPL_DLL CPL_STDCALL
GDALPolygonize( GDALRasterBandH hSrcBand,       //输入栅格图像波段
                GDALRasterBandH hMaskBand,      //掩码图像波段,可以为NULL
                OGRLayerH hOutLayer,            //矢量化后的矢量图层
                int iPixValField,               //需要将像元DN值写入矢量属性字段的字段索引
                char **papszOptions,            //算法选项,目前算法中没有用到,设置为NULL即可
                GDALProgressFunc pfnProgress,   //进度条回调函数
                void * pProgressArg );          //进度条参数

一个封装的例子:

//栅格矢量化,默认处理第一波段
int ImagePolygonize(const char*pszSrcFile,const char*pszDstFile,const char* pszFormat="ESRI Shapefile", int BandNum=1)
{
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");//支持中文路径
	GDALAllRegister();
	OGRRegisterAll();
	GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(pszSrcFile, GA_ReadOnly);
	if (poSrcDS==NULL)
	{
		printf("无法打开栅格文件");
		return 0;
	}
	GDALDriver* poDriver;
	poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
	if (poDriver == NULL)
	{
		GDALClose((GDALDatasetH)poSrcDS);
		return 0;
	}
	//根据文件名创建输出矢量文件
	GDALDataset* poDstDS = poDriver->Create(pszDstFile, 0, 0, 0, GDT_Unknown, NULL);
	if (poDstDS == NULL)
	{
		GDALClose((GDALDatasetH)poSrcDS);
		return 0;
	}
	// 定义空间参考,与输入图像相同
	OGRSpatialReference* poSpatialRef = new OGRSpatialReference(poSrcDS->GetProjectionRef());
	OGRLayer* poLayer = poDstDS->CreateLayer("Result", poSpatialRef, wkbPolygon, NULL);
	if (poDstDS == NULL)
	{
		GDALClose((GDALDatasetH)poSrcDS);
		GDALClose(poDstDS);
		delete poSpatialRef;
		poSpatialRef = NULL;
		return 0;
	}
	//创建属性表
	OGRFieldDefn ofieldDef("DF", OFTInteger);
	if (poLayer->CreateField(&ofieldDef) != OGRERR_NONE)
	{
		GDALClose((GDALDatasetH)poSrcDS);
		GDALClose(poDstDS);
		delete poSpatialRef;
		poSpatialRef = NULL;
		return 0;
	}
	GDALRasterBandH hSrcBand = (GDALRasterBandH)poSrcDS->GetRasterBand(1);
	if (GDALPolygonize(hSrcBand, NULL, (OGRLayerH)poLayer, 0, NULL, GDALTermProgress, NULL) != CE_None)
	{
		GDALClose((GDALDatasetH)poSrcDS);
		GDALClose(poDstDS);
		delete poSpatialRef;
		poSpatialRef = NULL;
		return 0;
	}
	GDALClose((GDALDatasetH)poSrcDS);
	GDALClose(poDstDS);
	//delete poSpatialRef;
	poSpatialRef = NULL;
	return 1;
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OpenCV是一个开源计算机视觉库,而GDAL是一个开源地理数据抽象库。如果我们想要将数据换为矢量数据,可以结合使用这两个库。 首先,我们需要使用GDAL库读取我们的数据。通过GDAL的函数,我们可以读取地理数据文件,获取数据的各种属性和元数据信息。 接下来,我们可以将读取到的数据换为OpenCV的Mat数据结构。这可以通过将GDAL数据的像素信息复制到OpenCV的Mat结构中完成。在此过程中,我们可以选择是否对数据进行一些预处理或者调整像素值的范围,以便更好地处理。 接着,我们可以使用OpenCV中的图像处理函数对Mat数据进行分割和提取,以获取中感兴趣的区域。可以采用一些特定的阈值或者图像分割算法来实现这一步骤。 一旦我们得到了感兴趣的区域,我们就可以将其换为矢量数据。为了做到这一点,我们可以使用OpenCV中的轮廓检测函数,例如findContours(),来找到感兴趣区域的边界。然后,我们可以将边界点换为矢量数据,并保存为矢量数据文件,例如Shapefile式。 最后,我们可以使用GDAL库来读取和处理保存的矢量数据文件。通过GDAL的函数,我们可以获取矢量数据的各种属性和几何信息,进行分析和可视化。 综上所述,通过结合使用OpenCV和GDAL库,我们可以实现数据到矢量数据的换。这种方法可以应用于各种领域,例如遥感图像分析、地理信息系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值