PIE-SDK For C++栅格数据的创建

1.功能简介

    目前在地理信息领域中数据包括矢量和栅格两种数据组织形式。每一种数据有不同的数据格式,目前PIE SDK支持多种数据格式的数据创建,下面对栅格数据格式的数据创建功能进行介绍。

2.功能实现说明

2.1 实现思路及原理说明

第一步

获取要读取的栅格数据

第二步

获取栅格数据的读取

第三步

构建新的栅格数据集

第四步

栅格数据写入

第五步

设置空间参考

第六步

设置仿射变换

2.2 核心接口与方法

接口/

方法/属性

说明

 

 

 

SysDataSource::RasterDatasetPtr

GetBandCount()

获取波段数

Read()

栅格读取

Write()

栅格写入

GetGeoTransform()

获取仿射变换参数

SetGeoTransform()

设置仿射变换参数

GetSpatialReference()

空间参考

SysDataSource::DatasetFactory

CreateRasterDataset()

空间栅格数据集

2.3 示例代码

项目路径

百度云盘地址下/PIE示例程序/04数据操作/10栅格数据的创建

数据路径

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

视频路径

百度云盘地址下/PIE视频教程/04数据操作/10栅格数据的创建.avi

示例代码

void PIEMainWindow::On_ActionCreateRaster_Triggered(bool checked)

{

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

    if (rasterLayerPtr == nullptr) return;

 

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

    int BandCount = datasetPtr->GetBandCount();

    //2栅格数据范围等信息的读取

    int xSize = datasetPtr->GetRasterXSize();//

    int ySize = datasetPtr->GetRasterYSize();//

    QVector<int> vectorBand;

    int* bandMap = new int[BandCount];

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

    {

        bandMap[i] = i + 1;

        vectorBand.insert(i, i + 1);

    }

    QString filter = "Raster Files (*.tif *.tiff *.img *.bmp *.jpg *.ldf *.dat *.1bd *.1b)";

    QString saveFilePath= QFileDialog::getSaveFileName(nullptr, "保存", "", filter);

    if (saveFilePath.isEmpty()) return;

    SysDataSource::PixelBufferPtr buffer=datasetPtr->Read(0, 0, xSize, ySize, xSize, ySize, vectorBand);

 

    SysDataSource::RasterDatasetPtr newDataSet = SysDataSource::DatasetFactory::Instance()->CreateRasterDataset(saveFilePath, xSize, ySize, BandCount, datasetPtr->GetRasterBand(0)->GetRasterDataType(), "GTiff");

    double* geo=new double[6];

    datasetPtr->GetGeoTransform(geo);

    newDataSet->SetSpatialReference(datasetPtr->GetSpatialReference());

    newDataSet->SetGeoTransform(geo);

    bool flag= newDataSet->Write(0, 0, xSize, ySize, buffer->GetData(), xSize, ySize, datasetPtr->GetRasterBand(0)->GetRasterDataType(), BandCount, bandMap);

    if (flag)

    {

        SysCarto::LayerPtr newLayer = SysCarto::LayerFactory::Instance()->CreateDefaultRasterLayer(newDataSet);

        if (newLayer!=nullptr)

        {

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

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

        }

    }

}

2.4 示例截图

posted @ 2020-02-27 17:15  PIESAT  阅读(372)  评论(0编辑  收藏  举报