• 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. 示例截图

     

  • 相关阅读:
    STL容器与拷贝构造函数
    BOOST_STATIC_ASSERT and BOOST_ASSERT
    STL map与Boost unordered_map
    C++ load shared library
    C++中模板不能把实现和声明放在两个不同的文件下
    C++ static、const和static const 以及它们的初始化
    Resource editor
    stdext A C++ STL Extensions Libary
    C++ boost shared_ptr as a hash_map key
    C++前置声明
  • 原文地址:https://www.cnblogs.com/PIESat/p/10143600.html
Copyright © 2020-2023  润新知