`
cryolite
  • 浏览: 573611 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
GDAL将影像拷贝到一个内存Dataset gdal, mem gdaldataset http://lists.osgeo.org/pipermail/gdal-dev/2008-March/016369.html
GDALDataset* pDataSource = (GDALDataset*) GDALOpen(sFileName.c_str(),
(GDALAccess) 0);
if (!pDataSource)
	return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));

int nBandCount = pDataSource->GetRasterCount();
int nWidth = pDataSource->GetRasterXSize();
int nHeight = pDataSource->GetRasterYSize();
GDALDataType eBandType = pDataSource->GetRasterBand(1)->GetRasterDataType();

GDALDriver* pMemDriver = GetGDALDriverManager()->GetDriverByName("MEM");
if (!pMemDriver) 
	return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));

GDALDataset* pMemDataset = pMemDriver->Create(sStreamId.str().c_str(),
nWidth, nHeight, nBandCount, eBandType, NULL); 
if (!pMemDataset) 
	return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));

for (int i = 0; i < nBandCount; i++ )
{
	GDALRasterBand* pMemBand = pMemDataset->GetRasterBand(i + 1);
	GDALRasterBand* pRasterBand = pDataSource->GetRasterBand(i + 1);
	
pMemBand->SetColorInterpretation(pRasterBand->GetColorInterpretation());
	pMemBand->SetOffset(pRasterBand->GetOffset());
	pMemBand->SetScale(pRasterBand->GetScale());
	pMemBand->SetUnitType(pRasterBand->GetUnitType());

	BOOL bSuccess = FALSE;
	double nNullValue = pRasterBand->GetNoDataValue(&bSuccess);
	if (bSuccess == TRUE)
	{
		GDALColorTable* pColorTable = pRasterBand->GetColorTable();
		if (pColorTable != NULL)
		{
			GDALColorEntry colorEntry;
			pColorTable->GetColorEntryAsRGB((int) nNullValue,
&colorEntry);
			hr = pMemBand->SetNoDataValue((double)
colorEntry.c4);
			if (FAILED(hr)) return hr;
		}
		else
		{
			hr = pMemBand->SetNoDataValue((double) nNullValue);
			if (FAILED(hr)) return hr;
		}
	}

	if (!pMemBand->GetColorTable())
	{
		GDALColorTable* pColorTable = pRasterBand->GetColorTable();
		pMemBand->SetColorTable(pColorTable != NULL ?
pColorTable->Clone() : NULL);
	}

	unsigned char* pBytes = (unsigned char*) malloc(sizeof(unsigned
char) * nWidth * nHeight);
	memset(pBytes, 0, nWidth * nHeight);
	
	CPLErr err = pRasterBand->RasterIO(GF_Read, 0, 0, nWidth, nHeight,
pBytes, nWidth, nHeight, eBandType, 0, 0);
	if (err != CE_None) 
		return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));

	err = pMemBand->RasterIO(GF_Write, 0, 0, nWidth, nHeight, pBytes,
nWidth, nHeight, eBandType, 0, 0); 
	if (err != CE_None) 
		return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));

	if (pBytes) delete [] pBytes;
}

if (pDataSource)
	GDALClose(pDataSource);
pDataSource = NULL;

if (m_pMemDataset)
	GDALClose(m_pMemDataset);
m_pMemDataset = pMemDataset;
Global site tag (gtag.js) - Google Analytics