GDAL--柵格轉向量
阿新 • • 發佈:2019-01-30
前言
最近幫同學寫了幾個小程式,包括用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資料參差不齊,建議直接去官網檢視相關類和函式。