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、示例截图
前后对比图如下