信息提取和解譯的過程當中,常常會生成一部分中間臨時柵格數據,這些數據在執行完對應操做後就失去了存在的價值,針對這種狀況,PIE增長了內存柵格數據集,來協助用戶完成對自定義柵格數據的讀取和顯示。算法
下面以一副影像數據的摳圖算法來演示自定義柵格數據的應用。數組
第一步ide |
打開原始柵格數據;spa |
第二步3d |
讀取部分數據至內存中,設置讀取的起始點、讀取範圍等參數;code |
第三步orm |
創建柵格內存數據集;視頻 |
第四步blog |
將內存中的數據寫入內存數據集;教程 |
第五步 |
經過內存數據集建立柵格圖層; |
第六步 |
添加柵格圖層到地圖並刷新; |
接口/類 |
方法 |
說明 |
IRasterDataset |
GetBandCount() |
獲取波段個數 |
GetRasterBand() |
獲取指定索引的波段 |
|
Read() |
將數據讀取至內存中 |
|
Write() |
將內存數據寫入柵格數據集中 |
|
SetGeoTransform |
設置六參數 |
|
SpatialReference |
空間參考 |
|
DatasetFactory |
CreateRasterDataset() |
建立柵格數據集 |
項目名稱 |
百度雲盤地址下/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 } |