1. 程式人生 > >利用PIE實現全球雲分佈圖的效果

利用PIE實現全球雲分佈圖的效果

 

1、問題背景:

     最近專案中獲得了一份全球雲分佈圖,客戶要求把雲顯示在全球地圖上,出現雲的效果,如下圖所示:

 

【全球雲分佈圖】

【世界地圖雲示意圖】

 

 2、解決思路

      諮詢專業的業務人員,建議我測試下試試地圖透明通道,地圖底色設定為白色,設定透明通道來完成這個效果,趕緊來試,先用PIE的波段合成功能,成功的將3波段的世界地圖.tiff和全球的雲分佈圖合併成一個四波段的帶雲分佈的世界地圖,趕緊設定RGBA波段,果然出現了想要的效果。

【波段合成】

 

【設定渲染方式】

 

 

 3、實現程式碼

      下一步就是程式碼實現這個功能了,首先呼叫波段合成演算法,再設定RGBA渲染,大功告成了。

// 波段組合演算法呼叫
PIE.CommonAlgo.BandCombination_Exchange_Info info = new PIE.CommonAlgo.BandCombination_Exchange_Info();

string path = @"D:\Data\World.tif";
IRasterDataset rDataset 
= DatasetFactory.OpenDataset(path, OpenMode.ReadOnly) as IRasterDataset; string path1 = @"D:\Data\CC_2018082615.tif"; IRasterDataset rDataset1 = DatasetFactory.OpenDataset(path1, OpenMode.ReadOnly) as IRasterDataset; info.m_vecFileptr = new List<IRasterDataset> { rDataset, rDataset1 }; List
<int> list1 = new List<int> { 0, 1, 2 }; List<int> list2 = new List<int> { 0 }; info.bands = new List<List<int>> { list1, list2 }; info.tstrfile = @"D:\Data\CloudPic.tif"; info.m_strFileTypeCode = "GTiff"; PIE.CommonAlgo.Interestregion interestregion = new PIE.CommonAlgo.Interestregion(); interestregion.SetRegion(0, 0, rDataset.GetRasterYSize(), rDataset.GetRasterXSize()); info.regioninfo = new List<PIE.CommonAlgo.Interestregion> { interestregion, interestregion }; info.m_iOutRangeCrossType = 0; PIE.SystemAlgo.ISystemAlgo algo = PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.BandCombinationAlgo"); if (algo == null) return; PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents; algo.Name = "波段合成"; algo.Params = info; bool result = PIE.SystemAlgo.AlgoFactory.Instance().ExecuteAlgo(algo); ILayer layer = PIE.Carto.LayerFactory.CreateDefaultLayer(@"D:\Data\CloudPic.tif"); IRasterRGBRender rRGBRender = new RasterRGBRender(); rRGBRender.SetBandIndices(0, 1, 2); rRGBRender.UseAlphaBand = true; rRGBRender.AlphaBandIndex = 3; //設定rasterRender IRasterRender rasterRender = rRGBRender as IRasterRender; IRasterLayer rasterLayer = layer as IRasterLayer; rasterLayer.Render = rasterRender; m_HookHelper.ActiveView.FocusMap.AddLayer(layer); m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);