gdal柵格矢量化


第7.15節 柵格矢量化 —— 《GDAL源碼剖析與開發指南》https://baike.baidu.com/item/GDAL源碼剖析與開發指南/16419427

#include "gdal_alg.h"

柵格矢量化功能用於將柵格數據生成矢量數據,通常用於分類圖像。GDAL庫中使用函數GDALPolygonize()或者函數GDALFPolygonize()來完成該功能。

CPLErr GDALPolygonize(GDALRasterBandH hSrcBand, GDALRasterBandH hMaskBand, OGRLayerH hOutLayer, int iPixValField, char **papszOptions, GDALProgressFunc pfnProgress, void *pProgressArg)

參數:

hSrcBand:輸入數據波段指針

hMaskBand:掩碼數據波段指針

hOutLayer:輸出矢量文件圖層指針

iPixValField:設置矢量圖層中保存像元值的字段序號

papszOptions:設置算法選項,目前僅支持“8 Connected”

pfnProgress:進度回調函數

pProgressArg:進度回調函數參數

返回值:返回CE_None表示執行成功,返回CE_Failure表示執行失敗

下面對該函數進行簡單封裝:

#include "gdal_alg.h"
int
ImagePolygonize(const char* pszSrcFile, const char* pszDstFile, const char* pszFormat, GDALProgressFunc *pProgress) { if (pProgress != NULL) { printf("開始計算柵格矢量化..."); } GDALAllRegister(); OGRRegisterAll(); GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(pszSrcFile, GA_ReadOnly); //打開柵格圖像 if (poSrcDS == NULL) { if (pProgress != NULL) printf("不能打開指定文件,請檢查文件是否存在!"); return 0; } /* *此處,參考李民錄老師的代碼為: *OGRSFDriver* poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszFormat); *這里會報這樣的錯誤:error: C2440: “初始化”: 無法從“GDALDriver *”轉換為“OGRSFDriver *” *所以,我們用GDALDriver替代,但是GDALDriver類中沒有定義GetRegistrar()方法,查閱了原始文檔,發現可以用同作用的GetGDALDriverManager()方法進行獲取驅動。 */ GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);//為什么是GDALDriver也可以替作OGRSFDriver if (poDriver == NULL) { if (pProgress != NULL) printf("不能創建指定類型文件!"); GDALClose((GDALDatasetH)poSrcDS); return 0; } /* *此處,參考李民錄老師的代碼為: *OGRDataSource* poDstDS = poDriver->CreateDataSource(pszDstFile, NULL); *上面的代碼,我們將OGRDriver替代為GDALDriver,在這個類中沒有CreateDataSource()的定義, *可以用這個類中的 *Create (const char *pszName, int nXSize, int nYSize, int nBands, GDALDataType eType, char **papszOptions) *替代,這個方法主要用於創建柵格文件的新數據集,其中nXSize,nYSize,nBands,都是對柵格文件的描述,**都置零后台會默認創建矢量數據集** */ GDALDataset* poDstDS = poDriver->Create(pszDstFile, 0, 0, 0, GDT_Unknown, NULL); //創建輸出矢量文件 if (poDstDS == NULL) { if (pProgress != NULL) printf("不能創建指定類型文件!"); GDALClose((GDALDatasetH)poSrcDS); return 0; } OGRSpatialReference *poSpatialRef = new OGRSpatialReference(poSrcDS->GetProjectionRef()); OGRLayer* poLayer = poDstDS->CreateLayer("Result", poSpatialRef, wkbPolygon, NULL); if (poLayer == NULL) { if (pProgress != NULL) printf("創建矢量圖層失敗!"); GDALClose((GDALDatasetH)poSrcDS); GDALClose(poDstDS); OSRDestroySpatialReference(poSpatialRef); poSpatialRef = NULL; return 0; } OGRFieldDefn ofieldDef("DN", OFTInteger); //創建屬性表,只有一個字段即“DN”,里面保存對應的柵格的像元值 if (poLayer->CreateField(&ofieldDef) != OGRERR_NONE) { if (pProgress != NULL) printf("創建矢量圖層屬性表失敗!"); GDALClose((GDALDatasetH)poSrcDS); GDALClose(poDstDS); OSRDestroySpatialReference(poSpatialRef); poSpatialRef = NULL; return 0; } GDALRasterBandH hSrcBand = (GDALRasterBandH)poSrcDS->GetRasterBand(1); //獲取圖像的第一個波段 if (GDALPolygonize(hSrcBand, NULL, (OGRLayerH)poLayer, 0, NULL, NULL, pProgress) != CE_None)//調用柵格矢量化 { if (pProgress != NULL) printf("計算失敗!"); GDALClose((GDALDatasetH)poSrcDS); GDALClose(poDstDS); /*這里在李民錄老師的代碼中是:delete poSpatialRef; 在我的程序運行過程中,會從此處跳出,然 *后我去找了替代的方法,OGRSpatialReference(OGR空間 *參考系統)的析構函數,這個類沒有被替代掉,但是依然會跳出,所以直接被我注釋掉了,這里由 *於不會進入if條件語句所以沒有進行注釋 */ OSRDestroySpatialReference(poSpatialRef); poSpatialRef = NULL; return 0; } GDALClose((GDALDatasetH)poSrcDS); //關閉文件 GDALClose(poDstDS); // OSRDestroySpatialReference(poSpatialRef); poSpatialRef = NULL; if (pProgress != NULL) printf("計算成功!"); return 1; } void main() { ImagePolygonize("2.jpg","0.shp","ESRI Shapefile",NULL); }

 

第1章 GDAL簡介
  1.1 什么是GDAL
  1.2 GDAL特點
  1.3 GDAL支持的數據格式
  1.4 GDAL源碼下載
  1.5 GDAL源碼目錄
  1.5.1 文件夾說明
  1.5.2 文件說明
  1.6 GDAL編譯
  1.6.1 常規編譯
  1.6.2 自定義編譯
  1.6.3 編譯其他方面
  1.7 SWIG編譯
  1.7.1 SWIG簡介
  1.7.2 編譯C#版本GDAL
  1.7.3 編譯Python版本GDAL
  1.7.4 編譯Java版本GDAL
  1.8 GDAL幫助文檔生成
  1.8.1 Doxygen簡介
  1.8.2 生成GDAL開發幫助文檔
  1.9 簡單的調用
  1.9.1 C++使用GDAL
  1.9.2 C#使用GDAL
  1.9.3 Python使用GDAL
  1.9.4 Java使用GDAL
  1.9.5 調試GDAL源代碼
  第2章 OGR空間參考
  2.1 空間參考簡介
  2.1.1 大地水准面
  2.1.2 地球橢球體
  2.1.3 基准面
  2.1.4 地圖投影
  2.2 OGR空間參考
  2.2.1 OGR空間參考簡介
  2.2.2 OGR空間參考說明
  2.3 OGR空間參考坐標轉換
  2.4 OGR空間參考類說明
  2.4.1 OGRSpatialReference類
  2.4.2 OGRCoordinateTransformation類
  2.5 OGR空間參考使用示例
  2.5.1 C++使用
  2.5.2 C#使用
  2.5.3 Python使用
  2.5.4 Java使用
  第3章 OGR庫說明
  3.1 OGR體系結構
  3.1.1 Geometry(幾何對象)
  3.1.2 Spatial Reference(空間參考)
  3.1.3 Feature/Feature Definition(要素/要素定義)
  3.1.4 Layer(圖層)
  3.1.5 Data Source(數據源)
  3.1.6 Drivers(格式驅動)
  3.2 OGR常用類說明
  3.2.1 OGRSFDriver類說明
  3.2.2 OGRSFDriverRegistrar類說明
  3.2.3 OGRDataSource類說明
  3.2.4 OGRLayer類說明
  3.2.5 OGRGeometry相關類說明
  3.2.6 OGRFieldDefn類說明
  3.2.7 OGRFeatureDefn類說明
  3.2.8 OGRFeature類說明
  3.2.9 其他說明
  3.3 SQL說明
  3.3.1 SELECT子句
  3.3.2 WHERE子句
  3.3.3 ORDER BY子句
  3.3.4 JOIN子句
  3.3.5 UNION ALL子句
  3.3.6 特殊字段
  3.3.7 索引與表
  3.3.8 ExecuteSQL()
  3.3.9 Non—OGR SQL
  3.4 OGR使用示例
  3.4.1 C++使用
  3.4.2 C#使用
  3.4.3 Python使用
  3.4.4 Java使用
  第4章 GDAL庫說明
  4.1 GDAL數據集總體概況
  4.1.1 數據集(Dataset)
  4.1.2 坐標系統(Coordinate System)
  4.1.3 元數據(Metadata)
  4.1.4 子數據集域(Subdatasets Domain)
  4.1.5 圖像結構域(Image_Structure Domain)
  4.1.6 RPC域(RPC Domain)
  4.1.7 XML域(XML:Domains)
  4.1.8 柵格波段(Raster Band)
  4.1.9 顏色表(Color Table)
  4.1.10 快視圖(Overviews)
  4.2 GDAL常用類說明
  4.2.1 GDALDriverManager類說明
  4.2.2 GDALDriver類說明
  4.2.3 GDALDataset類說明
  4.2.4 GDALRasterBand類說明
  4.3 GDAL元數據說明
  4.4 RasterIO使用說明
  4.5 圖像金字塔
  4.6 顏色表說明
  4.7 圖像統計信息說明
  4.7.1 直方圖統計
  4.7.2 極值計算
  4.7.3 均值標准差計算
  4.8 GDAL庫使用示例
  4.8.1 C++使用
  4.8.2 C#使用
  4.8.3 Python使用
  4.8.4 Java使用
  第5章 GDAL數據格式及配置項說明
  5.1 常用圖像格式使用說明
  5.1.1 GeoTIFF格式
  5.1.2 Erdas Imagine格式
  5.1.3 PCI的PIX格式
  5.1.4 ENVI的HDR格式
  5.1.5 JPEG,PNG圖像使用說明
  5.1.6 MEM文件使用說明
  5.2 GDAL對於HDF、NetCDF數據集讀取
  5.2.1 HDF格式使用說明
  5.2.2 NetCDF格式使用說明
  5.3 VRT文件格式說明
  5.3.1 VRT格式說明
  5.3.2 VRTRasterBand
  5.3.3 VRT使用說明
  5.3.4 編程創建VRT文件
  5.4 網絡WMS數據使用說明
  5.5 GDAL配置選項說明
  5.5.1 設置配置選項
  5.5.2 通用選項
  5.5.3 GDAL庫選項
  5.5.4 GeoTiff格式選項
  5.5.5 GDAL/OGR網絡選項
  5.5.6 OGR庫選項
  第6章 GDAL格式擴展說明
  6.1 柵格格式擴展
  6.1.1 從Dataset繼承
  6.1.2 從RasterBand繼承
  6.1.3 柵格驅動(Driver)
  6.1.4 添加驅動到GDAL庫
  6.1.5 添加地理參考信息
  6.1.6 金字塔(快視圖)
  6.1.7 創建文件 359
  6.1.8 RawDataset和RawRasterBand類
  6.1.9 元數據和其他外部擴展
  6.2 矢量格式擴展
  6.2.1 實現OGRSFDriver類
  6.2.2 從數據源中讀取數據
  6.2.3 讀取圖層
  6.3 裸數據格式擴展
  第7章 GDAL算法使用說明
  7.1 GDAL算法處理基礎
  7.1.1 GDAL大圖像處理策略
  7.1.2 GDAL中進度信息說明
  7.2 GDALWarp說明
  7.2.1 GDALWarpOptions
  7.2.2 GDALWarpOperation
  7.2.3 GDALWarpAPI使用說明
  7.3 圖像重采樣
  7.3.1 使用RasterIO重采樣
  7.3.2 使用GDALWarp重采樣
  7.4 圖像裁切
  7.4.1 使用RasterIO裁切
  7.4.2 使用GDALWarp裁切
  7.5 圖像鑲嵌
  7.6 GDALWarp坐標轉換
  7.6.1 GDALWarp坐標轉換相關函數說明
  7.6.2 GDALWarp坐標轉換流程
  7.7 圖像重投影
  7.8 圖像校正
  7.8.1 幾何多項式校正(1~3次)
  7.8.2 TPS校正
  7.8.3 RPC校正
  7.8.4 GeoLoc校正
  7.9 圖像坐標轉換通用接口
  7.103*3空間卷積運算
  7.11 DEM地形分析
  7.11.1 坡度坡向分析
  7.11.2 地形指數
  7.11.3 山體陰影
  7.11.4 彩色渲染
  7.11.5 立體彩色渲染
  7.12 格網插值
  7.12.1 計算數據指標
  7.12.2 離散點數據插值
  7.12.3 離散點數據插值示例
  7.13 小碎斑去除
  7.14 矢量柵格化
  7.15 柵格矢量化
  7.16 生成等高線
  第8章 CPL庫介紹
  8.1 cpl_port.h
  8.1.1 數據類型定義
  8.1.2 常量和函數定義
  8.1.3 LSB和MSB相互轉換
  8.2 cpl_error.h
  8.2.1 常用的錯誤代碼
  8.2.2 錯誤處理函數
  8.3 cpl_conv.h
  8.3.1 GDAL庫配置項讀寫
  8.3.2 內存管理相關
  8.3.3 文本文件讀取相關
  8.3.4 字符串與其他數據類型相關轉換
  8.3.5 應用程序與動態庫相關
  8.3.6 文件系統以及路徑相關
  8.3.7 度、分、秒與十進制度轉換
  8.3.8 ZIP壓縮文件讀寫
  8.4 cpl_http.h
  8.5 cpl_minixml.h
  第9章 GDAL工具使用說明
  9.1 GDAL工具通用參數說明
  9.1.1 通用命令行選項
  9.1.2 創建文件通用選項
  9.2 Exe工具使用說明
  9.2.1 gdalinfo
  9.2.2 gdal_translate
  9.2.3 gdaladdo
  9.2.4 gdalwarp
  9.2.5 gdaltindex
  9.2.6 gdalbuildvrt
  9.2.7 gdal_contour
  9.2.8 gdaldem
  9.2.9 gdal_rasterize
  9.2.10 gdaltransform
  9.2.11 nearblack
  9.2.12 gdal_grid
  9.2.13 gdallocationinfo
  9.2.14 gdalsrsinfo
  9.2.15 gdal—config
  9.2.16 gdalmanage
  9.2.17 ogrinfo
  9.2.18 ogr2ogr
  9.2.19 ogrtindex
  9.3 Python腳本工具使用說明
  9.3.1 rgb2pct.py
  9.3.2 pct2rgb.py
  9.3.3 gdal_merge.py
  9.3.4 gdal2tiles.py
  9.3.5 gdal_retile.py
  9.3.6 gdal_proximity.py
  9.3.7 gdal_polygonize.py
  9.3.8 gdal_sieve.py
  9.3.9 gdal_fillnodata.py
  9.3.10 gdalmove.py
  9.3.11 gdal_edit.py
  附錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM