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 |
示例代码 | |
方法(一)打开自定义栅格数据 voidPIEMainWindow::On_ActionGetMemRaster_Triggered(boolchecked) { SysCarto::RasterLayerPtrrasterLayerPtr = m_pCurrentControl->GetActiveView()->GetCurrentLayer(); if (rasterLayerPtr==nullptr) return; //1、获取源Dataset SysDataSource::RasterDatasetPtrsourceRasterPtr = rasterLayerPtr->GetDataset(); intmWidth = 500; intmHeigh = 600; intcount = sourceRasterPtr->GetBandCount(); double* geoTrans = newdouble[6]; sourceRasterPtr->GetGeoTransform(geoTrans); QVector<int> bandMap; int* bandList = newint[count];
for (inti=0;i<count;i++) { bandMap.insert(i, i + 1); bandList[i] = i + 1; } //2、读取数据至内存 SysDataSource::PixelBufferPtrbufferPtr=sourceRasterPtr->Read(0, 0, mWidth, mHeigh, mWidth, mHeigh, bandMap); //3、创建内存数据集 SysDataSource::RasterDatasetPtrmemRasterPtr = SysDataSource::DatasetFactory::Instance()->CreateRasterDataset("", mWidth, mHeigh, count, sourceRasterPtr->GetRasterBand(0)->GetRasterDataType(), "MEM"); if (memRasterPtr!=nullptr) { boolok=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::LayerPtrmemLayer = SysCarto::LayerFactory::CreateDefaultRasterLayer(memRasterPtr); memLayer->SetName("内存图层"); m_pCurrentControl->GetMap()->AddLayer(memLayer); m_pCurrentControl->GetActiveView()->Refresh(); } } } |
5、示例截图
前后对比图如下