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

GDI/图象编程

开发平台:

Visual C++

  1. // QMapObj.cpp: implementation of the CQMapObj class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..stdafx.h"
  5. #include "..includeResource.h"
  6. #include "..includeQMapObj.h"
  7. #include "..includeQLayerObj.h"
  8. #include "..includeQSelObjManager.h"
  9. #include "..includeQPointArray.h"
  10. #include "..includeQCoordSys.h"
  11. #include "..includeQGlobalObj.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[]=__FILE__;
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. //****************************说明******************************//
  21. //在QGIS系统中Map是最大的系统单位也是全部数据的统一管理对象
  22. //////////////////////////////////////////
  23. ///***************CQGIS****************///
  24. ///函数名称:CQMapObj
  25. ///返回类型:无 
  26. ///入口参数:无
  27. ///出口参数:无
  28. ///思路说明:构造函数
  29. ///***************CQGIS****************///
  30. //////////////////////////////////////////
  31. CQMapObj::CQMapObj()
  32. {
  33. m_lMapID = SetMapIDByRandom();
  34. m_szMapName.Format("地图%ld",m_lMapID);
  35. InitBoundary();   //初始化
  36. m_szMapDiscription = m_szMapName; //地图默认描述是地图名称
  37. m_pCurLayer = new CQLayerObj;     //当前图层对象的初始化
  38. m_pCurLayer->SetMapID(m_lMapID);
  39. m_lScale = 500; //地图默认比例尺1:500
  40. m_nCoordSys=1;               //坐标系统
  41. m_nElevationSys=1;           //高程系统
  42. //上下纬度范围,分别用三个整数存储度分秒的数值
  43. //左右经度范围,分别用三个整数存储度分秒的数值
  44. m_faLongitude[0] =108;
  45. m_faLongitude[1] =0.0;
  46. m_faLongitude[2] =0.0;
  47. m_faLongitude[3] =108;
  48. m_faLongitude[4] =3;
  49. m_faLongitude[5] =45;
  50. m_faLatitude[0]=31;
  51. m_faLatitude[1]=57;
  52. m_faLatitude[2]=30;
  53. m_faLatitude[3]=32;
  54. m_faLatitude[4]=0;
  55. m_faLatitude[5]=0;
  56. for(int i = 0;i<4;i++)
  57. {
  58. m_aMapCorner[i].SetX(0.0);
  59. m_aMapCorner[i].SetY(0.0);
  60. }
  61. m_szPathName.Empty();
  62. m_pSelObjs = new CQSelObjManager;
  63. }
  64. CQMapObj::~CQMapObj()
  65. {
  66. if(m_pSelObjs)
  67. delete m_pSelObjs;
  68. int nLayerCount = GetLayerCount();
  69. for(int i=0;i,i<nLayerCount;i++)
  70. {
  71. if(m_LayerList[i]) delete m_LayerList[i];
  72. }
  73. m_LayerList.RemoveAll();
  74. }
  75. long CQMapObj::SetMapIDByRandom()
  76. {
  77. long lMapID = m_lMapID;   
  78. srand( (unsigned)time( NULL ) );
  79. while(1)
  80. {
  81.  int g = rand()%10; //个位
  82.  int s = rand()%10; //十位
  83.  int b = rand()%10; //百位
  84.  int q = rand()%10; //万位
  85.  int m = rand()%10; //十万位
  86.  int n = rand()%10; //百万位
  87.      lMapID = n*100000+m*10000+q*1000+b*100+s*10+g;
  88.  if(lMapID != m_lMapID)
  89.  break;
  90. }
  91.  return lMapID;
  92. }
  93. //////////////////////////////////////////
  94. ///***************CQGIS****************///
  95. ///函数名称:AddObject
  96. ///返回类型:无
  97. ///入口参数:CQBaseObj * pObj
  98. ///出口参数:无
  99. ///思路说明:给地图中添加一个图元对象
  100. ///***************CQGIS****************///
  101. //////////////////////////////////////////
  102. void CQMapObj::AddObject(CQBaseObj * pObj)
  103. {
  104. if(!pObj)return;
  105. if(!m_pCurLayer) //如果当前图层不存在
  106. {
  107. if(m_LayerList.GetSize()>0) //假如地图对象中存在有图层
  108. {
  109. SetCurLayer(0);         //将第一个图层设置为当前图层
  110. }
  111. else
  112. {
  113. CQLayerObj * pLayer = new CQLayerObj;
  114. AddLayer(pLayer);
  115. SetCurLayer(pLayer); //将其设置为当前图层
  116. }
  117. }
  118. m_pCurLayer->AddObject(pObj);
  119. m_BoundingRect.Union(m_pCurLayer->GetBoundary());
  120. }
  121. //////////////////////////////////////////
  122. ///***************CQGIS****************///
  123. ///函数名称:AddLayer
  124. ///返回类型:无
  125. ///入口参数:CQLayerObj * pLayer
  126. ///出口参数:无
  127. ///思路说明:给地图对象中添加一个图层
  128. ///***************CQGIS****************///
  129. //////////////////////////////////////////
  130. void CQMapObj::AddLayer(CQLayerObj * pLayer)
  131. {
  132. if(!pLayer) return;  //如果入口参数不存在则返回
  133. int nLayerCount = this->GetLayerCount(); //获取图层数量
  134. BOOL bSame = FALSE;
  135. for(int i=0;i<nLayerCount;i++)
  136. {
  137. CQLayerObj * p = GetLayer(i);
  138. if(!p || p->GetLayerID() == pLayer->GetLayerID()) //假如是ID相同的图层
  139. {
  140. bSame = TRUE;
  141. break;
  142. }
  143. }
  144. if(bSame)  //假如有相同的图层
  145. {
  146. CString szWarn;
  147. szWarn.Format("您现在添加的图层与系统现有图层%ld相同,是否继续操作!",pLayer->GetLayerID());
  148. if(IDOK == AfxMessageBox(szWarn,MB_YESNO,MB_ICONWARNING))
  149. {
  150. long lLayerID = pLayer->SetLayerIDByRand();
  151. pLayer->SetLayerID(lLayerID);
  152. pLayer->SetMapID(GetMapID());
  153. m_LayerList.Add(pLayer);
  154. m_BoundingRect.Union(pLayer->GetBoundary());
  155. return;
  156. }
  157. }
  158. else
  159. {
  160. pLayer->SetMapID(GetMapID());
  161. m_LayerList.Add(pLayer);
  162. m_BoundingRect.Union(pLayer->GetBoundary());
  163. }
  164. }
  165. //////////////////////////////////////////
  166. ///***************CQGIS****************///
  167. ///函数名称:InitBoundary
  168. ///返回类型:
  169. ///入口参数:
  170. ///出口参数:
  171. ///思路说明:初始化地图对象的边界矩形
  172. ///***************CQGIS****************///
  173. //////////////////////////////////////////
  174. void CQMapObj::InitBoundary()
  175. {
  176. m_BoundingRect.m_fMinX = (double)LARGE_NUMBER;
  177. m_BoundingRect.m_fMinY = (double)LARGE_NUMBER;
  178. m_BoundingRect.m_fMaxX = -(double)LARGE_NUMBER;
  179. m_BoundingRect.m_fMaxY = -(double)LARGE_NUMBER;
  180. }
  181. //////////////////////////////////////////
  182. ///***************CQGIS****************///
  183. ///函数名称:CalculateBoundary
  184. ///返回类型:
  185. ///入口参数:CBoundaryRect * prect
  186. ///出口参数:
  187. ///思路说明:计算地图对象的边界矩形
  188. ///***************CQGIS****************///
  189. //////////////////////////////////////////
  190. void CQMapObj::CalculateBoundary(CBoundaryRect * prect)
  191. {
  192. int nLayerCount = GetLayerCount(); //获取
  193. if(nLayerCount == 0)return;
  194. InitBoundary();
  195. CBoundaryRect BRect;
  196. for(int i=0;i<nLayerCount;i++)
  197. {
  198. CQLayerObj * p = GetLayer(i);
  199. if(!p || p->GetDeleteFlag() || !p->GetShowFlag())
  200. continue;
  201. p->CalculateBoundary(&BRect);
  202. m_BoundingRect.Union(&BRect);
  203. }
  204. if(prect)
  205. {
  206. prect->SetRect(m_BoundingRect.m_fMinX,m_BoundingRect.m_fMinY,m_BoundingRect.m_fMaxX,m_BoundingRect.m_fMaxY);
  207. }
  208. }
  209. //////////////////////////////////////////
  210. ///***************CQGIS****************///
  211. ///函数名称:ClearAll
  212. ///返回类型:无
  213. ///入口参数:
  214. ///出口参数:
  215. ///思路说明:
  216. ///***************CQGIS****************///
  217. //////////////////////////////////////////
  218. inline void CQMapObj::ClearAll(bool bCreateNewLayer/* = false */)
  219. {
  220. int nCount = GetLayerCount();
  221. if(nCount == 0)return;
  222. for(int i=0;i<nCount;i++)
  223. delete m_LayerList[i];
  224. m_LayerList.RemoveAll();
  225. if(bCreateNewLayer)
  226. {
  227. m_pCurLayer = new CQLayerObj;
  228. AddLayer(m_pCurLayer);
  229. }
  230. else
  231. {
  232. m_pCurLayer = NULL;
  233. }
  234. }
  235. //////////////////////////////////////////
  236. ///***************CQGIS****************///
  237. ///函数名称:DataSave
  238. ///返回类型:
  239. ///入口参数:const char * sz
  240. ///出口参数:
  241. ///思路说明:保存地图对象
  242. ///***************CQGIS****************///
  243. //////////////////////////////////////////
  244. BOOL CQMapObj::DataSave(const char * sz)
  245. {
  246. CFile file;
  247. try
  248. {
  249. file.Open(sz,CFile::modeReadWrite | CFile::modeCreate);
  250. }
  251. catch (CFileException* e)
  252. {
  253. AfxMessageBox("无法打开文件,请检查指定的文件是否存在");
  254. e->ReportError();
  255. e->Delete();
  256. return FALSE;
  257. }
  258. //CArchive经常和FILE联用
  259. CArchive ar(&file,CArchive::store);
  260. Serialize(ar);
  261. ar.Close();
  262. file.Close();
  263. return TRUE;
  264. }
  265. //////////////////////////////////////////
  266. ///***************CQGIS****************///
  267. ///函数名称:DataOpen
  268. ///返回类型:
  269. ///入口参数:const char * sz
  270. ///出口参数:
  271. ///思路说明:从磁盘中打开地图对象文件
  272. ///***************CQGIS****************///
  273. //////////////////////////////////////////
  274. BOOL CQMapObj::DataOpen(const char * sz)
  275. {
  276. CFile file;
  277. try
  278. {
  279. file.Open(sz,CFile::modeRead);
  280. }
  281. catch (CFileException* e)
  282. {
  283. AfxMessageBox("文件无法打开,请检查指定的文件是否存在!");
  284. e->ReportError();
  285. e->Delete();
  286. return FALSE;
  287. }
  288. CArchive ar(&file,CArchive::load); //载入
  289. Serialize(ar);
  290. ar.Close();
  291. file.Close();
  292. return TRUE;
  293. }
  294. //////////////////////////////////////////
  295. ///***************CQGIS****************///
  296. ///函数名称:DataSerialize
  297. ///返回类型:
  298. ///入口参数:CArchive & ar
  299. ///出口参数:
  300. ///思路说明:地图对象的序列化
  301. ///***************CQGIS****************///
  302. //////////////////////////////////////////
  303. void CQMapObj::Serialize(CArchive & ar)
  304. {
  305. if(ar.IsStoring())  //存
  306. {
  307. ar.Write(&m_lMapID,sizeof(long));
  308. ar.Write(&m_lScale,sizeof(long));
  309. int ll = m_szMapName.GetLength();
  310. ar.Write(&ll,sizeof(int));
  311. ar.Write((const char *)m_szMapName,ll);
  312. ll = m_szMapDiscription.GetLength();
  313. ar.Write(&ll,sizeof(int));
  314. ar.Write((const char *)m_szMapDiscription,ll);
  315. ll = m_szPathName.GetLength();
  316. ar.Write(&ll,sizeof(int));
  317. ar.Write((const char *)m_szPathName,ll);
  318. int ncount = m_LayerList.GetSize();
  319. ar.Write(&ncount,sizeof(int)); //存了当前图层数
  320. for(int j=0;j<ncount;j++)
  321. m_LayerList[j]->Serialize(ar);
  322. ar.Write(&m_nElevationSys,sizeof(int));
  323. ar.Write(&m_nCoordSys,sizeof(int));
  324. ar.Write(m_faLongitude,sizeof(float)*6);
  325. ar.Write(m_faLatitude,sizeof(float)*6);
  326. ar.Write(&m_dwModifiedFlag,sizeof(DWORD));
  327. for(int i=0;i<4;i++)
  328. {
  329. m_aMapCorner[i].Serialize(ar);
  330. }
  331. m_BoundingRect.Serialize(ar);
  332. }
  333. else
  334. {
  335. ar.Read(&m_lMapID,sizeof(long));
  336. ar.Read(&m_lScale,sizeof(long));
  337. int ll = 0;
  338. ar.Read(&ll,sizeof(int));
  339. char sz[255];
  340. ar.Read(sz,ll);
  341. sz[ll]='';
  342. m_szMapName = CString(sz);
  343. ar.Read(&ll,sizeof(int));
  344. ar.Read(sz,ll);
  345. sz[ll]='';
  346. m_szMapDiscription = CString(sz);
  347. ar.Read(&ll,sizeof(int));
  348. ar.Read(sz,ll);
  349. sz[ll]='';
  350. m_szPathName = CString(sz);
  351. int nLayercount = 0;
  352. ar.Read(&nLayercount,sizeof(int));
  353. for(int j=0;j<nLayercount;j++)
  354. m_LayerList[j]->Serialize(ar);
  355. ar.Read(&m_nElevationSys,sizeof(int));
  356. ar.Read(&m_nCoordSys,sizeof(int));
  357. ar.Read(m_faLongitude,sizeof(float)*6);
  358. ar.Read(m_faLatitude,sizeof(float)*6);
  359. for(int i=0;i<4;i++)
  360. {
  361. m_aMapCorner[i].Serialize(ar);
  362. }
  363. m_BoundingRect.Serialize(ar);
  364. }
  365. }
  366. //////////////////////////////////////////
  367. ///***************CQGIS****************///
  368. ///函数名称:DeleteObject
  369. ///返回类型:
  370. ///入口参数:CQBaseObj * pObj
  371. ///出口参数:
  372. ///思路说明:删除指定的图元对象
  373. ///***************CQGIS****************///
  374. //////////////////////////////////////////
  375. void CQMapObj::DeleteObject(CQBaseObj * pObj)
  376. {
  377. if(!pObj)return; //检查给定的指针是否存在
  378. if(pObj->GetObjMapID() != m_lMapID)
  379. {
  380. AfxMessageBox("指定图元对象的地图对象ID不存在!");
  381. return;
  382. }
  383. int nLayerCount = GetLayerCount();
  384. for(int i=0;i<nLayerCount;i++)
  385. {
  386. CQLayerObj * pLayer = m_LayerList[i];
  387. if(pLayer && pLayer->GetLayerID() == pObj->GetObjLayerID())
  388. {
  389. pLayer->Deleteobject(pObj);
  390. CalculateBoundary(NULL);
  391. return;
  392. }
  393. }
  394. }
  395. //////////////////////////////////////////
  396. ///***************CQGIS****************///
  397. ///函数名称:DelLayer
  398. ///返回类型:
  399. ///入口参数:int nIndex
  400. ///出口参数:
  401. ///思路说明:删除图层列表中的一个图层
  402. ///***************CQGIS****************///
  403. //////////////////////////////////////////
  404. void CQMapObj::DelLayer(int nIndex)
  405. {
  406. int nCount = GetLayerCount();
  407. if(nCount == 0)return;
  408. if(nIndex<0 || nIndex>=nCount)return;
  409. delete m_LayerList[nIndex];
  410. m_LayerList.RemoveAt(nIndex);
  411. CalculateBoundary(NULL);
  412. }
  413. //////////////////////////////////////////
  414. ///***************CQGIS****************///
  415. ///函数名称:DelLayer
  416. ///返回类型:
  417. ///入口参数:CQLayerObj * pLayer
  418. ///出口参数:
  419. ///思路说明:删除图层列表中的一个图层
  420. ///***************CQGIS****************///
  421. //////////////////////////////////////////
  422. void CQMapObj::DelLayer(CQLayerObj * pLayer)
  423. {
  424. if(!pLayer)return;
  425. if(pLayer->GetMapID() != m_lMapID)
  426. {
  427. AfxMessageBox("指定图层的地图ID与当前地图对象ID不同,无法删除!");
  428. return;
  429. }
  430. int nCount = GetLayerCount();
  431. for(int i=0;i<nCount;i++)
  432. {
  433. if(pLayer->GetLayerID() == m_LayerList[i]->GetLayerID())
  434. {
  435. delete m_LayerList[i];
  436. m_LayerList.RemoveAt(i);
  437. CalculateBoundary(NULL);
  438. return;
  439. }
  440. }
  441. }
  442. //////////////////////////////////////////
  443. ///***************CQGIS****************///
  444. ///函数名称:Display
  445. ///返回类型:
  446. ///入口参数:CQCoordSys * pCoorSys,CDC *pDC,int nDrawMode, int nSpecialMode,COLORREF * pColor
  447. ///出口参数:
  448. ///思路说明:图元对象的显示
  449. ///***************CQGIS****************///
  450. //////////////////////////////////////////
  451. void CQMapObj::Display(CQCoordSys * pCoorSys,CDC *pDC,int nDrawMode, int nSpecialMode,COLORREF * pColor)
  452. {
  453. CRect rect;
  454.   pCoorSys->WPtoLP(m_BoundingRect, &rect);
  455. int nScreenWidth = pDC->GetDeviceCaps(HORZRES);
  456. int nScreenHeight = pDC->GetDeviceCaps(VERTRES);
  457. if(rect.bottom<0)return;
  458. if(rect.top>nScreenHeight)return;
  459. if(rect.left>nScreenWidth)return;
  460.   if(rect.right<0)return;
  461. int ncount = GetLayerCount();
  462. if(ncount == 0)return;
  463. for(int i=0;i<ncount;i++)
  464. {
  465. CQLayerObj * p = m_LayerList[i];
  466. if(p && !p->GetDeleteFlag() && p->GetShowFlag())
  467. {
  468. p->Display(pCoorSys,pDC,nDrawMode,nSpecialMode,pColor);
  469. }
  470. }
  471. }
  472. //////////////////////////////////////////
  473. ///***************CQGIS****************///
  474. ///函数名称:GetLayerCount
  475. ///返回类型:int
  476. ///入口参数:
  477. ///出口参数:
  478. ///思路说明:获取地图对象中图层的数量
  479. ///***************CQGIS****************///
  480. //////////////////////////////////////////
  481. inline int CQMapObj::GetLayerCount() const
  482. {
  483. return m_LayerList.GetSize();
  484. }
  485. //////////////////////////////////////////
  486. ///***************CQGIS****************///
  487. ///函数名称:GetBoundary
  488. ///返回类型:CBoundaryRect
  489. ///入口参数:
  490. ///出口参数:
  491. ///思路说明:返回图幅对象的边界矩形
  492. ///***************CQGIS****************///
  493. //////////////////////////////////////////
  494. CBoundaryRect * CQMapObj::GetBoundary()
  495. {
  496. CBoundaryRect * pRect = new CBoundaryRect;
  497. CalculateBoundary(pRect);
  498. return pRect;
  499. }
  500. //////////////////////////////////////////
  501. ///***************CQGIS****************///
  502. ///函数名称:DisplayAllInView
  503. ///返回类型:
  504. ///入口参数:CQCoordSys *pCoorSys,CView * pView
  505. ///出口参数:
  506. ///思路说明:将所有图元显示到视口
  507. ///***************CQGIS****************///
  508. //////////////////////////////////////////
  509. void CQMapObj::DisplayAllInView(CQCoordSys *pCoorSys,CView * pView)
  510. {
  511. CWaitCursor wait;
  512. CalculateBoundary(NULL);
  513. if(!m_BoundingRect.IsValid())
  514. return;
  515. pCoorSys->DisplayAllInRect(m_BoundingRect.m_fMinX,m_BoundingRect.m_fMinY,m_BoundingRect.m_fMaxX,m_BoundingRect.m_fMaxY);
  516. if(pView) pView->InvalidateRect(NULL,TRUE);
  517. }
  518. //////////////////////////////////////////
  519. ///***************CQGIS****************///
  520. ///函数名称:DisplayBackground
  521. ///返回类型:
  522. ///入口参数:CQCoordSys *pCoorSys,CDC * pDC
  523. ///出口参数:
  524. ///思路说明:显示背景
  525. ///***************CQGIS****************///
  526. //////////////////////////////////////////
  527. void CQMapObj::DisplayBackground(CQCoordSys *pCoorSys,CDC * pDC)
  528. {
  529. CBrush brush(g_QObj.g_CurBackgroundColor);
  530. CBrush * pOldBrush = pDC->SelectObject(&brush);
  531. if(g_QObj.g_nCurMapMode==MM_TEXT)
  532. pDC->PatBlt(0,0,pCoorSys->GetViewportSize().cx,
  533. pCoorSys->GetViewportSize().cy,PATCOPY); //填充屏幕
  534. else
  535. pDC->PatBlt(0,0,pCoorSys->GetViewportSize().cx,
  536. -pCoorSys->GetViewportSize().cy,PATCOPY);
  537. pDC->SelectObject(pOldBrush);
  538. }
  539. //////////////////////////////////////////
  540. ///***************CQGIS****************///
  541. ///函数名称:ExchangeLayerPos
  542. ///返回类型:
  543. ///入口参数:int nPos1,int nPos2
  544. ///出口参数:
  545. ///思路说明:对换图层位置(改变图层集合对象中两图层指针的位置
  546. ///***************CQGIS****************///
  547. //////////////////////////////////////////
  548. inline void CQMapObj::ExchangeLayerPos(int nPos1,int nPos2)
  549. {
  550. int nCount = GetLayerCount();
  551. if(nCount == 0)return;
  552. //安全性检验
  553. if(nPos1<0 || nPos1>=nCount || nPos2<0 || nPos2>=nCount)
  554. return;
  555. CQLayerObj * pTemp;
  556. pTemp = m_LayerList[nPos1];
  557. m_LayerList[nPos1] = m_LayerList[nPos2];
  558. m_LayerList[nPos2] = pTemp;
  559. }
  560. //////////////////////////////////////////
  561. ///***************CQGIS****************///
  562. ///函数名称:ExchangeLayerPos
  563. ///返回类型:
  564. ///入口参数:CQLayerObj * pLayer1,CQLayerObj * pLayer2
  565. ///出口参数:
  566. ///思路说明:对换图层位置(改变图层集合对象中两图层指针的位置)
  567. ///***************CQGIS****************///
  568. //////////////////////////////////////////
  569. inline void CQMapObj::ExchangeLayerPos(CQLayerObj * pLayer1,CQLayerObj * pLayer2)
  570. {
  571. int ncount = GetLayerCount();
  572. if(ncount == 0)return;
  573. if(!pLayer1 || !pLayer2)return;
  574. int nPos1 = GetLayerIndex(pLayer1);
  575. int nPos2 = GetLayerIndex(pLayer2);
  576. ExchangeLayerPos(nPos1,nPos2);
  577. }
  578. //////////////////////////////////////////
  579. ///***************CQGIS****************///
  580. ///函数名称:FindObj
  581. ///返回类型:CQBaseObj *
  582. ///入口参数:long lObjID
  583. ///出口参数:
  584. ///思路说明:根据ID查找图元并返回其指针
  585. ///***************CQGIS****************///
  586. //////////////////////////////////////////
  587. inline CQBaseObj * CQMapObj::FindObj(long lObjID)
  588. {
  589. int nCount = GetLayerCount();
  590. if(nCount == 0)return NULL;
  591. CQBaseObj * pObj = NULL;
  592. for(int i=0;i<nCount;i++)
  593. {
  594. CQLayerObj * p = m_LayerList[i];
  595. if(p || p->GetDeleteFlag()) continue;
  596. pObj = p->FindObj(lObjID);
  597. if(pObj)
  598. {
  599. return pObj;
  600. }
  601. }
  602. return NULL;
  603. }
  604. //////////////////////////////////////////
  605. ///***************CQGIS****************///
  606. ///函数名称:GetBottomLeftCorner
  607. ///返回类型:
  608. ///入口参数:
  609. ///出口参数:
  610. ///思路说明:获取地图左下角世界坐标值
  611. ///***************CQGIS****************///
  612. //////////////////////////////////////////
  613. inline CQPoint CQMapObj::GetBottomLeftCorner()
  614. {
  615. return m_aMapCorner[0];
  616. }
  617. //////////////////////////////////////////
  618. ///***************CQGIS****************///
  619. ///函数名称:GetBottomRightCorner
  620. ///返回类型:
  621. ///入口参数:
  622. ///出口参数:
  623. ///思路说明:获取地图右下角世界坐标值
  624. ///***************CQGIS****************///
  625. //////////////////////////////////////////
  626. inline CQPoint CQMapObj::GetBottomRightCorner()
  627. {
  628. return m_aMapCorner[1];
  629. }
  630. //////////////////////////////////////////
  631. ///***************CQGIS****************///
  632. ///函数名称:
  633. ///返回类型:
  634. ///入口参数:
  635. ///出口参数:
  636. ///思路说明:
  637. ///***************CQGIS****************///
  638. //////////////////////////////////////////
  639. inline int CQMapObj::GetCoordSys(CString * pszCoordSys /* = NULL */)
  640. {
  641. switch(m_nCoordSys)
  642. {
  643. case 1:
  644. if (pszCoordSys) *pszCoordSys= "1954北京坐标系";
  645. break;
  646. case 2:
  647. if (pszCoordSys) *pszCoordSys= "西安80坐标系";
  648. break;
  649. case 3:
  650. if (pszCoordSys) *pszCoordSys= "WGS84坐标系";
  651. break;
  652. default:
  653. if (pszCoordSys) *pszCoordSys= "1954北京坐标系";
  654. m_nCoordSys = 1;
  655. break;
  656. }
  657. return m_nCoordSys; 
  658. }
  659. //////////////////////////////////////////
  660. ///***************CQGIS****************///
  661. ///函数名称:GetCurLayer
  662. ///返回类型:CQLayerObj *
  663. ///入口参数:
  664. ///出口参数:
  665. ///思路说明:返回当前图层
  666. ///***************CQGIS****************///
  667. //////////////////////////////////////////
  668. CQLayerObj * CQMapObj::GetCurLayer()
  669. {
  670. if(m_pCurLayer)return m_pCurLayer;
  671. return NULL;
  672. }
  673. //////////////////////////////////////////
  674. ///***************CQGIS****************///
  675. ///函数名称:GetLayer
  676. ///返回类型:CQLayerObj * 
  677. ///入口参数:int nIndex
  678. ///出口参数:
  679. ///思路说明:根据索引获取图层
  680. ///***************CQGIS****************///
  681. //////////////////////////////////////////
  682. inline CQLayerObj * CQMapObj::GetLayer(int nIndex)
  683. {
  684. int nCount = GetLayerCount();
  685. if(nCount == 0)return NULL;
  686. if(nIndex<0 ||nIndex>=nCount)return NULL;
  687. return m_LayerList[nIndex];
  688. }
  689. //////////////////////////////////////////
  690. ///***************CQGIS****************///
  691. ///函数名称:GetLayerIndex
  692. ///返回类型:int
  693. ///入口参数:CQLayerObj * pLayer
  694. ///出口参数:
  695. ///思路说明:返回指定图层的索引
  696. ///***************CQGIS****************///
  697. //////////////////////////////////////////
  698. inline int CQMapObj::GetLayerIndex(CQLayerObj * pLayer)
  699. {
  700. if(!pLayer) return -1;
  701. int nCount = GetLayerCount();
  702. if(nCount == 0)return -1;
  703. for(int i=0;i<nCount;i++)
  704. {
  705. if(pLayer->GetLayerID() == m_LayerList[i]->GetLayerID())
  706. return i;
  707. }
  708. return -1;
  709. }
  710. //////////////////////////////////////////
  711. ///***************CQGIS****************///
  712. ///函数名称:GetLayers
  713. ///返回类型:CQLayers *
  714. ///入口参数:
  715. ///出口参数:
  716. ///思路说明:返回图层集合对象
  717. ///***************CQGIS****************///
  718. //////////////////////////////////////////
  719. inline CQLayers * CQMapObj::GetLayers()
  720. {
  721. return &m_LayerList;
  722. }
  723. //////////////////////////////////////////
  724. ///***************CQGIS****************///
  725. ///函数名称:GetMapCorner
  726. ///返回类型:CQPoint mapcorner[4]
  727. ///入口参数:
  728. ///出口参数:
  729. ///思路说明:返回地图角点坐标
  730. ///***************CQGIS****************///
  731. //////////////////////////////////////////
  732. inline void CQMapObj::GetMapCorner(CQPoint mapcorner[4])
  733. {
  734. for(int i=0;i<4;i++)
  735. mapcorner[i]=m_aMapCorner[i];
  736. }
  737. //////////////////////////////////////////
  738. ///***************CQGIS****************///
  739. ///函数名称:GetMapDiscription
  740. ///返回类型:CString
  741. ///入口参数:
  742. ///出口参数:
  743. ///思路说明:
  744. ///***************CQGIS****************///
  745. //////////////////////////////////////////
  746. inline CString CQMapObj::GetMapDiscription() const
  747. {
  748. return m_szMapDiscription;
  749. }
  750. //////////////////////////////////////////
  751. ///***************CQGIS****************///
  752. ///函数名称:GetMapID
  753. ///返回类型:long
  754. ///入口参数:
  755. ///出口参数:
  756. ///思路说明:
  757. ///***************CQGIS****************///
  758. //////////////////////////////////////////
  759. inline long CQMapObj::GetMapID()
  760. {
  761. return m_lMapID;
  762. }
  763. //////////////////////////////////////////
  764. ///***************CQGIS****************///
  765. ///函数名称:GetMapName
  766. ///返回类型:CString
  767. ///入口参数:
  768. ///出口参数:
  769. ///思路说明:
  770. ///***************CQGIS****************///
  771. //////////////////////////////////////////
  772. inline CString CQMapObj::GetMapName()
  773. {
  774. return m_szMapName;
  775. }
  776. //////////////////////////////////////////
  777. ///***************CQGIS****************///
  778. ///函数名称:GetMapPath
  779. ///返回类型:CString
  780. ///入口参数:
  781. ///出口参数:
  782. ///思路说明:
  783. ///***************CQGIS****************///
  784. //////////////////////////////////////////
  785. inline CString CQMapObj::GetMapPath()
  786. {
  787. return m_szPathName;
  788. }
  789. //////////////////////////////////////////
  790. ///***************CQGIS****************///
  791. ///函数名称:GetMaxLayerID
  792. ///返回类型:long
  793. ///入口参数:
  794. ///出口参数:
  795. ///思路说明:
  796. ///***************CQGIS****************///
  797. //////////////////////////////////////////
  798. long CQMapObj::GetMaxLayerID()
  799. {
  800. int nCount = GetLayerCount();
  801. long nMaxLayerID = 0;
  802. for(int i=0;i<nCount;i++)
  803. {
  804. CQLayerObj *  p =m_LayerList[i];
  805. if(p)
  806. {
  807. if(p->GetLayerID()>nMaxLayerID)
  808. nMaxLayerID = p->GetLayerID();
  809. }
  810. }
  811. return nMaxLayerID;
  812. }
  813. //////////////////////////////////////////
  814. ///***************CQGIS****************///
  815. ///函数名称:GetMaxObjID
  816. ///返回类型:long
  817. ///入口参数:
  818. ///出口参数:
  819. ///思路说明:返回地图中最大的图元ID 
  820. ///***************CQGIS****************///
  821. //////////////////////////////////////////
  822. long CQMapObj::GetMaxObjID()
  823. {
  824. int nCount = GetLayerCount();
  825. int nMaxObjID = 0;
  826. for(int i=0;i<nCount;i++)
  827. {
  828. CQLayerObj *  p =m_LayerList[i];
  829. if(p)
  830. {
  831. int nObjs = p->GetObjCount();
  832. for(int j=0;j<nObjs;j++)
  833. {
  834. CQBaseObj * pp = p->GetObj(j);
  835. if(pp)
  836. {
  837. if(pp->GetObjID()>nMaxObjID)
  838. nMaxObjID = pp->GetObjID();
  839. }
  840. }
  841. }
  842. }
  843. return nMaxObjID;
  844. }
  845. //////////////////////////////////////////
  846. ///***************CQGIS****************///
  847. ///函数名称:GetScale
  848. ///返回类型:long
  849. ///入口参数:
  850. ///出口参数:
  851. ///思路说明:
  852. ///***************CQGIS****************///
  853. //////////////////////////////////////////
  854. inline long CQMapObj::GetScale() const
  855. {
  856. return m_lScale;
  857. }
  858. //////////////////////////////////////////
  859. ///***************CQGIS****************///
  860. ///函数名称:GetSelObjManager
  861. ///返回类型:CQSelObjManager *
  862. ///入口参数:
  863. ///出口参数:
  864. ///思路说明:返回选择对象管理器
  865. ///***************CQGIS****************///
  866. //////////////////////////////////////////
  867. CQSelObjManager * CQMapObj::GetSelObjManager()
  868. {
  869. return m_pSelObjs;
  870. }
  871. //////////////////////////////////////////
  872. ///***************CQGIS****************///
  873. ///函数名称:GetTopLeftCorner
  874. ///返回类型:CQPoint
  875. ///入口参数:
  876. ///出口参数:
  877. ///思路说明:
  878. ///***************CQGIS****************///
  879. //////////////////////////////////////////
  880. inline CQPoint CQMapObj::GetTopLeftCorner()
  881. {
  882. return m_aMapCorner[3];
  883. }
  884. //////////////////////////////////////////
  885. ///***************CQGIS****************///
  886. ///函数名称:GetTopRightCorner
  887. ///返回类型:CQPoint
  888. ///入口参数:
  889. ///出口参数:
  890. ///思路说明:
  891. ///***************CQGIS****************///
  892. //////////////////////////////////////////
  893. inline CQPoint CQMapObj::GetTopRightCorner()
  894. {
  895. return m_aMapCorner[2];
  896. }
  897. //////////////////////////////////////////
  898. ///***************CQGIS****************///
  899. ///函数名称:GetCurLayerIndex
  900. ///返回类型:int
  901. ///入口参数:
  902. ///出口参数:
  903. ///思路说明:
  904. ///***************CQGIS****************///
  905. //////////////////////////////////////////
  906. inline int CQMapObj::GetCurLayerIndex()
  907. {
  908. if(m_pCurLayer)
  909. {
  910. int nLayerIndex = GetLayerIndex(m_pCurLayer);
  911. return nLayerIndex;
  912. }
  913. return -1;
  914. }
  915. //////////////////////////////////////////
  916. ///***************CQGIS****************///
  917. ///函数名称:IndexLayer
  918. ///返回类型:int
  919. ///入口参数:long lLayerID
  920. ///出口参数:
  921. ///思路说明:
  922. ///***************CQGIS****************///
  923. //////////////////////////////////////////
  924. int CQMapObj::IndexLayer(long lLayerID)
  925. {
  926. int nCount = GetLayerCount();
  927. for(int i=0;i<nCount;i++)
  928. {
  929. CQLayerObj *  p =m_LayerList[i];
  930. if(p)
  931. {
  932. if(p->GetLayerID() == lLayerID)
  933. return i;
  934. }
  935. }
  936. return -1;
  937. }
  938. //////////////////////////////////////////
  939. ///***************CQGIS****************///
  940. ///函数名称:IsEmpty
  941. ///返回类型:BOOL
  942. ///入口参数:
  943. ///出口参数:
  944. ///思路说明:
  945. ///***************CQGIS****************///
  946. //////////////////////////////////////////
  947. BOOL CQMapObj::IsEmpty()
  948. {
  949. int nCount = m_LayerList.GetSize();
  950. if(nCount == 0)
  951. return TRUE;
  952. return FALSE;
  953. }
  954. //////////////////////////////////////////
  955. ///***************CQGIS****************///
  956. ///函数名称:MapToStr
  957. ///返回类型:void
  958. ///入口参数:CString * pStr
  959. ///出口参数:
  960. ///思路说明:
  961. ///***************CQGIS****************///
  962. //////////////////////////////////////////
  963. void CQMapObj::MapToStr(CString * pStr)
  964. {
  965. CString szMap;
  966. CString szCoord;
  967. GetCoordSys(&szCoord);
  968. szMap.Format("地图名称:%s地图描述:%s当前图层名:%s地图比例:%ld地图坐标系统:%s地图初始经度%f地图初始纬度%f地图图廓角点%f,&f,%f,%f",m_szMapName,m_szMapDiscription,m_pCurLayer->GetLayerName(),m_lScale,szCoord,m_faLongitude,m_faLatitude,m_aMapCorner[0],m_aMapCorner[1],m_aMapCorner[2],m_aMapCorner[3]);
  969. CString szLayer;
  970. int nCount = GetLayerCount();
  971. for(int i=0;i<nCount;i++)
  972. {
  973. CQLayerObj *  p =m_LayerList[i];
  974. if(p)
  975. {
  976. CString sz = p->VarToStr();
  977. szLayer += sz;
  978. }
  979. }
  980. szMap+=szLayer;
  981. if(pStr)
  982. *pStr = *pStr + szMap;
  983. }
  984. //////////////////////////////////////////
  985. ///***************CQGIS****************///
  986. ///函数名称:Move
  987. ///返回类型:
  988. ///入口参数:double dx,double dy
  989. ///出口参数:
  990. ///思路说明:
  991. ///***************CQGIS****************///
  992. //////////////////////////////////////////
  993. void CQMapObj::Move(double dx,double dy)
  994. {
  995. int nCount  = GetLayerCount();
  996. for(int i=0;i<nCount;i++)
  997. {
  998. CQLayerObj * p = m_LayerList[i];
  999. if(p)
  1000. {
  1001. p->Move(dx,dy);
  1002. }
  1003. }
  1004. CalculateBoundary(NULL);
  1005. }
  1006. //////////////////////////////////////////
  1007. ///***************CQGIS****************///
  1008. ///函数名称:MoveLayerNext
  1009. ///返回类型:void
  1010. ///入口参数:CQLayerObj * pLayer,int nCount
  1011. ///出口参数:
  1012. ///思路说明:向后移
  1013. ///***************CQGIS****************///
  1014. //////////////////////////////////////////
  1015. inline void CQMapObj::MoveLayerNext(CQLayerObj * pLayer,int nCount)
  1016. {
  1017. if(!pLayer)return;
  1018. int nIndex = GetLayerIndex(pLayer);
  1019. if(nIndex<0)return;
  1020. m_LayerList.RemoveAt(nIndex);
  1021. int nPos = nIndex+nCount-1;
  1022. if(nPos>GetLayerCount())
  1023. nPos = GetLayerCount();
  1024. m_LayerList.InsertAt(nPos,pLayer);
  1025. }
  1026. //////////////////////////////////////////
  1027. ///***************CQGIS****************///
  1028. ///函数名称:MoveLayerPrev
  1029. ///返回类型:void
  1030. ///入口参数:CQLayerObj * pLayer,int nCount
  1031. ///出口参数:
  1032. ///思路说明:向前移
  1033. ///***************CQGIS****************///
  1034. //////////////////////////////////////////
  1035. inline void CQMapObj::MoveLayerPrev(CQLayerObj * pLayer,int nCount)
  1036. {
  1037. if(!pLayer)return;
  1038. int nIndex = GetLayerIndex(pLayer);
  1039. if(nIndex<0)return;
  1040. int nLayerCount = GetLayerCount();
  1041. if(nCount>=nLayerCount)return;
  1042. int nPos = nIndex - nCount;
  1043. if(nPos<0)nPos = 0;
  1044. m_LayerList.RemoveAt(nIndex);
  1045. m_LayerList.InsertAt(nPos,pLayer);
  1046. }
  1047. //////////////////////////////////////////
  1048. ///***************CQGIS****************///
  1049. ///函数名称:MoveLayerToTop
  1050. ///返回类型:void
  1051. ///入口参数:CQLayerObj * pLayer
  1052. ///出口参数:
  1053. ///思路说明:
  1054. ///***************CQGIS****************///
  1055. //////////////////////////////////////////
  1056. inline void CQMapObj::MoveLayerToTop(CQLayerObj * pLayer)
  1057. {
  1058. if(!pLayer)return;
  1059. int nIndex = GetLayerIndex(pLayer);
  1060. if(nIndex<=0)return;
  1061. m_LayerList.RemoveAt(nIndex);
  1062. m_LayerList.InsertAt(0,pLayer);
  1063. }
  1064. //////////////////////////////////////////
  1065. ///***************CQGIS****************///
  1066. ///函数名称:MoveLayerToBottom
  1067. ///返回类型:void
  1068. ///入口参数:CQLayerObj * pLayer
  1069. ///出口参数:
  1070. ///思路说明:
  1071. ///***************CQGIS****************///
  1072. //////////////////////////////////////////
  1073. inline void CQMapObj::MoveLayerToBottom(CQLayerObj * pLayer)
  1074. {
  1075. if(!pLayer)return;
  1076. int nIndex = GetLayerIndex(pLayer);
  1077. if(nIndex<0 || nIndex ==GetLayerCount()-1)return;
  1078. m_LayerList.RemoveAt(nIndex);
  1079. m_LayerList.InsertAt(GetLayerCount(),pLayer);
  1080. }
  1081. //////////////////////////////////////////
  1082. ///***************CQGIS****************///
  1083. ///函数名称:Save
  1084. ///返回类型:void
  1085. ///入口参数:
  1086. ///出口参数:
  1087. ///思路说明:
  1088. ///***************CQGIS****************///
  1089. //////////////////////////////////////////
  1090. void CQMapObj::Save(const char * sz)
  1091. {
  1092. CFile file;
  1093. try
  1094. {
  1095. file.Open(sz,CFile::modeReadWrite | CFile::modeCreate);
  1096. }
  1097. catch (CFileException* e)
  1098. {
  1099. AfxMessageBox("无法打开文件,请检查指定的文件是否存在");
  1100. e->ReportError();
  1101. e->Delete();
  1102. return;
  1103. }
  1104. //CArchive经常和FILE联用
  1105. CArchive ar(&file,CArchive::store);
  1106. Serialize(ar);
  1107. ar.Close();
  1108. file.Close();
  1109. return;
  1110. }
  1111. //////////////////////////////////////////
  1112. ///***************CQGIS****************///
  1113. ///函数名称:
  1114. ///返回类型:
  1115. ///入口参数:
  1116. ///出口参数:
  1117. ///思路说明:
  1118. ///***************CQGIS****************///
  1119. //////////////////////////////////////////
  1120. BOOL CQMapObj::Open(const char * sz)
  1121. {
  1122. CFile file;
  1123. try
  1124. {
  1125. file.Open(sz,CFile::modeRead);
  1126. }
  1127. catch (CFileException* e)
  1128. {
  1129. AfxMessageBox("无法打开文件,请检查指定的文件是否存在");
  1130. e->ReportError();
  1131. e->Delete();
  1132. return FALSE;
  1133. }
  1134. CArchive ar(&file,CArchive::load);
  1135. Serialize(ar);
  1136. ar.Close();
  1137. file.Close();
  1138. return TRUE;
  1139. }
  1140. //////////////////////////////////////////
  1141. ///***************CQGIS****************///
  1142. ///函数名称:Select
  1143. ///返回类型:CQBaseObj *
  1144. ///入口参数:CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys,CQPoint &pt, double & fEffectedDistance
  1145. ///出口参数:
  1146. ///思路说明:
  1147. ///***************CQGIS****************///
  1148. //////////////////////////////////////////
  1149. CQBaseObj * CQMapObj::Select(CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys,CQPoint &pt, double & fEffectedDistance)
  1150. {
  1151. CBoundaryRect BRect;
  1152. CalculateBoundary(&BRect);
  1153. if(!BRect.PtInRect(pt))return NULL;
  1154. int nCount = GetLayerCount();
  1155. if(nCount == 0)return NULL;
  1156. CQBaseObj * pObj = NULL;
  1157. for(int i=0;i<nCount;i++)
  1158. {
  1159. CQLayerObj *  p =m_LayerList[i];
  1160. if(!p || p->GetDeleteFlag() || !p->GetShowFlag())
  1161. continue;
  1162. pObj = p->Select(pSelObjs,pCoorSys,pt,fEffectedDistance);
  1163. if(pObj) return pObj;
  1164. }
  1165. return NULL;
  1166. }
  1167. //////////////////////////////////////////
  1168. ///***************CQGIS****************///
  1169. ///函数名称:Select
  1170. ///返回类型:int
  1171. ///入口参数:CQSelObjManager * pSelObjs,CQCoordSys * pCoorSys,CBoundaryRect &rectSel
  1172. ///出口参数:
  1173. ///思路说明:
  1174. ///***************CQGIS****************///
  1175. //////////////////////////////////////////
  1176. int CQMapObj::Select(CQSelObjManager * pSelObjs,CQCoordSys * pCoorSys,CBoundaryRect &rectSel)
  1177. {
  1178. CBoundaryRect BRect;
  1179. CalculateBoundary(&BRect);
  1180. if(!BRect.IsCross(&rectSel))return 0;
  1181. int nCount = GetLayerCount();
  1182. for(int i=0;i<nCount;i++)
  1183. {
  1184. CQLayerObj * p = m_LayerList[i];
  1185. if(!p || p->GetDeleteFlag() || !p->GetShowFlag())continue;
  1186. p->Select(pSelObjs,pCoorSys,rectSel);
  1187. }
  1188. return pSelObjs->GetSelObjCount();
  1189. }
  1190. //////////////////////////////////////////
  1191. ///***************CQGIS****************///
  1192. ///函数名称:SingleSelect
  1193. ///返回类型:CQBaseObj *
  1194. ///入口参数:CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys, CQPoint &pt, double & fEffectedDistance, int nSelectObjType /* = 0 */
  1195. ///出口参数:
  1196. ///思路说明:
  1197. ///***************CQGIS****************///
  1198. //////////////////////////////////////////
  1199. CQBaseObj * CQMapObj::SingleSelect(CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys, CQPoint &pt, double & fEffectedDistance, int nSelectObjType /* = 0 */)
  1200. {
  1201. CBoundaryRect BRect;
  1202. CalculateBoundary(&BRect);
  1203. if(!BRect.PtInRect(pt))return NULL;
  1204. int nCount = GetLayerCount();
  1205. if(nCount == 0)return NULL;
  1206. CQBaseObj * pObj = NULL;
  1207. CQLayerObj * p = NULL;
  1208. for(int i=0;i<nCount;i++)
  1209. {
  1210. p = m_LayerList[i];
  1211. if(!p || p->GetDeleteFlag() || !p->GetShowFlag())
  1212. continue;
  1213. pObj = p->SingleSelect(pSelObjs,pCoorSys,pt,fEffectedDistance,nSelectObjType);
  1214. if(pObj)
  1215. return pObj;
  1216. }
  1217. return NULL;
  1218. }
  1219. //////////////////////////////////////////
  1220. ///***************CQGIS****************///
  1221. ///函数名称:
  1222. ///返回类型:void
  1223. ///入口参数:SetBottomLeftCorner
  1224. ///出口参数:
  1225. ///思路说明:
  1226. ///***************CQGIS****************///
  1227. //////////////////////////////////////////
  1228. inline void CQMapObj::SetBottomLeftCorner(CQPoint pt)
  1229. {
  1230. m_aMapCorner[0] = pt;
  1231. }
  1232. //////////////////////////////////////////
  1233. ///***************CQGIS****************///
  1234. ///函数名称:SetBottomRightCorner
  1235. ///返回类型:void
  1236. ///入口参数:
  1237. ///出口参数:
  1238. ///思路说明:
  1239. ///***************CQGIS****************///
  1240. //////////////////////////////////////////
  1241. inline void CQMapObj::SetBottomRightCorner(CQPoint pt)
  1242. {
  1243. m_aMapCorner[1] = pt;
  1244. }
  1245. //////////////////////////////////////////
  1246. ///***************CQGIS****************///
  1247. ///函数名称:SetCoordSys
  1248. ///返回类型:void
  1249. ///入口参数:int nCoordSys
  1250. ///出口参数:
  1251. ///思路说明:
  1252. ///***************CQGIS****************///
  1253. //////////////////////////////////////////
  1254. inline void CQMapObj::SetCoordSys(int nCoordSys)
  1255. {
  1256. m_nCoordSys = nCoordSys;
  1257. }
  1258. //////////////////////////////////////////
  1259. ///***************CQGIS****************///
  1260. ///函数名称:inline void CQMapObj::SetCurLayer(CQLayerObj * pLayer)
  1261. ///返回类型:void
  1262. ///入口参数:CQLayerObj * pLayer
  1263. ///出口参数:
  1264. ///思路说明:
  1265. ///***************CQGIS****************///
  1266. //////////////////////////////////////////
  1267. inline void CQMapObj::SetCurLayer(CQLayerObj * pLayer)
  1268. {
  1269. if(!pLayer)return;
  1270. m_pCurLayer = pLayer;
  1271. }
  1272. //////////////////////////////////////////
  1273. ///***************CQGIS****************///
  1274. ///函数名称:SetCurLayer
  1275. ///返回类型:void
  1276. ///入口参数:int nIndex
  1277. ///出口参数:
  1278. ///思路说明:
  1279. ///***************CQGIS****************///
  1280. //////////////////////////////////////////
  1281. inline void CQMapObj::SetCurLayer(int nIndex)
  1282. {
  1283. int nCount = GetLayerCount();
  1284. if(nIndex<0 || nIndex>=nCount)return;
  1285. m_pCurLayer = m_LayerList[nIndex];
  1286. }
  1287. //////////////////////////////////////////
  1288. ///***************CQGIS****************///
  1289. ///函数名称:SetLayerIndex
  1290. ///返回类型:void
  1291. ///入口参数:CQLayerObj * pLayer, int nIndex
  1292. ///出口参数:
  1293. ///思路说明:
  1294. ///***************CQGIS****************///
  1295. //////////////////////////////////////////
  1296. inline void CQMapObj::SetLayerIndex(CQLayerObj * pLayer, int nIndex)
  1297. {
  1298. if(!pLayer)return;
  1299. if(nIndex<0 || nIndex>=GetLayerCount()) return;
  1300. int nIndexFrom = GetLayerIndex(pLayer);
  1301. if(nIndexFrom<0)return;
  1302. ExchangeLayerPos(nIndexFrom,nIndex);
  1303. }
  1304. //////////////////////////////////////////
  1305. ///***************CQGIS****************///
  1306. ///函数名称:SetMapCorner
  1307. ///返回类型:void
  1308. ///入口参数:CQPoint mapcorner[4]
  1309. ///出口参数:
  1310. ///思路说明:
  1311. ///***************CQGIS****************///
  1312. //////////////////////////////////////////
  1313. inline void CQMapObj::SetMapCorner(CQPoint mapcorner[4])
  1314. {
  1315. for(int i=0;i<4;i++)
  1316. {
  1317. m_aMapCorner[i]=mapcorner[i];
  1318. }
  1319. }
  1320. //////////////////////////////////////////
  1321. ///***************CQGIS****************///
  1322. ///函数名称:SetMapDiscription
  1323. ///返回类型:void
  1324. ///入口参数:CString sz
  1325. ///出口参数:
  1326. ///思路说明:
  1327. ///***************CQGIS****************///
  1328. //////////////////////////////////////////
  1329. inline void CQMapObj::SetMapDiscription(CString sz)
  1330. {
  1331. m_szMapDiscription = sz;
  1332. }
  1333. //////////////////////////////////////////
  1334. ///***************CQGIS****************///
  1335. ///函数名称:SetMapID
  1336. ///返回类型:void
  1337. ///入口参数:long lID
  1338. ///出口参数:
  1339. ///思路说明:
  1340. ///***************CQGIS****************///
  1341. //////////////////////////////////////////
  1342. inline void CQMapObj::SetMapID(long lID)
  1343. {
  1344. int nCount = GetLayerCount();
  1345. for(int i=0;i<nCount;i++)
  1346. {
  1347. CQLayerObj * p = m_LayerList[i];
  1348. if(p && !p->GetDeleteFlag())
  1349. {
  1350. if(p->GetLayerID() == lID)
  1351. {
  1352. AfxMessageBox("指定的ID已存在,请重新设置!");
  1353. return;
  1354. }
  1355. }
  1356. }
  1357. m_lMapID = lID;
  1358. }
  1359. //////////////////////////////////////////
  1360. ///***************CQGIS****************///
  1361. ///函数名称:SetMapName
  1362. ///返回类型:void
  1363. ///入口参数:CString sz
  1364. ///出口参数:
  1365. ///思路说明:
  1366. ///***************CQGIS****************///
  1367. //////////////////////////////////////////
  1368. inline void CQMapObj::SetMapName(CString sz)
  1369. {
  1370. m_szMapName = sz;
  1371. }
  1372. //////////////////////////////////////////
  1373. ///***************CQGIS****************///
  1374. ///函数名称:SetScale
  1375. ///返回类型:void
  1376. ///入口参数:long lScale
  1377. ///出口参数:
  1378. ///思路说明:
  1379. ///***************CQGIS****************///
  1380. //////////////////////////////////////////
  1381. void CQMapObj::SetScale(long lScale /* = 10000 */)
  1382. {
  1383. m_lScale = lScale;
  1384. }
  1385. //////////////////////////////////////////
  1386. ///***************CQGIS****************///
  1387. ///函数名称:SetTopLeftCorner
  1388. ///返回类型:void
  1389. ///入口参数:(CQPoint pt
  1390. ///出口参数:
  1391. ///思路说明:
  1392. ///***************CQGIS****************///
  1393. //////////////////////////////////////////
  1394. inline void CQMapObj::SetTopLeftCorner(CQPoint pt)
  1395. {
  1396. m_aMapCorner[3] = pt;
  1397. }
  1398. //////////////////////////////////////////
  1399. ///***************CQGIS****************///
  1400. ///函数名称:SetTopRightCorner
  1401. ///返回类型:void
  1402. ///入口参数:(CQPoint pt
  1403. ///出口参数:
  1404. ///思路说明:
  1405. ///***************CQGIS****************///
  1406. //////////////////////////////////////////
  1407. inline void CQMapObj::SetTopRightCorner(CQPoint pt)
  1408. {
  1409. m_aMapCorner[2] = pt;
  1410. }
  1411. //////////////////////////////////////////
  1412. ///***************CQGIS****************///
  1413. ///函数名称:WriteToFile
  1414. ///返回类型:void
  1415. ///入口参数:CFile * pf
  1416. ///出口参数:
  1417. ///思路说明:
  1418. ///***************CQGIS****************///
  1419. //////////////////////////////////////////
  1420. void CQMapObj::WriteToFile(CFile * pf)
  1421. {
  1422. pf->Write(&m_lMapID,sizeof(long));
  1423. pf->Write(&m_lScale,sizeof(long));
  1424. int ll = m_szMapName.GetLength();
  1425. pf->Write(&ll,sizeof(int));
  1426. pf->Write((const char *)m_szMapName,ll);
  1427. ll = m_szMapDiscription.GetLength();
  1428. pf->Write(&ll,sizeof(int));
  1429. pf->Write((const char *)m_szMapDiscription,ll);
  1430. ll = m_szPathName.GetLength();
  1431. pf->Write(&ll,sizeof(int));
  1432. pf->Write((const char *)m_szPathName,ll);
  1433. int ncount = m_LayerList.GetSize();
  1434. pf->Write(&ncount,sizeof(int)); //存了当前图层数
  1435. int i=0;
  1436. for(i=0;i<ncount;i++)
  1437. {
  1438. CQLayerObj * p = m_LayerList[i];
  1439. if(p && !p->GetDeleteFlag())
  1440. {
  1441. p->WriteToFile(pf);
  1442. }
  1443. }
  1444. pf->Write(&m_nElevationSys,sizeof(int));
  1445. pf->Write(&m_nCoordSys,sizeof(int));
  1446. pf->Write(m_faLongitude,sizeof(float)*6);
  1447. pf->Write(m_faLatitude,sizeof(float)*6);
  1448. pf->Write(&m_dwModifiedFlag,sizeof(DWORD));
  1449. for(i=0;i<4;i++)
  1450. {
  1451. m_aMapCorner[i].WriteToFile(pf);
  1452. }
  1453. m_BoundingRect.WriteToFile(pf);
  1454. }
  1455. //////////////////////////////////////////
  1456. ///***************CQGIS****************///
  1457. ///函数名称:
  1458. ///返回类型:
  1459. ///入口参数:
  1460. ///出口参数:
  1461. ///思路说明:
  1462. ///***************CQGIS****************///
  1463. //////////////////////////////////////////
  1464. void CQMapObj::ReadFromFile(CFile * pf)
  1465. {
  1466. InitBoundary();
  1467. pf->Read(&m_lMapID,sizeof(long));
  1468. pf->Read(&m_lScale,sizeof(long));
  1469. int ll = 0;
  1470. pf->Read(&ll,sizeof(int));
  1471. char sz[255];
  1472. pf->Read(sz,ll);
  1473. sz[ll]='';
  1474. m_szMapName = CString(sz);
  1475. pf->Read(&ll,sizeof(int));
  1476. pf->Read(sz,ll);
  1477. sz[ll]='';
  1478. m_szMapDiscription = CString(sz);
  1479. pf->Read(&ll,sizeof(int));
  1480. pf->Read(sz,ll);
  1481. sz[ll]='';
  1482. m_szPathName = CString(sz);
  1483. int nLayercount = 0;
  1484. pf->Read(&nLayercount,sizeof(int));
  1485. int i=0;
  1486. for(i=0;i<nLayercount;i++)
  1487. {
  1488. CQLayerObj * p = new CQLayerObj;
  1489. p->ReadFromFile(pf);
  1490. m_LayerList.Add(p);
  1491. m_BoundingRect.Union(p->GetBoundary());
  1492. }
  1493. pf->Read(&m_nElevationSys,sizeof(int));
  1494. pf->Read(&m_nCoordSys,sizeof(int));
  1495. pf->Read(m_faLongitude,sizeof(float)*6);
  1496. pf->Read(m_faLatitude,sizeof(float)*6);
  1497. for(i=0;i<4;i++)
  1498. {
  1499. m_aMapCorner[i].ReadFromFile(pf);
  1500. }
  1501. m_BoundingRect.ReadFromFile(pf);
  1502. }
  1503. //////////////////////////////////////////
  1504. ///***************CQGIS****************///
  1505. ///函数名称:XFlex
  1506. ///返回类型:void
  1507. ///入口参数:double dcp_x,double dFlex
  1508. ///出口参数:
  1509. ///思路说明:
  1510. ///***************CQGIS****************///
  1511. //////////////////////////////////////////
  1512. void CQMapObj::XFlex(double dcp_x,double dFlex)
  1513. {
  1514. int nCount = GetLayerCount();
  1515. for(int i=0;i<nCount;i++)
  1516. {
  1517. CQLayerObj * p = m_LayerList[i];
  1518. if(p && !p->GetDeleteFlag() && p->GetEditFlag() && p->GetShowFlag())
  1519. {
  1520. p->XFlex(dcp_x,dFlex);
  1521. }
  1522. }
  1523. }
  1524. //////////////////////////////////////////
  1525. ///***************CQGIS****************///
  1526. ///函数名称:YFlex
  1527. ///返回类型:void
  1528. ///入口参数:double dcp_y,double dFlex
  1529. ///出口参数:
  1530. ///思路说明:
  1531. ///***************CQGIS****************///
  1532. //////////////////////////////////////////
  1533. void CQMapObj::YFlex(double dcp_y,double dFlex)
  1534. {
  1535. int nCount = GetLayerCount();
  1536. for(int i=0;i<nCount;i++)
  1537. {
  1538. CQLayerObj * p = m_LayerList[i];
  1539. if(p && !p->GetDeleteFlag() && p->GetEditFlag() && p->GetShowFlag())
  1540. {
  1541. p->XFlex(dcp_y,dFlex);
  1542. }
  1543. }
  1544. }
  1545. //////////////////////////////////////////
  1546. ///***************CQGIS****************///
  1547. ///函数名称:Rotate
  1548. ///返回类型:void
  1549. ///入口参数:CQPoint & pt,double fAngle
  1550. ///出口参数:
  1551. ///思路说明:
  1552. ///***************CQGIS****************///
  1553. //////////////////////////////////////////
  1554. void CQMapObj::Rotate(CQPoint & pt,double fAngle)
  1555. {
  1556. int nCount = GetLayerCount();
  1557. for(int i=0;i<nCount;i++)
  1558. {
  1559. CQLayerObj * p = m_LayerList[i];
  1560. if(!p || p->GetDeleteFlag() || !p->GetShowFlag() || !p->GetEditFlag())
  1561. continue;
  1562. p->Rotate(pt,fAngle);
  1563. }
  1564. }
  1565. CBoundaryRect * CQMapObj::GetMapBoundary()
  1566. {
  1567. return &m_BoundingRect;
  1568. }
  1569. void CQMapObj::SetModifiedFlag(DWORD f)
  1570. {
  1571. m_dwModifiedFlag = f;
  1572. }
  1573. CQCoordSys * CQMapObj::GetCoordSysPointer()
  1574. {
  1575. return &m_CoordSys;
  1576. }
  1577. CQLayerObj * CQMapObj::FindLayer(CString szLayerName)
  1578. {
  1579. if(szLayerName.IsEmpty())
  1580. return NULL;
  1581. int nLayerNum = m_LayerList.GetSize();
  1582. if(nLayerNum == 0)return NULL;
  1583. for(int i=0;i<nLayerNum;i++)
  1584. {
  1585. CQLayerObj * pLayer = m_LayerList[i];
  1586. if(!pLayer || pLayer->GetDeleteFlag() || !pLayer->GetShowFlag())
  1587. continue;
  1588. if(pLayer->GetLayerName() == szLayerName)
  1589. return pLayer;
  1590. }
  1591. return NULL;
  1592. }
  1593. CQLayerObj * CQMapObj::FindLayer(long lLayerID)
  1594. {
  1595. int nLayerNum = m_LayerList.GetSize();
  1596. if(nLayerNum == 0)return NULL;
  1597. for(int i=0;i<nLayerNum;i++)
  1598. {
  1599. CQLayerObj * pLayer = m_LayerList[i];
  1600. if(!pLayer || pLayer->GetDeleteFlag() || !pLayer->GetShowFlag())
  1601. continue;
  1602. if(pLayer->GetLayerID() == lLayerID)
  1603. return pLayer;
  1604. }
  1605. return NULL;
  1606. }
  1607. void CQMapObj::RemoveLayer(CQLayerObj * pLayer)
  1608. {
  1609. int nLyrCount = m_LayerList.GetSize();
  1610. if(nLyrCount == 0)return;
  1611. if(!pLayer) return;
  1612. long lLayerID = pLayer->GetLayerID();
  1613. for(int i=0;i<nLyrCount;i++)
  1614. {
  1615. CQLayerObj * ptemp = m_LayerList.GetAt(i);
  1616. if(!ptemp) continue;
  1617. if(ptemp->GetLayerID() == lLayerID)
  1618. {
  1619. m_LayerList.RemoveAt(i);
  1620. break;
  1621. }
  1622. }
  1623. }
  1624. void CQMapObj::RemoveLayerByIndex(int nIndex)
  1625. {
  1626. int nLyrCount = m_LayerList.GetSize();
  1627. if(nLyrCount == 1)return;
  1628. if(nIndex>= nLyrCount || nIndex<0)return;
  1629. m_LayerList.RemoveAt(nIndex);
  1630. }
  1631. void CQMapObj::RemoveObject(CQBaseObj * pObj)
  1632. {
  1633. if(!pObj)return;
  1634. long lLyrID = pObj->GetObjLayerID();
  1635. CQLayerObj * pLayer = NULL;
  1636. pLayer = FindLayer(lLyrID);
  1637. if(!pLayer)return;
  1638. pLayer->RemoveObject(pObj);
  1639. }