PIE SDK打开自定义栅格数据

 

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 }
View Code

5. 示例截图

 

posted @ 2018-12-19 15:31  PIESAT  阅读(990)  评论(0编辑  收藏  举报