最近研究遙感,用到分類算法,PIE SDK正好提供了一些方法可供調用,他們的官方博客上也有相應的示例代碼(可參考:https://www.cnblogs.com/PIESat/p/10725270.html)。但是,我在開發手冊中發現了監督分類對話框類(SupervisedClassificaitonDialog),欣喜若狂!心想有這個類的話,不僅有直觀的界面展示,而且也會省去很多開發過程。不幸的是,直接調用這個類顯示參數設置對話框界面(如下圖),設置好參數,點擊OK,並沒有出現我想要的分類結果。實際上是根本就沒有執行分類算法。因此,我咨詢了相關技術人員(在此表示感謝),終於試驗成功,特此Mark一下。

監督分類對話框類界面
我們知道PIE SDK算法調用有三步:
第一步:設置ROI統計參數ROIStatistics_Exchange_Info並執行ROI統計算法得到ROI統計信息。
第二步:根據roi統計信息設置監督分類參數SupervisedClassification_Exchange_Info並執行距離分類算法。
第三步:結果顯示。
在監督分類對話框類中,可以設置ROI。設置ROI后,就已經完成了ROI信息統計,不再需要執行ROI統計算法。至此,第一步已經完成。
在第二步中,需要設置監督分類參數SupervisedClassification_Exchange_Info。來看SupervisedClassificaitonDialog的Public成員函數(如下圖)。

SupervisedClassificaitonDialog的Public成員函數
其中有GetParams()函數,第一想到的是它可以獲得參數以完成第二步監督分類參數SupervisedClassification_Exchange_Info結構體的設置。但是這個函數使用上有一點技巧(我一直卡在這個地方),如下:
1 SupervisedClassification_Exchange_Info m_DataInfo = null; 2 m_DataInfo = new SupervisedClassification_Exchange_Info(max_likelihood.GetParams());
至此,通過SupervisedClassificaitonDialog顯示參數設置對話框界面,設置好參數后,即可完成第二步監督分類參數SupervisedClassification_Exchange_Info結構體的構造。
下面就開始執行算法獲取想要的結果了!!!
完整代碼如下:
1 private void toolStripButton1_Click_1(object sender, EventArgs e) 2 { 3 SupervisedClassificaitonDialog max_likelihood = new SupervisedClassificaitonDialog(); 4 max_likelihood.Initialize(0, mapControlMain.FocusMap); 5 6 if (max_likelihood.ShowDialog()!=1) 7 { 8 max_likelihood.Dispose(); 9 max_likelihood = null; 10 return; 11 } 12 SupervisedClassification_Exchange_Info m_DataInfo = null; 13 m_DataInfo = new SupervisedClassification_Exchange_Info(max_likelihood.GetParams()); 14 15 ISystemAlgo maxlikelihoodAlgo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.MLClassificationAlgo");//最大似然法就將DistanceClassificationAlgo替換為MLClassificationAlgo 16 maxlikelihoodAlgo.Name = "最大似然分類"; 17 if (max_likelihood == null) return; 18 maxlikelihoodAlgo.Params = m_DataInfo; 19 ISystemAlgoEvents systemEvents = maxlikelihoodAlgo as ISystemAlgoEvents; 20 systemEvents.OnExecuteCompleted += systemEvents_OnExecuteCompleted; 21 22 23 AlgoFactory.Instance().ExecuteAlgo(maxlikelihoodAlgo); 24 max_likelihood.Dispose(); 25 max_likelihood = null; 26 }

SupervisedClassificaitonDialog參數設置對話框

分類結果展示
有不對的地方請大家批評指正。
2019.8.27更新(添加systemEvents_OnExecuteCompleted代碼):
1 /// <summary> 2 /// 算法執行完成事件 3 /// </summary> 4 /// <param name="algo"></param> 5 void systemEvents_OnExecuteCompleted(ISystemAlgo algo) 6 { 7 ISystemAlgoEvents systemEvents = algo as ISystemAlgoEvents; 8 systemEvents.OnExecuteCompleted -= systemEvents_OnExecuteCompleted; 9 ILayer layer = LayerFactory.CreateDefaultLayer(@"F:\backup\SourceCode\PIE\PIEMapApplication1\Pie_class.img"); 10 if (layer == null) 11 { 12 System.Windows.Forms.MessageBox.Show("分類后圖層為空"); 13 return; 14 } 15 mapControlMain.ActiveView.FocusMap.AddLayer(layer); 16 mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 17 } 18
