QMapObj.cpp
资源名称:QGIS.rar [点击查看]
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:44k
源码类别:
GDI/图象编程
开发平台:
Visual C++
- // QMapObj.cpp: implementation of the CQMapObj class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "..stdafx.h"
- #include "..includeResource.h"
- #include "..includeQMapObj.h"
- #include "..includeQLayerObj.h"
- #include "..includeQSelObjManager.h"
- #include "..includeQPointArray.h"
- #include "..includeQCoordSys.h"
- #include "..includeQGlobalObj.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- //****************************说明******************************//
- //在QGIS系统中Map是最大的系统单位也是全部数据的统一管理对象
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:CQMapObj
- ///返回类型:无
- ///入口参数:无
- ///出口参数:无
- ///思路说明:构造函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQMapObj::CQMapObj()
- {
- m_lMapID = SetMapIDByRandom();
- m_szMapName.Format("地图%ld",m_lMapID);
- InitBoundary(); //初始化
- m_szMapDiscription = m_szMapName; //地图默认描述是地图名称
- m_pCurLayer = new CQLayerObj; //当前图层对象的初始化
- m_pCurLayer->SetMapID(m_lMapID);
- m_lScale = 500; //地图默认比例尺1:500
- m_nCoordSys=1; //坐标系统
- m_nElevationSys=1; //高程系统
- //上下纬度范围,分别用三个整数存储度分秒的数值
- //左右经度范围,分别用三个整数存储度分秒的数值
- m_faLongitude[0] =108;
- m_faLongitude[1] =0.0;
- m_faLongitude[2] =0.0;
- m_faLongitude[3] =108;
- m_faLongitude[4] =3;
- m_faLongitude[5] =45;
- m_faLatitude[0]=31;
- m_faLatitude[1]=57;
- m_faLatitude[2]=30;
- m_faLatitude[3]=32;
- m_faLatitude[4]=0;
- m_faLatitude[5]=0;
- for(int i = 0;i<4;i++)
- {
- m_aMapCorner[i].SetX(0.0);
- m_aMapCorner[i].SetY(0.0);
- }
- m_szPathName.Empty();
- m_pSelObjs = new CQSelObjManager;
- }
- CQMapObj::~CQMapObj()
- {
- if(m_pSelObjs)
- delete m_pSelObjs;
- int nLayerCount = GetLayerCount();
- for(int i=0;i,i<nLayerCount;i++)
- {
- if(m_LayerList[i]) delete m_LayerList[i];
- }
- m_LayerList.RemoveAll();
- }
- long CQMapObj::SetMapIDByRandom()
- {
- long lMapID = m_lMapID;
- srand( (unsigned)time( NULL ) );
- while(1)
- {
- int g = rand()%10; //个位
- int s = rand()%10; //十位
- int b = rand()%10; //百位
- int q = rand()%10; //万位
- int m = rand()%10; //十万位
- int n = rand()%10; //百万位
- lMapID = n*100000+m*10000+q*1000+b*100+s*10+g;
- if(lMapID != m_lMapID)
- break;
- }
- return lMapID;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:AddObject
- ///返回类型:无
- ///入口参数:CQBaseObj * pObj
- ///出口参数:无
- ///思路说明:给地图中添加一个图元对象
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::AddObject(CQBaseObj * pObj)
- {
- if(!pObj)return;
- if(!m_pCurLayer) //如果当前图层不存在
- {
- if(m_LayerList.GetSize()>0) //假如地图对象中存在有图层
- {
- SetCurLayer(0); //将第一个图层设置为当前图层
- }
- else
- {
- CQLayerObj * pLayer = new CQLayerObj;
- AddLayer(pLayer);
- SetCurLayer(pLayer); //将其设置为当前图层
- }
- }
- m_pCurLayer->AddObject(pObj);
- m_BoundingRect.Union(m_pCurLayer->GetBoundary());
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:AddLayer
- ///返回类型:无
- ///入口参数:CQLayerObj * pLayer
- ///出口参数:无
- ///思路说明:给地图对象中添加一个图层
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::AddLayer(CQLayerObj * pLayer)
- {
- if(!pLayer) return; //如果入口参数不存在则返回
- int nLayerCount = this->GetLayerCount(); //获取图层数量
- BOOL bSame = FALSE;
- for(int i=0;i<nLayerCount;i++)
- {
- CQLayerObj * p = GetLayer(i);
- if(!p || p->GetLayerID() == pLayer->GetLayerID()) //假如是ID相同的图层
- {
- bSame = TRUE;
- break;
- }
- }
- if(bSame) //假如有相同的图层
- {
- CString szWarn;
- szWarn.Format("您现在添加的图层与系统现有图层%ld相同,是否继续操作!",pLayer->GetLayerID());
- if(IDOK == AfxMessageBox(szWarn,MB_YESNO,MB_ICONWARNING))
- {
- long lLayerID = pLayer->SetLayerIDByRand();
- pLayer->SetLayerID(lLayerID);
- pLayer->SetMapID(GetMapID());
- m_LayerList.Add(pLayer);
- m_BoundingRect.Union(pLayer->GetBoundary());
- return;
- }
- }
- else
- {
- pLayer->SetMapID(GetMapID());
- m_LayerList.Add(pLayer);
- m_BoundingRect.Union(pLayer->GetBoundary());
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:InitBoundary
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:初始化地图对象的边界矩形
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::InitBoundary()
- {
- m_BoundingRect.m_fMinX = (double)LARGE_NUMBER;
- m_BoundingRect.m_fMinY = (double)LARGE_NUMBER;
- m_BoundingRect.m_fMaxX = -(double)LARGE_NUMBER;
- m_BoundingRect.m_fMaxY = -(double)LARGE_NUMBER;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:CalculateBoundary
- ///返回类型:
- ///入口参数:CBoundaryRect * prect
- ///出口参数:
- ///思路说明:计算地图对象的边界矩形
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::CalculateBoundary(CBoundaryRect * prect)
- {
- int nLayerCount = GetLayerCount(); //获取
- if(nLayerCount == 0)return;
- InitBoundary();
- CBoundaryRect BRect;
- for(int i=0;i<nLayerCount;i++)
- {
- CQLayerObj * p = GetLayer(i);
- if(!p || p->GetDeleteFlag() || !p->GetShowFlag())
- continue;
- p->CalculateBoundary(&BRect);
- m_BoundingRect.Union(&BRect);
- }
- if(prect)
- {
- prect->SetRect(m_BoundingRect.m_fMinX,m_BoundingRect.m_fMinY,m_BoundingRect.m_fMaxX,m_BoundingRect.m_fMaxY);
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:ClearAll
- ///返回类型:无
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::ClearAll(bool bCreateNewLayer/* = false */)
- {
- int nCount = GetLayerCount();
- if(nCount == 0)return;
- for(int i=0;i<nCount;i++)
- delete m_LayerList[i];
- m_LayerList.RemoveAll();
- if(bCreateNewLayer)
- {
- m_pCurLayer = new CQLayerObj;
- AddLayer(m_pCurLayer);
- }
- else
- {
- m_pCurLayer = NULL;
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DataSave
- ///返回类型:
- ///入口参数:const char * sz
- ///出口参数:
- ///思路说明:保存地图对象
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQMapObj::DataSave(const char * sz)
- {
- CFile file;
- try
- {
- file.Open(sz,CFile::modeReadWrite | CFile::modeCreate);
- }
- catch (CFileException* e)
- {
- AfxMessageBox("无法打开文件,请检查指定的文件是否存在");
- e->ReportError();
- e->Delete();
- return FALSE;
- }
- //CArchive经常和FILE联用
- CArchive ar(&file,CArchive::store);
- Serialize(ar);
- ar.Close();
- file.Close();
- return TRUE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DataOpen
- ///返回类型:
- ///入口参数:const char * sz
- ///出口参数:
- ///思路说明:从磁盘中打开地图对象文件
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQMapObj::DataOpen(const char * sz)
- {
- CFile file;
- try
- {
- file.Open(sz,CFile::modeRead);
- }
- catch (CFileException* e)
- {
- AfxMessageBox("文件无法打开,请检查指定的文件是否存在!");
- e->ReportError();
- e->Delete();
- return FALSE;
- }
- CArchive ar(&file,CArchive::load); //载入
- Serialize(ar);
- ar.Close();
- file.Close();
- return TRUE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DataSerialize
- ///返回类型:
- ///入口参数:CArchive & ar
- ///出口参数:
- ///思路说明:地图对象的序列化
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::Serialize(CArchive & ar)
- {
- if(ar.IsStoring()) //存
- {
- ar.Write(&m_lMapID,sizeof(long));
- ar.Write(&m_lScale,sizeof(long));
- int ll = m_szMapName.GetLength();
- ar.Write(&ll,sizeof(int));
- ar.Write((const char *)m_szMapName,ll);
- ll = m_szMapDiscription.GetLength();
- ar.Write(&ll,sizeof(int));
- ar.Write((const char *)m_szMapDiscription,ll);
- ll = m_szPathName.GetLength();
- ar.Write(&ll,sizeof(int));
- ar.Write((const char *)m_szPathName,ll);
- int ncount = m_LayerList.GetSize();
- ar.Write(&ncount,sizeof(int)); //存了当前图层数
- for(int j=0;j<ncount;j++)
- m_LayerList[j]->Serialize(ar);
- ar.Write(&m_nElevationSys,sizeof(int));
- ar.Write(&m_nCoordSys,sizeof(int));
- ar.Write(m_faLongitude,sizeof(float)*6);
- ar.Write(m_faLatitude,sizeof(float)*6);
- ar.Write(&m_dwModifiedFlag,sizeof(DWORD));
- for(int i=0;i<4;i++)
- {
- m_aMapCorner[i].Serialize(ar);
- }
- m_BoundingRect.Serialize(ar);
- }
- else
- {
- ar.Read(&m_lMapID,sizeof(long));
- ar.Read(&m_lScale,sizeof(long));
- int ll = 0;
- ar.Read(&ll,sizeof(int));
- char sz[255];
- ar.Read(sz,ll);
- sz[ll]=' ';
- m_szMapName = CString(sz);
- ar.Read(&ll,sizeof(int));
- ar.Read(sz,ll);
- sz[ll]=' ';
- m_szMapDiscription = CString(sz);
- ar.Read(&ll,sizeof(int));
- ar.Read(sz,ll);
- sz[ll]=' ';
- m_szPathName = CString(sz);
- int nLayercount = 0;
- ar.Read(&nLayercount,sizeof(int));
- for(int j=0;j<nLayercount;j++)
- m_LayerList[j]->Serialize(ar);
- ar.Read(&m_nElevationSys,sizeof(int));
- ar.Read(&m_nCoordSys,sizeof(int));
- ar.Read(m_faLongitude,sizeof(float)*6);
- ar.Read(m_faLatitude,sizeof(float)*6);
- for(int i=0;i<4;i++)
- {
- m_aMapCorner[i].Serialize(ar);
- }
- m_BoundingRect.Serialize(ar);
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DeleteObject
- ///返回类型:
- ///入口参数:CQBaseObj * pObj
- ///出口参数:
- ///思路说明:删除指定的图元对象
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::DeleteObject(CQBaseObj * pObj)
- {
- if(!pObj)return; //检查给定的指针是否存在
- if(pObj->GetObjMapID() != m_lMapID)
- {
- AfxMessageBox("指定图元对象的地图对象ID不存在!");
- return;
- }
- int nLayerCount = GetLayerCount();
- for(int i=0;i<nLayerCount;i++)
- {
- CQLayerObj * pLayer = m_LayerList[i];
- if(pLayer && pLayer->GetLayerID() == pObj->GetObjLayerID())
- {
- pLayer->Deleteobject(pObj);
- CalculateBoundary(NULL);
- return;
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DelLayer
- ///返回类型:
- ///入口参数:int nIndex
- ///出口参数:
- ///思路说明:删除图层列表中的一个图层
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::DelLayer(int nIndex)
- {
- int nCount = GetLayerCount();
- if(nCount == 0)return;
- if(nIndex<0 || nIndex>=nCount)return;
- delete m_LayerList[nIndex];
- m_LayerList.RemoveAt(nIndex);
- CalculateBoundary(NULL);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DelLayer
- ///返回类型:
- ///入口参数:CQLayerObj * pLayer
- ///出口参数:
- ///思路说明:删除图层列表中的一个图层
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::DelLayer(CQLayerObj * pLayer)
- {
- if(!pLayer)return;
- if(pLayer->GetMapID() != m_lMapID)
- {
- AfxMessageBox("指定图层的地图ID与当前地图对象ID不同,无法删除!");
- return;
- }
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- if(pLayer->GetLayerID() == m_LayerList[i]->GetLayerID())
- {
- delete m_LayerList[i];
- m_LayerList.RemoveAt(i);
- CalculateBoundary(NULL);
- return;
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Display
- ///返回类型:
- ///入口参数:CQCoordSys * pCoorSys,CDC *pDC,int nDrawMode, int nSpecialMode,COLORREF * pColor
- ///出口参数:
- ///思路说明:图元对象的显示
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::Display(CQCoordSys * pCoorSys,CDC *pDC,int nDrawMode, int nSpecialMode,COLORREF * pColor)
- {
- CRect rect;
- pCoorSys->WPtoLP(m_BoundingRect, &rect);
- int nScreenWidth = pDC->GetDeviceCaps(HORZRES);
- int nScreenHeight = pDC->GetDeviceCaps(VERTRES);
- if(rect.bottom<0)return;
- if(rect.top>nScreenHeight)return;
- if(rect.left>nScreenWidth)return;
- if(rect.right<0)return;
- int ncount = GetLayerCount();
- if(ncount == 0)return;
- for(int i=0;i<ncount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p && !p->GetDeleteFlag() && p->GetShowFlag())
- {
- p->Display(pCoorSys,pDC,nDrawMode,nSpecialMode,pColor);
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetLayerCount
- ///返回类型:int
- ///入口参数:
- ///出口参数:
- ///思路说明:获取地图对象中图层的数量
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline int CQMapObj::GetLayerCount() const
- {
- return m_LayerList.GetSize();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetBoundary
- ///返回类型:CBoundaryRect
- ///入口参数:
- ///出口参数:
- ///思路说明:返回图幅对象的边界矩形
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CBoundaryRect * CQMapObj::GetBoundary()
- {
- CBoundaryRect * pRect = new CBoundaryRect;
- CalculateBoundary(pRect);
- return pRect;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DisplayAllInView
- ///返回类型:
- ///入口参数:CQCoordSys *pCoorSys,CView * pView
- ///出口参数:
- ///思路说明:将所有图元显示到视口
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::DisplayAllInView(CQCoordSys *pCoorSys,CView * pView)
- {
- CWaitCursor wait;
- CalculateBoundary(NULL);
- if(!m_BoundingRect.IsValid())
- return;
- pCoorSys->DisplayAllInRect(m_BoundingRect.m_fMinX,m_BoundingRect.m_fMinY,m_BoundingRect.m_fMaxX,m_BoundingRect.m_fMaxY);
- if(pView) pView->InvalidateRect(NULL,TRUE);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:DisplayBackground
- ///返回类型:
- ///入口参数:CQCoordSys *pCoorSys,CDC * pDC
- ///出口参数:
- ///思路说明:显示背景
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::DisplayBackground(CQCoordSys *pCoorSys,CDC * pDC)
- {
- CBrush brush(g_QObj.g_CurBackgroundColor);
- CBrush * pOldBrush = pDC->SelectObject(&brush);
- if(g_QObj.g_nCurMapMode==MM_TEXT)
- pDC->PatBlt(0,0,pCoorSys->GetViewportSize().cx,
- pCoorSys->GetViewportSize().cy,PATCOPY); //填充屏幕
- else
- pDC->PatBlt(0,0,pCoorSys->GetViewportSize().cx,
- -pCoorSys->GetViewportSize().cy,PATCOPY);
- pDC->SelectObject(pOldBrush);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:ExchangeLayerPos
- ///返回类型:
- ///入口参数:int nPos1,int nPos2
- ///出口参数:
- ///思路说明:对换图层位置(改变图层集合对象中两图层指针的位置
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::ExchangeLayerPos(int nPos1,int nPos2)
- {
- int nCount = GetLayerCount();
- if(nCount == 0)return;
- //安全性检验
- if(nPos1<0 || nPos1>=nCount || nPos2<0 || nPos2>=nCount)
- return;
- CQLayerObj * pTemp;
- pTemp = m_LayerList[nPos1];
- m_LayerList[nPos1] = m_LayerList[nPos2];
- m_LayerList[nPos2] = pTemp;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:ExchangeLayerPos
- ///返回类型:
- ///入口参数:CQLayerObj * pLayer1,CQLayerObj * pLayer2
- ///出口参数:
- ///思路说明:对换图层位置(改变图层集合对象中两图层指针的位置)
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::ExchangeLayerPos(CQLayerObj * pLayer1,CQLayerObj * pLayer2)
- {
- int ncount = GetLayerCount();
- if(ncount == 0)return;
- if(!pLayer1 || !pLayer2)return;
- int nPos1 = GetLayerIndex(pLayer1);
- int nPos2 = GetLayerIndex(pLayer2);
- ExchangeLayerPos(nPos1,nPos2);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:FindObj
- ///返回类型:CQBaseObj *
- ///入口参数:long lObjID
- ///出口参数:
- ///思路说明:根据ID查找图元并返回其指针
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQBaseObj * CQMapObj::FindObj(long lObjID)
- {
- int nCount = GetLayerCount();
- if(nCount == 0)return NULL;
- CQBaseObj * pObj = NULL;
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p || p->GetDeleteFlag()) continue;
- pObj = p->FindObj(lObjID);
- if(pObj)
- {
- return pObj;
- }
- }
- return NULL;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetBottomLeftCorner
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:获取地图左下角世界坐标值
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQPoint CQMapObj::GetBottomLeftCorner()
- {
- return m_aMapCorner[0];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetBottomRightCorner
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:获取地图右下角世界坐标值
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQPoint CQMapObj::GetBottomRightCorner()
- {
- return m_aMapCorner[1];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline int CQMapObj::GetCoordSys(CString * pszCoordSys /* = NULL */)
- {
- switch(m_nCoordSys)
- {
- case 1:
- if (pszCoordSys) *pszCoordSys= "1954北京坐标系";
- break;
- case 2:
- if (pszCoordSys) *pszCoordSys= "西安80坐标系";
- break;
- case 3:
- if (pszCoordSys) *pszCoordSys= "WGS84坐标系";
- break;
- default:
- if (pszCoordSys) *pszCoordSys= "1954北京坐标系";
- m_nCoordSys = 1;
- break;
- }
- return m_nCoordSys;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetCurLayer
- ///返回类型:CQLayerObj *
- ///入口参数:
- ///出口参数:
- ///思路说明:返回当前图层
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQLayerObj * CQMapObj::GetCurLayer()
- {
- if(m_pCurLayer)return m_pCurLayer;
- return NULL;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetLayer
- ///返回类型:CQLayerObj *
- ///入口参数:int nIndex
- ///出口参数:
- ///思路说明:根据索引获取图层
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQLayerObj * CQMapObj::GetLayer(int nIndex)
- {
- int nCount = GetLayerCount();
- if(nCount == 0)return NULL;
- if(nIndex<0 ||nIndex>=nCount)return NULL;
- return m_LayerList[nIndex];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetLayerIndex
- ///返回类型:int
- ///入口参数:CQLayerObj * pLayer
- ///出口参数:
- ///思路说明:返回指定图层的索引
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline int CQMapObj::GetLayerIndex(CQLayerObj * pLayer)
- {
- if(!pLayer) return -1;
- int nCount = GetLayerCount();
- if(nCount == 0)return -1;
- for(int i=0;i<nCount;i++)
- {
- if(pLayer->GetLayerID() == m_LayerList[i]->GetLayerID())
- return i;
- }
- return -1;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetLayers
- ///返回类型:CQLayers *
- ///入口参数:
- ///出口参数:
- ///思路说明:返回图层集合对象
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQLayers * CQMapObj::GetLayers()
- {
- return &m_LayerList;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMapCorner
- ///返回类型:CQPoint mapcorner[4]
- ///入口参数:
- ///出口参数:
- ///思路说明:返回地图角点坐标
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::GetMapCorner(CQPoint mapcorner[4])
- {
- for(int i=0;i<4;i++)
- mapcorner[i]=m_aMapCorner[i];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMapDiscription
- ///返回类型:CString
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CString CQMapObj::GetMapDiscription() const
- {
- return m_szMapDiscription;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMapID
- ///返回类型:long
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline long CQMapObj::GetMapID()
- {
- return m_lMapID;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMapName
- ///返回类型:CString
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CString CQMapObj::GetMapName()
- {
- return m_szMapName;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMapPath
- ///返回类型:CString
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CString CQMapObj::GetMapPath()
- {
- return m_szPathName;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMaxLayerID
- ///返回类型:long
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- long CQMapObj::GetMaxLayerID()
- {
- int nCount = GetLayerCount();
- long nMaxLayerID = 0;
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p =m_LayerList[i];
- if(p)
- {
- if(p->GetLayerID()>nMaxLayerID)
- nMaxLayerID = p->GetLayerID();
- }
- }
- return nMaxLayerID;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetMaxObjID
- ///返回类型:long
- ///入口参数:
- ///出口参数:
- ///思路说明:返回地图中最大的图元ID
- ///***************CQGIS****************///
- //////////////////////////////////////////
- long CQMapObj::GetMaxObjID()
- {
- int nCount = GetLayerCount();
- int nMaxObjID = 0;
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p =m_LayerList[i];
- if(p)
- {
- int nObjs = p->GetObjCount();
- for(int j=0;j<nObjs;j++)
- {
- CQBaseObj * pp = p->GetObj(j);
- if(pp)
- {
- if(pp->GetObjID()>nMaxObjID)
- nMaxObjID = pp->GetObjID();
- }
- }
- }
- }
- return nMaxObjID;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetScale
- ///返回类型:long
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline long CQMapObj::GetScale() const
- {
- return m_lScale;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetSelObjManager
- ///返回类型:CQSelObjManager *
- ///入口参数:
- ///出口参数:
- ///思路说明:返回选择对象管理器
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQSelObjManager * CQMapObj::GetSelObjManager()
- {
- return m_pSelObjs;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetTopLeftCorner
- ///返回类型:CQPoint
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQPoint CQMapObj::GetTopLeftCorner()
- {
- return m_aMapCorner[3];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetTopRightCorner
- ///返回类型:CQPoint
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline CQPoint CQMapObj::GetTopRightCorner()
- {
- return m_aMapCorner[2];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetCurLayerIndex
- ///返回类型:int
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline int CQMapObj::GetCurLayerIndex()
- {
- if(m_pCurLayer)
- {
- int nLayerIndex = GetLayerIndex(m_pCurLayer);
- return nLayerIndex;
- }
- return -1;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:IndexLayer
- ///返回类型:int
- ///入口参数:long lLayerID
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- int CQMapObj::IndexLayer(long lLayerID)
- {
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p =m_LayerList[i];
- if(p)
- {
- if(p->GetLayerID() == lLayerID)
- return i;
- }
- }
- return -1;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:IsEmpty
- ///返回类型:BOOL
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQMapObj::IsEmpty()
- {
- int nCount = m_LayerList.GetSize();
- if(nCount == 0)
- return TRUE;
- return FALSE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:MapToStr
- ///返回类型:void
- ///入口参数:CString * pStr
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::MapToStr(CString * pStr)
- {
- CString szMap;
- CString szCoord;
- GetCoordSys(&szCoord);
- 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]);
- CString szLayer;
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p =m_LayerList[i];
- if(p)
- {
- CString sz = p->VarToStr();
- szLayer += sz;
- }
- }
- szMap+=szLayer;
- if(pStr)
- *pStr = *pStr + szMap;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Move
- ///返回类型:
- ///入口参数:double dx,double dy
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::Move(double dx,double dy)
- {
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p)
- {
- p->Move(dx,dy);
- }
- }
- CalculateBoundary(NULL);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:MoveLayerNext
- ///返回类型:void
- ///入口参数:CQLayerObj * pLayer,int nCount
- ///出口参数:
- ///思路说明:向后移
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::MoveLayerNext(CQLayerObj * pLayer,int nCount)
- {
- if(!pLayer)return;
- int nIndex = GetLayerIndex(pLayer);
- if(nIndex<0)return;
- m_LayerList.RemoveAt(nIndex);
- int nPos = nIndex+nCount-1;
- if(nPos>GetLayerCount())
- nPos = GetLayerCount();
- m_LayerList.InsertAt(nPos,pLayer);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:MoveLayerPrev
- ///返回类型:void
- ///入口参数:CQLayerObj * pLayer,int nCount
- ///出口参数:
- ///思路说明:向前移
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::MoveLayerPrev(CQLayerObj * pLayer,int nCount)
- {
- if(!pLayer)return;
- int nIndex = GetLayerIndex(pLayer);
- if(nIndex<0)return;
- int nLayerCount = GetLayerCount();
- if(nCount>=nLayerCount)return;
- int nPos = nIndex - nCount;
- if(nPos<0)nPos = 0;
- m_LayerList.RemoveAt(nIndex);
- m_LayerList.InsertAt(nPos,pLayer);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:MoveLayerToTop
- ///返回类型:void
- ///入口参数:CQLayerObj * pLayer
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::MoveLayerToTop(CQLayerObj * pLayer)
- {
- if(!pLayer)return;
- int nIndex = GetLayerIndex(pLayer);
- if(nIndex<=0)return;
- m_LayerList.RemoveAt(nIndex);
- m_LayerList.InsertAt(0,pLayer);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:MoveLayerToBottom
- ///返回类型:void
- ///入口参数:CQLayerObj * pLayer
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::MoveLayerToBottom(CQLayerObj * pLayer)
- {
- if(!pLayer)return;
- int nIndex = GetLayerIndex(pLayer);
- if(nIndex<0 || nIndex ==GetLayerCount()-1)return;
- m_LayerList.RemoveAt(nIndex);
- m_LayerList.InsertAt(GetLayerCount(),pLayer);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Save
- ///返回类型:void
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::Save(const char * sz)
- {
- CFile file;
- try
- {
- file.Open(sz,CFile::modeReadWrite | CFile::modeCreate);
- }
- catch (CFileException* e)
- {
- AfxMessageBox("无法打开文件,请检查指定的文件是否存在");
- e->ReportError();
- e->Delete();
- return;
- }
- //CArchive经常和FILE联用
- CArchive ar(&file,CArchive::store);
- Serialize(ar);
- ar.Close();
- file.Close();
- return;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQMapObj::Open(const char * sz)
- {
- CFile file;
- try
- {
- file.Open(sz,CFile::modeRead);
- }
- catch (CFileException* e)
- {
- AfxMessageBox("无法打开文件,请检查指定的文件是否存在");
- e->ReportError();
- e->Delete();
- return FALSE;
- }
- CArchive ar(&file,CArchive::load);
- Serialize(ar);
- ar.Close();
- file.Close();
- return TRUE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Select
- ///返回类型:CQBaseObj *
- ///入口参数:CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys,CQPoint &pt, double & fEffectedDistance
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQBaseObj * CQMapObj::Select(CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys,CQPoint &pt, double & fEffectedDistance)
- {
- CBoundaryRect BRect;
- CalculateBoundary(&BRect);
- if(!BRect.PtInRect(pt))return NULL;
- int nCount = GetLayerCount();
- if(nCount == 0)return NULL;
- CQBaseObj * pObj = NULL;
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p =m_LayerList[i];
- if(!p || p->GetDeleteFlag() || !p->GetShowFlag())
- continue;
- pObj = p->Select(pSelObjs,pCoorSys,pt,fEffectedDistance);
- if(pObj) return pObj;
- }
- return NULL;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Select
- ///返回类型:int
- ///入口参数:CQSelObjManager * pSelObjs,CQCoordSys * pCoorSys,CBoundaryRect &rectSel
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- int CQMapObj::Select(CQSelObjManager * pSelObjs,CQCoordSys * pCoorSys,CBoundaryRect &rectSel)
- {
- CBoundaryRect BRect;
- CalculateBoundary(&BRect);
- if(!BRect.IsCross(&rectSel))return 0;
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(!p || p->GetDeleteFlag() || !p->GetShowFlag())continue;
- p->Select(pSelObjs,pCoorSys,rectSel);
- }
- return pSelObjs->GetSelObjCount();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SingleSelect
- ///返回类型:CQBaseObj *
- ///入口参数:CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys, CQPoint &pt, double & fEffectedDistance, int nSelectObjType /* = 0 */
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQBaseObj * CQMapObj::SingleSelect(CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys, CQPoint &pt, double & fEffectedDistance, int nSelectObjType /* = 0 */)
- {
- CBoundaryRect BRect;
- CalculateBoundary(&BRect);
- if(!BRect.PtInRect(pt))return NULL;
- int nCount = GetLayerCount();
- if(nCount == 0)return NULL;
- CQBaseObj * pObj = NULL;
- CQLayerObj * p = NULL;
- for(int i=0;i<nCount;i++)
- {
- p = m_LayerList[i];
- if(!p || p->GetDeleteFlag() || !p->GetShowFlag())
- continue;
- pObj = p->SingleSelect(pSelObjs,pCoorSys,pt,fEffectedDistance,nSelectObjType);
- if(pObj)
- return pObj;
- }
- return NULL;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:void
- ///入口参数:SetBottomLeftCorner
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetBottomLeftCorner(CQPoint pt)
- {
- m_aMapCorner[0] = pt;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetBottomRightCorner
- ///返回类型:void
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetBottomRightCorner(CQPoint pt)
- {
- m_aMapCorner[1] = pt;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetCoordSys
- ///返回类型:void
- ///入口参数:int nCoordSys
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetCoordSys(int nCoordSys)
- {
- m_nCoordSys = nCoordSys;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:inline void CQMapObj::SetCurLayer(CQLayerObj * pLayer)
- ///返回类型:void
- ///入口参数:CQLayerObj * pLayer
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetCurLayer(CQLayerObj * pLayer)
- {
- if(!pLayer)return;
- m_pCurLayer = pLayer;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetCurLayer
- ///返回类型:void
- ///入口参数:int nIndex
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetCurLayer(int nIndex)
- {
- int nCount = GetLayerCount();
- if(nIndex<0 || nIndex>=nCount)return;
- m_pCurLayer = m_LayerList[nIndex];
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetLayerIndex
- ///返回类型:void
- ///入口参数:CQLayerObj * pLayer, int nIndex
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetLayerIndex(CQLayerObj * pLayer, int nIndex)
- {
- if(!pLayer)return;
- if(nIndex<0 || nIndex>=GetLayerCount()) return;
- int nIndexFrom = GetLayerIndex(pLayer);
- if(nIndexFrom<0)return;
- ExchangeLayerPos(nIndexFrom,nIndex);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetMapCorner
- ///返回类型:void
- ///入口参数:CQPoint mapcorner[4]
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetMapCorner(CQPoint mapcorner[4])
- {
- for(int i=0;i<4;i++)
- {
- m_aMapCorner[i]=mapcorner[i];
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetMapDiscription
- ///返回类型:void
- ///入口参数:CString sz
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetMapDiscription(CString sz)
- {
- m_szMapDiscription = sz;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetMapID
- ///返回类型:void
- ///入口参数:long lID
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetMapID(long lID)
- {
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p && !p->GetDeleteFlag())
- {
- if(p->GetLayerID() == lID)
- {
- AfxMessageBox("指定的ID已存在,请重新设置!");
- return;
- }
- }
- }
- m_lMapID = lID;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetMapName
- ///返回类型:void
- ///入口参数:CString sz
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetMapName(CString sz)
- {
- m_szMapName = sz;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetScale
- ///返回类型:void
- ///入口参数:long lScale
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::SetScale(long lScale /* = 10000 */)
- {
- m_lScale = lScale;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetTopLeftCorner
- ///返回类型:void
- ///入口参数:(CQPoint pt
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetTopLeftCorner(CQPoint pt)
- {
- m_aMapCorner[3] = pt;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetTopRightCorner
- ///返回类型:void
- ///入口参数:(CQPoint pt
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline void CQMapObj::SetTopRightCorner(CQPoint pt)
- {
- m_aMapCorner[2] = pt;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:WriteToFile
- ///返回类型:void
- ///入口参数:CFile * pf
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::WriteToFile(CFile * pf)
- {
- pf->Write(&m_lMapID,sizeof(long));
- pf->Write(&m_lScale,sizeof(long));
- int ll = m_szMapName.GetLength();
- pf->Write(&ll,sizeof(int));
- pf->Write((const char *)m_szMapName,ll);
- ll = m_szMapDiscription.GetLength();
- pf->Write(&ll,sizeof(int));
- pf->Write((const char *)m_szMapDiscription,ll);
- ll = m_szPathName.GetLength();
- pf->Write(&ll,sizeof(int));
- pf->Write((const char *)m_szPathName,ll);
- int ncount = m_LayerList.GetSize();
- pf->Write(&ncount,sizeof(int)); //存了当前图层数
- int i=0;
- for(i=0;i<ncount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p && !p->GetDeleteFlag())
- {
- p->WriteToFile(pf);
- }
- }
- pf->Write(&m_nElevationSys,sizeof(int));
- pf->Write(&m_nCoordSys,sizeof(int));
- pf->Write(m_faLongitude,sizeof(float)*6);
- pf->Write(m_faLatitude,sizeof(float)*6);
- pf->Write(&m_dwModifiedFlag,sizeof(DWORD));
- for(i=0;i<4;i++)
- {
- m_aMapCorner[i].WriteToFile(pf);
- }
- m_BoundingRect.WriteToFile(pf);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::ReadFromFile(CFile * pf)
- {
- InitBoundary();
- pf->Read(&m_lMapID,sizeof(long));
- pf->Read(&m_lScale,sizeof(long));
- int ll = 0;
- pf->Read(&ll,sizeof(int));
- char sz[255];
- pf->Read(sz,ll);
- sz[ll]=' ';
- m_szMapName = CString(sz);
- pf->Read(&ll,sizeof(int));
- pf->Read(sz,ll);
- sz[ll]=' ';
- m_szMapDiscription = CString(sz);
- pf->Read(&ll,sizeof(int));
- pf->Read(sz,ll);
- sz[ll]=' ';
- m_szPathName = CString(sz);
- int nLayercount = 0;
- pf->Read(&nLayercount,sizeof(int));
- int i=0;
- for(i=0;i<nLayercount;i++)
- {
- CQLayerObj * p = new CQLayerObj;
- p->ReadFromFile(pf);
- m_LayerList.Add(p);
- m_BoundingRect.Union(p->GetBoundary());
- }
- pf->Read(&m_nElevationSys,sizeof(int));
- pf->Read(&m_nCoordSys,sizeof(int));
- pf->Read(m_faLongitude,sizeof(float)*6);
- pf->Read(m_faLatitude,sizeof(float)*6);
- for(i=0;i<4;i++)
- {
- m_aMapCorner[i].ReadFromFile(pf);
- }
- m_BoundingRect.ReadFromFile(pf);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:XFlex
- ///返回类型:void
- ///入口参数:double dcp_x,double dFlex
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::XFlex(double dcp_x,double dFlex)
- {
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p && !p->GetDeleteFlag() && p->GetEditFlag() && p->GetShowFlag())
- {
- p->XFlex(dcp_x,dFlex);
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:YFlex
- ///返回类型:void
- ///入口参数:double dcp_y,double dFlex
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::YFlex(double dcp_y,double dFlex)
- {
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(p && !p->GetDeleteFlag() && p->GetEditFlag() && p->GetShowFlag())
- {
- p->XFlex(dcp_y,dFlex);
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Rotate
- ///返回类型:void
- ///入口参数:CQPoint & pt,double fAngle
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQMapObj::Rotate(CQPoint & pt,double fAngle)
- {
- int nCount = GetLayerCount();
- for(int i=0;i<nCount;i++)
- {
- CQLayerObj * p = m_LayerList[i];
- if(!p || p->GetDeleteFlag() || !p->GetShowFlag() || !p->GetEditFlag())
- continue;
- p->Rotate(pt,fAngle);
- }
- }
- CBoundaryRect * CQMapObj::GetMapBoundary()
- {
- return &m_BoundingRect;
- }
- void CQMapObj::SetModifiedFlag(DWORD f)
- {
- m_dwModifiedFlag = f;
- }
- CQCoordSys * CQMapObj::GetCoordSysPointer()
- {
- return &m_CoordSys;
- }
- CQLayerObj * CQMapObj::FindLayer(CString szLayerName)
- {
- if(szLayerName.IsEmpty())
- return NULL;
- int nLayerNum = m_LayerList.GetSize();
- if(nLayerNum == 0)return NULL;
- for(int i=0;i<nLayerNum;i++)
- {
- CQLayerObj * pLayer = m_LayerList[i];
- if(!pLayer || pLayer->GetDeleteFlag() || !pLayer->GetShowFlag())
- continue;
- if(pLayer->GetLayerName() == szLayerName)
- return pLayer;
- }
- return NULL;
- }
- CQLayerObj * CQMapObj::FindLayer(long lLayerID)
- {
- int nLayerNum = m_LayerList.GetSize();
- if(nLayerNum == 0)return NULL;
- for(int i=0;i<nLayerNum;i++)
- {
- CQLayerObj * pLayer = m_LayerList[i];
- if(!pLayer || pLayer->GetDeleteFlag() || !pLayer->GetShowFlag())
- continue;
- if(pLayer->GetLayerID() == lLayerID)
- return pLayer;
- }
- return NULL;
- }
- void CQMapObj::RemoveLayer(CQLayerObj * pLayer)
- {
- int nLyrCount = m_LayerList.GetSize();
- if(nLyrCount == 0)return;
- if(!pLayer) return;
- long lLayerID = pLayer->GetLayerID();
- for(int i=0;i<nLyrCount;i++)
- {
- CQLayerObj * ptemp = m_LayerList.GetAt(i);
- if(!ptemp) continue;
- if(ptemp->GetLayerID() == lLayerID)
- {
- m_LayerList.RemoveAt(i);
- break;
- }
- }
- }
- void CQMapObj::RemoveLayerByIndex(int nIndex)
- {
- int nLyrCount = m_LayerList.GetSize();
- if(nLyrCount == 1)return;
- if(nIndex>= nLyrCount || nIndex<0)return;
- m_LayerList.RemoveAt(nIndex);
- }
- void CQMapObj::RemoveObject(CQBaseObj * pObj)
- {
- if(!pObj)return;
- long lLyrID = pObj->GetObjLayerID();
- CQLayerObj * pLayer = NULL;
- pLayer = FindLayer(lLyrID);
- if(!pLayer)return;
- pLayer->RemoveObject(pObj);
- }