zoukankan      html  css  js  c++  java
  • PIE-SDK For C++打开自定义栅格数据

    1、数据介绍

       信息提取和解译的过程中,经常会生成一部分中间临时栅格数据,这些数据在执行完对应操作后就失去了存在的价值,针对这种情况,PIE增加了内存栅格数据集,来协助用户完成对自定义栅格数据的读取和显示。下面以一副影像数据的抠图算法来演示自定义栅格数据的应用。

    2、实现思路及原理说明

    第一步

    打开原始栅格数据;

    第二步

    读取部分数据至内存中,设置读取的起始点、读取范围等参数;

    第三步

    建立栅格内存数据集;

    第四步

    将内存中的数据写入内存数据集;

    第五步

    通过内存数据集创建栅格图层;

    第六部

    添加栅格图层到地图并刷新;

    3、核心接口与方法

    接口/

    方法

    说明

    SysDataSource::RasterDatasetPtr

    GetBandCount()

    获取波段个数

    GetRasterBand()

    获取指定索引的波段

    Read()

    将数据读取至内存中

    Write()

    将内存数据写入栅格数据集中

    SetGeoTransform

    设置六参数

    SpatialReference

    空间参考

    GetGeoTransform

    获取六参数

    SysDataSource::DatasetFactory

    CreateRasterDataset()

    创建栅格数据集

    4、示例代码

    项目名称

    百度云盘地址下/PIE示例程序/03.数据加载/11.打开自定义栅格数据

    数据位置

    百度云盘地址下/PIE示例数据/栅格数据/ 04.World/World.tif

    视频位置

    百度云盘地址下/PIE视频教程/03.数据加载/11.打开自定义栅格数据.avi

    示例代码

    方法(一)打开自定义栅格数据

    void PIEMainWindow::On_ActionGetMemRaster_Triggered(bool checked)

    {

        SysCarto::RasterLayerPtr rasterLayerPtr = m_pCurrentControl->GetActiveView()->GetCurrentLayer();

        if (rasterLayerPtr == nullptr) return;

        //1、获取源Dataset

        SysDataSource::RasterDatasetPtr sourceRasterPtr = rasterLayerPtr->GetDataset();

        int mWidth = 500;

        int mHeigh = 600;

        int count = sourceRasterPtr->GetBandCount();

        double* geoTrans = new double[6];

        sourceRasterPtr->GetGeoTransform(geoTrans);

        QVector<int> bandMap;

        int* bandList = new int[count];

        

        for (int i=0;i<count;i++)

        {

            bandMap.insert(i, i + 1);

            bandList[i] = i + 1;

        }

        //2、读取数据至内存

        SysDataSource::PixelBufferPtr bufferPtr=sourceRasterPtr->Read(0, 0, mWidth, mHeigh, mWidth, mHeigh, bandMap);

        //3、创建内存数据集

        SysDataSource::RasterDatasetPtr memRasterPtr = SysDataSource::DatasetFactory::Instance()->CreateRasterDataset("", mWidth, mHeigh, count,

            sourceRasterPtr->GetRasterBand(0)->GetRasterDataType(), "MEM");

        if (memRasterPtr!=nullptr)

        {

            bool ok=memRasterPtr->Write(0, 0, mWidth, mHeigh, bufferPtr->GetData(), mWidth, mHeigh, sourceRasterPtr->GetRasterBand(0)->GetRasterDataType(),

                count, bandList);

            if (ok)

            {

                //4、设置空间参考和仿射变换参数

                memRasterPtr->SetSpatialReference(sourceRasterPtr->GetSpatialReference());

                memRasterPtr->SetGeoTransform(geoTrans);

     

                SysCarto::LayerPtr memLayer = SysCarto::LayerFactory::CreateDefaultRasterLayer(memRasterPtr);

                memLayer->SetName("内存图层");

                m_pCurrentControl->GetMap()->AddLayer(memLayer);

                m_pCurrentControl->GetActiveView()->Refresh();

            }

        }

    }

    5、示例截图

    前后对比图如下

  • 相关阅读:
    使用hibernate利用实体类生成表和利用表生成实体类
    多线程循环打印ABC
    maven在整合springmvc+hibernate运行时遇到的一些问题
    checkbox属性获取
    glib中关于线程池的一个实例
    阅读英文文献总结的专业词汇
    网络流分类领域牛人
    锐捷s3550千兆交换机配置端口镜像
    转载Wireshark过滤语法
    DispatcherServlet处理流程
  • 原文地址:https://www.cnblogs.com/PIESat/p/12368098.html
Copyright © 2011-2022 走看看