PIE SDK打開自定義柵格數據

 

1. 數據介紹

    信息提取和解譯的過程當中,常常會生成一部分中間臨時柵格數據,這些數據在執行完對應操做後就失去了存在的價值,針對這種狀況,PIE增長了內存柵格數據集,來協助用戶完成對自定義柵格數據的讀取和顯示。算法

    下面以一副影像數據的摳圖算法來演示自定義柵格數據的應用。數組

2. 實現思路及原理說明

第一步ide

打開原始柵格數據;spa

第二步3d

讀取部分數據至內存中,設置讀取的起始點、讀取範圍等參數;code

第三步orm

創建柵格內存數據集;視頻

第四步blog

將內存中的數據寫入內存數據集;教程

第五步

經過內存數據集建立柵格圖層;

第六步

添加柵格圖層到地圖並刷新;

3. 核心接口與方法

接口/類

方法

說明

 

 

 

 

 

IRasterDataset

GetBandCount()

獲取波段個數

GetRasterBand()

獲取指定索引的波段

Read()

將數據讀取至內存中

Write()

將內存數據寫入柵格數據集中

SetGeoTransform

設置六參數

SpatialReference

空間參考

DatasetFactory

CreateRasterDataset()

建立柵格數據集

4. 示例代碼

項目名稱

百度雲盤地址下/PIE示例程序/03.數據加載/11.打開自定義柵格數據

數據位置

百度雲盤地址下/PIE示例數據/柵格數據/04.World/World.tif

視頻位置

百度雲盤地址下/PIE視頻教程/03.數據加載/11.打開自定義柵格數據.avi

示例代碼

 
 1 方法(一)打開自定義柵格數據
 2     if (mapControlMain.FocusMap.LayerCount == 0)return;       
 3     IRasterLayer pRasterLayer = mapControlMain.ActiveView.CurrentLayer as IRasterLayer;
 4     if (pRasterLayer == null)return;
 5     IRasterLayer memLayer = OpenMemRasterLayer(pRasterLayer, 0, 0);
 6     if(memLayer!=null)
 7     {
 8         mapControlMain.FocusMap.AddLayer(memLayer as ILayer);
 9         mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
10     }
11 
12 /// <summary>
13 /// 自定義柵格數據讀取(經過內存RasterData構建RasterLayer)
14 /// </summary>
15 /// <param name="rasterLayer">柵格數據路徑</param>
16 /// <param name="startX">讀取起始位置X</param>
17 /// <param name="startY">讀取起始位置Y</param>
18 /// <param name="?"></param>
19 /// <returns></returns>
20 private IRasterLayer OpenMemRasterLayer(IRasterLayer rasterLayer, int startX, int startY)
21 {
22     IRasterLayer memRasterLayer = null;
23     object array = null;//存儲讀取出的數據
24     //柵格圖層參數讀取
25     IRasterDataset rasterDataset = rasterLayer.Dataset;
26     int bandCount = rasterDataset.GetBandCount();
27     PixelDataType rasterDataType = rasterDataset.GetRasterBand(0).GetRasterDataType();
28 
29     //讀取柵格數據塊大小
30     int width = 2048;
31     int height = 1024;
32     switch (rasterDataType)
33     {
34         case PixelDataType.UInt16:
35             array = new UInt16[width * height * bandCount];
36             break;
37         case PixelDataType.Byte:
38             array = new Byte[width * height * bandCount];
39             break;
40         default:
41             break;
42     }
43     int[] bandMap = new int[bandCount];
44     for (int i = 0; i < bandCount; i++)
45     {
46         bandMap[i] = i + 1;
47     }
48     //將pRasterLayer中的數據讀取至數組中
49     bool oK = rasterDataset.Read(startX, startY, width, height, array, width, height, rasterDataType, bandCount, bandMap);  //柵格讀取
50     double[] geoTrans = rasterDataset.GetGeoTransform();
51 
52     //建立內存數據集
53     IRasterDataset newRDataset = DatasetFactory.CreateRasterDataset("", width, height, bandCount, rasterDataType, "MEM", null);
54     //數組中的數據寫入內存數據集中
55     oK = newRDataset.Write(0, 0, width, height, array, width, height, rasterDataType, bandCount, bandMap);  //柵格寫入
56     //設置參數
57     newRDataset.SetGeoTransform(geoTrans);//設置仿射變換參數
58     newRDataset.SpatialReference = rasterDataset.SpatialReference;//設置空間參考
59 
60     //建立RasterLayer
61     memRasterLayer = PIE.Carto.LayerFactory.CreateDefaultRasterLayer(newRDataset);
62     return memRasterLayer;
63 }
View Code

5. 示例截圖

 

相關文章
相關標籤/搜索