GIS內核- 讀取影像數據示例


void ReadRasterClass()
{
	GsFileGeoDatabaseFactoryPtr pfac = new GsFileGeoDatabaseFactory();
	GsConnectProperty conn;
	conn.Server = MakeInputFile("tif");//tif文件目錄
	GsGeoDatabasePtr ptrDb = pfac->Open(conn);
	GsRasterClassPtr ptrRaster= ptrDb->OpenRasterClass("8bit");//打開一個叫8bit的文件8bit.tif

	//如果金字塔不存在則創建金字塔
	if(!ptrRaster->ExistsPyramid())
	bool bCreateSuccess = ptrRaster->CreatePyramid(GsRasterResampleAlg::eAverage, 4);

	//屏幕顯示的地理空間範圍
	GsBox box(100,34,102,36);
	//計算空間範圍在柵格類上的像素範圍。
	GsRect rect = ptrRaster->ExtentToRange(box);

	//要顯示的設備的範圍。
	GsSize s;//pDisplay->DisplayTransformation()->DeviceExtent().Size();

	//查詢需要操作的數據
	GsRasterCursorPtr ptrCursor = ptrRaster->Search(rect, s, eNearestNeighbour);

	std::shared_ptr< GsColorToRGBA> m_ptrTrans(new GsColorToRGBA());
	Utility::GsSimpleBitmapPtr m_ptrImage;
	GsRasterPtr ptrRasterData = new GsRaster();
	while (ptrCursor->Next(ptrRasterData))
	{
		if (m_ptrImage)
		{
			if (m_ptrImage->Width() < ptrRaster->Width() ||
				m_ptrImage->Height() <ptrRaster->Height())
				m_ptrImage.Release();
		}
		if (!m_ptrImage)
			m_ptrImage = new Utility::GsSimpleBitmap(ptrRaster->Width(), ptrRaster->Height(), 32);
		memset((void*)m_ptrImage->Bit(), 0x00, m_ptrImage->Stride() * m_ptrImage->Height());
		//採樣一塊數據到image
		m_ptrTrans->Translate(ptrRasterData, m_ptrImage);
		//下面拿image 做其他事情, 比如繪製. 

		//拿ptrRasterData對應的地理範圍計算需要貼圖的 屏幕範圍
		//GsBox box = ptrRasterClass->RangeToExtent(Utility::GsRect(ptrRaster->OffsetX(), ptrRaster->OffsetY(), ptrRaster->Width(), ptrRaster->Height()));
		//Utility::GsPT pt;
		//pDisplay->DisplayTransformation()->FromMap(box.XMin, box.YMax, pt.X, pt.Y);

		//貼圖
		//ptrCanvas->DrawImage(m_ptrImage, pt);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章