19,468
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#include "afxwin.h"
#include "SphereTile.h"
#include "gdal.h"
// CDlgConvert dialog
typedef struct tagDATA_INFO {
// DEM/DOM
int nType;
double lfXO;
double lfYO;
double lfXE;
double lfYE;
double lfDx;
double lfDy;
int nRows;
int nCols;
int nBand;
char chFileName[MAX_PATH];
// read
void *hDataset;//GDALDatasetH hDataset;
RECT rcBuf;
RECT rcUse;//For Block
LPBYTE lpBuf;
int nSize;
int nDataSize;
int nDataType;
// match level
int nLevel;
// for sample progress
int iIndex;
void Default()
{
lfXO = 0;
lfYO = 0;
lfXE = 0;
lfYE = 0;
lfDx = 0;
lfDy = 0;
nRows = 0;
nCols = 0;
nType = 0;
nBand = 1;
hDataset = NULL;
lpBuf = NULL;
nSize = 0;
nDataSize = 1;
nDataType = 0;
rcBuf.left = 0;
rcBuf.right = 0;
rcBuf.top = 0;
rcBuf.bottom = 0;
nLevel = 0;
iIndex = 0;
chFileName[0] = 0;
}
bool Alloc()
{
if( DATA_DOM==nType || DATA_DEM==nType || DATA_DRG==nType )
{
nSize = (rcBuf.right-rcBuf.left)*(rcBuf.bottom-rcBuf.top);
}
if( 0<nSize && 1024*1024*128>nSize )
{
lpBuf = new BYTE [nSize*nBand*nDataSize];
return true;
}
return false;
}
void Free()
{
if( NULL!=lpBuf )
{
delete [] lpBuf;
lpBuf = NULL;
}
nSize = 0;
}
void Close()
{
Free();
if( NULL!=hDataset )
{
GDALClose(hDataset);
}
Default();
}
bool operator == (const tagDATA_INFO &di)
{
return 0==_stricmp(chFileName,di.chFileName);
}
bool IsValid()
{
return (DATA_DEM==nType||DATA_DOM==nType||DATA_VEC==nType||DATA_DRG==nType);
}
bool GetDataInfo(const char* lpszFileName);
}DATA_INFO;
typedef std::list<DATA_INFO> LIST_DATA;
class CDlgConvert : public CDialogEx
{
DECLARE_DYNAMIC(CDlgConvert)
public:
CDlgConvert(CWnd* pParent = NULL); // standard constructor
virtual ~CDlgConvert();
virtual void OnFinalRelease();
// Dialog Data
enum { IDD = IDD_DLG_CONVERT };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
void PumpMessage();
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
public:
CProgressCtrl m_wndProgress;
int m_NumOfData;
CString m_Pro_Msg;
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
protected:
LIST_DATA m_listData;
LPBYTE m_lpBuf;
int m_nTileBufSize;
int m_nBand;
int m_nDEMWidth;
int m_nDOMWidth;
//int m_nMinLevel;
//int m_nMaxLevel;
bool m_bGoing;
bool m_bCancel;
unsigned int m_uMark;
//DATA_INFO diBaseDOM;
//DATA_INFO diBaseDEM;
//DATA_INFO* m_pDI;
int *m_pLevelOffset;
CSphereData *m_pData;
int GetLevel(double lat);
bool Process();
bool BuildTree(DATA_INFO di,CGeoTileQueue& listTiles);
bool SampleDOMFromDataEx(CGeoTile* pTile,LPBYTE lpBufBase,DATA_INFO &di,int nType=DATA_DOM);
bool SampleDOMFromChildren(CGeoTile *pTile,LPBYTE lpBufBase,int nType);
bool SampleDOMFromParent(CGeoTile *pTile,LPBYTE lpBufBase,int nType,bool bBaseParent=false);
bool SampleDEMFromDataEx(CGeoTile* pTile,LPBYTE lpBufBase,DATA_INFO &di);
bool SampleDEMFromChildren(CGeoTile *pTile,LPBYTE lpBufBase);
bool SampleDEMFromParent(CGeoTile *pTile,LPBYTE lpBufBase,bool bBaseParent=false);
void CalcTileZ(CGeoTile *pTile,LPBYTE lpBufBase);
void SetRange(int nRange);
bool StepIt();
void ShowMsg(const char* Msg);
public:
bool AddData(const char* lpszFileName);
int GetDataCount()
{
return m_NumOfData;
};
};