1. 程式人生 > >GDAL--柵格轉向量

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資料參差不齊,建議直接去官網檢視相關類和函式。