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(); } } } |