1. 数据介绍
信息提取和解译的过程中,经常会生成一部分中间临时栅格数据,这些数据在执行完对应操作后就失去了存在的价值,针对这种情况,PIE增加了内存栅格数据集,来协助用户完成对自定义栅格数据的读取和显示。
下面以一副影像数据的抠图算法来演示自定义栅格数据的应用。
2. 实现思路及原理说明
第一步 |
打开原始栅格数据; |
第二步 |
读取部分数据至内存中,设置读取的起始点、读取范围等参数; |
第三步 |
建立栅格内存数据集; |
第四步 |
将内存中的数据写入内存数据集; |
第五步 |
通过内存数据集创建栅格图层; |
第六步 |
添加栅格图层到地图并刷新; |
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 } |
5. 示例截图