天天看點

C#調用GDAL算法進度資訊傳遞

gdal庫中提供了很多的算法,同時也提供了進度條的參數。對于c++調用來說,應該沒什麼問題,但是對c#調用來說,在進度條這塊需要寫一個代理來進行傳遞。首先寫一個簡單的測試代碼。

首先定義一個委托函數原型,需要與gdal庫中的c#進度條接口保持一緻,一個簡單的原型如下。

接下來在自己的測試代碼中編寫一個進度條函數,為了友善,先編寫一個控制台的,直接從gdal庫中提供的控制台進度條修改而成,進度條函數代碼如下。具體可以參考gdal庫中的控制台進度條實作代碼,幾乎完全一樣,除了将printf函數改成了console.write,别的沒有啥差別。

接下來就是在測試代碼中進行調用了。下面是我将gdal庫的算法進行了封裝,不過進度條的接口與gdal庫中的算法進度條接口一模一樣,我封裝了一個波段合并的算法,就是将好幾個單波段檔案合并為一個多波段檔案,主要是用來将landsat衛星下載下傳的分波段存儲的資料進行合并形成一個多波段的資料。函數的接口聲明如下:

最後兩個參數就是進度條參數,倒數第二個為進度條回調函數(c#裡面的委托函數),倒數第一個參數為進度條所需的參數資訊。具體請參考我之前的進度條相關的部落格。上面的函數實作此處不再進行說明,也不是本文的重點。下面就看看怎麼調用這個函數并将進度條傳入。

上面程式運作中進度效果如下圖所示。

C#調用GDAL算法進度資訊傳遞

上面的是控制台的,那麼在圖形界面中如何編寫呢。接下來就寫一個圖形界面的進度條。聲明代理函數都一樣,隻不過就是自己需要根據各自界面的進度條控件編寫對應的進度函數。也就是上面類似的termprogress1函數。首先做一個簡單的界面,如下圖所示。

C#調用GDAL算法進度資訊傳遞

首先看這個界面的進度條實作函數。在該form類中定義一個進度條類,具體代碼如下:

首先對函數progressbarinfo的參數進行說明,dfcomplete是進度資訊,0~1之間的小數,strmessage是進度資訊,主要是一些說明文字,最後一個pdata是使用者自定義的結構資訊,這裡的pdata就是整個form的handle。這樣就可以從這個form的handle中轉換為界面類的一個對象,并從中擷取進度條控件,然後将進度資訊設定給進度條控件,将message設定給界面的一個label。

下面再看看函數調用。

在點選【計算】按鈕之後,先擷取輸入和輸出的檔案路徑,然後聲明一個委托,使用者定義的結構資訊給目前form的handle。然後将委托函數和handle傳入算法函數即可。程式運作的截圖如下所示。該算法為矢量栅格化的一個封裝函數。

C#調用GDAL算法進度資訊傳遞
C#調用GDAL算法進度資訊傳遞

上面的兩個截圖和界面設計截圖有點不一緻,主要是将矢量栅格化的幾個參數可以由界面進行設定。上面的代碼中這幾個參數都是在代碼中設定死的。其他的都一樣,對于進度條這塊沒有任何變動。