QGISDoc.cpp
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:11k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // QGISDoc.cpp : implementation of the CQGISDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "QGIS.h"
  5. #include "QGISDoc.h"
  6. #include "MainFrm.h"
  7. #include "ChildFrm.h"
  8. #include "QGISView.h"
  9. #include "QObjectsincludeQMapObj.h"
  10. #include "QObjectsincludeQLayerObj.h"
  11. #include "QObjectsincludeQCoordSys.h"
  12. #include "QObjectsincludeQPointObj.h"
  13. #include "QObjectsincludeQLineObj.h"
  14. #include "QObjectsincludeQGlobalObj.h"
  15. #include "QObjectsincludeResource.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. extern CQMapObj * g_pCurMap;
  22. /*extern CQGlobalObj g_QObj;*/
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CQGISDoc
  25. IMPLEMENT_DYNCREATE(CQGISDoc, CDocument)
  26. BEGIN_MESSAGE_MAP(CQGISDoc, CDocument)
  27. //{{AFX_MSG_MAP(CQGISDoc)
  28. ON_COMMAND(ID_FILE_SAVE, OnFileSave)
  29. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  30. ON_COMMAND(IDM_MENU_EXPORT_POINTS_QGIS, OnMenuExportPointsQgis)
  31. ON_COMMAND(IDM_MENU_IMPORT_POINTS_QGIS, OnMenuImportPointsQgis)
  32. //}}AFX_MSG_MAP
  33. END_MESSAGE_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CQGISDoc construction/destruction
  36. CQGISDoc::CQGISDoc()
  37. {
  38. // TODO: add one-time construction code here
  39. m_pMap = new CQMapObj;
  40. CQLayerObj * pLayer = new CQLayerObj;
  41. m_pMap->AddLayer(pLayer);
  42. m_pMap->SetCurLayer(pLayer);
  43. m_pMap->SetModifiedFlag(0);
  44. CQCoordSys * pSys = m_pMap->GetCoordSysPointer();
  45. pSys->SetMapScale(500.0);
  46. pSys->SetUnitType(0);
  47. m_pMap->GetBoundary()->m_fMinX = 0;
  48. m_pMap->GetBoundary()->m_fMinY = 0;
  49. m_pMap->GetBoundary()->m_fMaxX = 800.0;
  50. m_pMap->GetBoundary()->m_fMaxY = 600.0;
  51. int nPixelWidth = 5;
  52. double fL = 0;
  53. fL = m_pMap->GetCoordSysPointer()->LLtoWL(nPixelWidth);
  54. g_QObj.g_fEffectiveDistance = fL;
  55. g_QObj.g_pCoordSysObj = m_pMap->GetCoordSysPointer();
  56. }
  57. CQGISDoc::~CQGISDoc()
  58. {
  59. if(m_pMap)
  60. delete m_pMap;
  61. m_pMap = 0;
  62. }
  63. BOOL CQGISDoc::OnNewDocument()
  64. {
  65. if (!CDocument::OnNewDocument())
  66. return FALSE;
  67. // TODO: add reinitialization code here
  68. // (SDI documents will reuse this document)
  69. return TRUE;
  70. }
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CQGISDoc serialization
  73. void CQGISDoc::Serialize(CArchive& ar)
  74. {
  75. if (ar.IsStoring())
  76. {
  77. // TODO: add storing code here
  78. }
  79. else
  80. {
  81. // TODO: add loading code here
  82. }
  83. }
  84. /////////////////////////////////////////////////////////////////////////////
  85. // CQGISDoc diagnostics
  86. #ifdef _DEBUG
  87. void CQGISDoc::AssertValid() const
  88. {
  89. CDocument::AssertValid();
  90. }
  91. void CQGISDoc::Dump(CDumpContext& dc) const
  92. {
  93. CDocument::Dump(dc);
  94. }
  95. #endif //_DEBUG
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CQGISDoc commands
  98. void CQGISDoc::OnFileSave() 
  99. {
  100. // TODO: Add your command handler code here
  101. char szExt[] = "QGIS FILE (*.qgis)|*.qgis|All Files (*.*)|*.*||";
  102. char szFileName[] ="Map";
  103. CFileDialog fileDlg(FALSE,"*.qgis",szFileName,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szExt);
  104. if(fileDlg.DoModal() == IDOK)
  105. {
  106. if(m_pMap)
  107. {
  108. CString szFilePath = fileDlg.GetFileName();
  109. m_pMap->Save((const char *)szFilePath);
  110. }
  111. }
  112. }
  113. void CQGISDoc::OnFileOpen() 
  114. {
  115. // TODO: Add your command handler code here
  116. char szExt[] = "QGIS FILE (*.qgis)|*.qgis|All Files (*.*)|*.*||";
  117. char szFileName[] ="Map";
  118. CFileDialog fileDlg(TRUE,"*.qgis",szFileName,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szExt);
  119. if(fileDlg.DoModal() == IDOK)
  120. {
  121. if(m_pMap)
  122. {
  123. CString szFilePath = fileDlg.GetFileName();
  124. m_pMap->Open((const char *)szFilePath);
  125. GetActiveView();
  126. g_QObj.g_pCoordSysObj = m_pMap->GetCoordSysPointer();
  127. if(m_pView)
  128. m_pView->InvalidateRect(NULL,TRUE);
  129. }
  130. }
  131. }
  132. CQGISView * CQGISDoc::GetActiveView()
  133. {
  134. CMainFrame * pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
  135. CChildFrame * pchild = (CChildFrame *)pFrame->GetActiveFrame();
  136. m_pView = (CQGISView *)pchild->GetActiveView();
  137. return m_pView;
  138. }
  139. //导出散点数据
  140. void CQGISDoc::OnMenuExportPointsQgis() 
  141. {
  142. if(!m_pMap)
  143. {
  144. AfxMessageBox("地图不存在!");
  145. return;
  146. }
  147. CFileDialog  dlg(FALSE,"xyz","*.xyz",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  148. "xyz Files (*.xyz)|*.xyz|All Files (*.*)|*.*||",NULL);
  149. if(dlg.DoModal()!=IDOK) return ;
  150. CString szFileName=CString(dlg.GetFileName());
  151. CStdioFile * pFile=new CStdioFile(szFileName,CFile::modeCreate | CFile::modeWrite|CFile::typeText);
  152. long lPtNum = 0;
  153. CString szPtNum;
  154. CString szPoint;
  155. szPtNum.Format("%10ld",lPtNum);
  156. pFile->WriteString(szPtNum);
  157. pFile->WriteString("n");
  158. int nLayerCount = m_pMap->GetLayerCount();
  159. for(int i=0;i<nLayerCount;i++)
  160. {
  161. CQLayerObj * pLayer = m_pMap->GetLayer(i);
  162. if(pLayer && !pLayer->GetDeleteFlag() && pLayer->GetShowFlag())
  163. {
  164. int nObjCount = pLayer->GetObjCount();
  165. for(int j=0;j<nObjCount;j++)
  166. {
  167. CQBaseObj * pObj = pLayer->GetObj(j);
  168. if(pObj && !pObj->GetObjDeleted() && !pObj->GetObjHided())
  169. {
  170. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  171. {
  172. CQPointObj * pPoint = (CQPointObj *)pObj;
  173. double dx,dy;
  174. pPoint->GetPointPos(dx,dy);
  175. double fEle = pPoint->GetPtElevation();
  176. szPoint.Format("%10.4f,%10.4f,%10.4f",dx,dy,fEle);
  177. pFile->WriteString(szPoint);
  178. pFile->WriteString(CString("n"));
  179. lPtNum++;
  180. }
  181. else if(pObj->GetObjType() == QGIS_OBJ_LINE)
  182. {
  183. CQLineObj * pLine = (CQLineObj *)pObj;
  184. double fEle = pLine->GetElevation();
  185. int nPtNum = pLine->m_PtList.GetSize();
  186. if(nPtNum<=1)continue;
  187. lPtNum += nPtNum;
  188. for(int k=0;k<nPtNum;k++)
  189. {
  190. double dx = pLine->m_PtList.GetPoint(k)->GetX();
  191. double dy = pLine->m_PtList.GetPoint(k)->GetY();
  192. szPoint.Format("%10.4f,%10.4f,%10.4f",dx,dy,fEle);
  193. pFile->WriteString(szPoint);
  194. pFile->WriteString(CString("n"));
  195. }
  196. }
  197. }
  198. }
  199. }
  200. }
  201. pFile->SeekToBegin();
  202. szPtNum.Format("%10ld",lPtNum);
  203. pFile->WriteString(szPtNum);
  204. pFile->Close();
  205. delete pFile;
  206. }
  207. void CQGISDoc::OnMenuImportPointsQgis() 
  208. {
  209. // TODO: Add your command handler code here
  210. //需要的元素 图幅指针,计算边界矩形,以保证显示,以默认方式创建创建Point对象
  211. //CStdioFile,CString等 现存问题:加入大批量数据后,无法显示
  212. static int nFileName = 1; //图层名递增 避免重名
  213. CString szLayerName;
  214. szLayerName.Format("导入散点层%d",nFileName++);
  215. if(!m_pMap)
  216. {
  217. AfxMessageBox("地图对象不存在!");
  218. return;
  219. }
  220. CQLayerObj * pLayer = new CQLayerObj;
  221. pLayer->SetLayerName(szLayerName); //新建图层 用于将读入的散点数据装入其中
  222. CQCoordSys * pCoordSys = m_pMap->GetCoordSysPointer();  //定义坐标系统对象,用户坐标转换
  223. ASSERT(pCoordSys);
  224. CFileDialog  dlg(TRUE,"xyz","*.xyz",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //打开文件对话框
  225. "xyz Files (*.xyz)|*.xyz|All Files (*.*)|*.*||",NULL);
  226. if(dlg.DoModal()!=IDOK) return ;
  227. CString szFileName = CString(dlg.GetFileName());             //获取文件名
  228. BOOL bFinished = FALSE;
  229. CBoundaryRect bRect;
  230. long lLayerId = m_pMap->GetCurLayer()->GetLayerID();
  231. struct XYZ //自定义结构体,用于存储散点数据
  232. {
  233. double fX;  //x坐标
  234. double fY;  //y坐标
  235. double fH;  //h高程 
  236. };
  237. try
  238. { //为读入数据打开文件
  239. CStdioFile * pFile = new CStdioFile(szFileName,CFile::modeRead | CFile::typeText);
  240. if(!pFile) 
  241. {
  242. throw new CFileException();
  243. }
  244. long lPtNum = 0; //初始化节点总数
  245. CString szPtNum = _T("");
  246. pFile->ReadString(szPtNum);
  247. szPtNum.TrimLeft(); //去除左边的所有前导空格
  248. if(szPtNum.IsEmpty()) lPtNum = 0;
  249. else if(szPtNum.Find(' ',0) > 0) lPtNum = 0;
  250. else lPtNum = atol((LPCTSTR)szPtNum); //这一步可以去掉读取的若干空格
  251. long lPointNum = 0;
  252. if(lPtNum == 0) 
  253. {
  254. //如果读取的点数为零,不排除输出文件时没有正确导出点数的问题,所以可以计算一下.
  255. CString szTemp = _T("");
  256. pFile->SeekToBegin();
  257. while(pFile->ReadString(szTemp) != FALSE)
  258. {
  259. szTemp.TrimLeft(' ');
  260. if(!szTemp.IsEmpty())
  261. lPointNum++; //假如没有给出散点的数量则进行计算
  262. }
  263. lPtNum = lPointNum;
  264. pFile->SeekToBegin(); 
  265. }
  266. CWaitCursor wait;
  267. XYZ * tmXyz = new XYZ[lPtNum];
  268. CString szPtCoord = _T("");
  269. //将文件中的点位坐标全部读入临时结构数组
  270. if(lPointNum == 0 && lPtNum == 0)
  271. {
  272. AfxMessageBox("您选择的文件中没有任何数据,请确认!");
  273. return;
  274. }
  275. else 
  276. {
  277. for(long i=0;i<lPtNum;i++)
  278. {
  279. if(FALSE == pFile->ReadString(szPtCoord)) throw new CFileException(); //若文件没有读取完全或读取成功则抛出异常
  280. CString szX = _T(""),szY = _T(""),szH = _T("");
  281. if(szPtCoord.GetAt(0) != ' ') //若读入的散点数据在外部被编辑过,则要进行相关的处理,
  282. {
  283. szPtCoord.TrimLeft();
  284. int nFirstPos = szPtCoord.Find(' ',0);               //顺序查找第一个空格的位置
  285. int nSecendPos = szPtCoord.Find(' ',nFirstPos + 1);  //顺序查找第二个空格的位置
  286. szX = szPtCoord.Left(nFirstPos);
  287. szY = szPtCoord.Mid(nFirstPos + 1,nSecendPos - nFirstPos);
  288. szPtCoord.Delete(0,nSecendPos + 1);
  289. szH = szPtCoord;
  290. }
  291. else
  292. {
  293. szX = szPtCoord.Left(10);     //从最左端读取20个字符
  294. szY = szPtCoord.Mid(11,10);   //从第21个位置开始读取20个字符
  295. szH = szPtCoord.Right(10);    //从最右端读取20个字符
  296. }
  297. szX.TrimLeft(); //去除前导空格
  298. szY.TrimLeft();
  299. szH.TrimLeft();
  300. tmXyz[i].fX = atof((LPCTSTR)szX); //字符串转换为double型
  301. tmXyz[i].fY = atof((LPCTSTR)szY);
  302. tmXyz[i].fH = atof((LPCTSTR)szH);
  303. }
  304. CQPointObj * pPoint = NULL;       //临时子图点对象,用于存放读入的点信息
  305. pLayer->CalculateBoundary(NULL);          //计算图层的边界矩形
  306. for(long j = 0;j<lPtNum;j++)
  307. {
  308. CQPoint ptTemp(tmXyz[j].fX,tmXyz[j].fY);
  309. pPoint = new CQPointObj(ptTemp); //放大倍数为5倍
  310. pPoint->SetObjMapID(m_pMap->GetMapID());
  311. pPoint->SetObjLayerID(pLayer->GetLayerID());
  312. pPoint->SetPtElevation(tmXyz[j].fH);
  313. pPoint->CalculateBoundary(NULL);        //计算点对象的边界矩形
  314. pLayer->AddObject(pPoint);          //将点对象添加入图层
  315. }
  316. pLayer->CalculateBoundary(NULL);
  317. m_pMap->AddLayer(pLayer);            //新图层加入图幅,并且予以显示
  318. m_pMap->SetCurLayer(pLayer);
  319. bFinished = TRUE;
  320. }
  321. delete tmXyz;
  322.     pFile->SeekToBegin();                         //文件指针回位
  323.     pFile->Close();
  324.     delete pFile;
  325. }
  326. catch (CFileException * e)   //错误提示
  327. {
  328. UINT nMaxError = 100; 
  329. TCHAR * pChError = new TCHAR[nMaxError];
  330. e->GetErrorMessage(pChError,nMaxError);
  331. CString szError = "读取文件过程中出现错误,可能是文件内容有问题或是其他原因造成:";
  332. szError += CString(pChError);
  333. AfxMessageBox(szError,MB_OK | MB_ICONWARNING);
  334. delete []pChError;
  335. delete pLayer;
  336. }
  337. if(bFinished)
  338. {
  339. m_pMap->SetModifiedFlag(1);
  340. GetActiveView();
  341. m_pMap->DisplayAllInView(pCoordSys,m_pView);
  342. }
  343. }