[31]
层放在可变槽中处理
层管理点线面注记
ID 属性码 坐标(空间)组成层
// Map.cpp: implementation of the CMap cla.
//
//////////////////////////////////////////////////////////////////////
#include \"stdafx.h\"
#include \"mapread.h\"
#include \"Map.h\"
#include \"fstream.h\"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
////////////////////////////////////////////////////////////////////// // Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGeoMap::CGeoMap()
{
m_nRatio = 10;
m_bisLoaded = FALSE;
}
CGeoMap::~CGeoMap()
{
for(int i=0;i
{
CLayer* pLayer=m_LayerArray.ElementAt(i);
if(pLayer!=NULL)
delete pLayer;
}
}
//读取数据
BOOL CGeoMap::ReadData(CString szFileName)
{
ifstream is(szFileName);//文件流
if(!is.is_open())
{} AfxMeageBox(\"error\");//没有打开就返回 return FALSE;
AfxMeageBox(\"开始读取数据!\");
char value[256];
//范围
is.getline(value,sizeof(value)-1,\'\\n\');//获取一行
double xl,yb,xr,yt;//最左最右最下最上
canf(value,\"%lf,%lf,%lf,%lf\\n\",&xl, &yb, &xr, &yt);//字符按自身设计来写double等,前四个是双精度,写到地址里面去,后面是取地址操作符
m_rcBound.left = (int)(xl*m_nRatio);//写出范围,坐标都乘以10
m_rcBound.bottom = (int)(yb*m_nRatio);
m_rcBound.right = (int)(xr*m_nRatio);
m_rcBound.top = (int)(yt*m_nRatio);
CString str;//定义
str.Format(\"左下: %d,%d,右上: %d,%d\\n\", m_rcBound.left, m_rcBound.bottom, m_rcBound.right, m_rcBound.top);//弹出对话框
AfxMeageBox(str);
//层
int layernum=0;
is.getline(value,sizeof(value)-1,\'\\n\');
canf(value,\"%d\\n\",&layernum);//转换目标类型 if(layernumcType = curlayer; int num=0;//层目标数 char szObject[10]; is.getline(value,sizeof(value)-1,\'\\n\');//Point 108,放到value解意 canf(value,\"%s %d\\n\",szObject/*几何类型*/, &num);//用此函数解意 // if(strcmp(szObject, \"Point\")==0) {for(int i=0;i
CGeoPoint* pPoint=new CGeoPoint;//定义点对象,填属性//属性码is.getline(value,sizeof(value)-1,\'\\n\');//转换canf(value,\"%s\\n\", pPoint->codestring);//坐标is.getline(value,sizeof(value)-1,\'\\n\');double x,y;canf(value,\"%lf,%lf\\n\", &x, &y);//长整形pPoint->m_pt.x = (int)(x*m_nRatio);pPoint->m_pt.y = (int)(y*m_nRatio);
pLayer->m_PointArray.Add(pPoint);//加点}
}
if(strcmp(szObject, \"Polyline\")==0)
{
for(int i=0;i
{
//line
//....
//....
}
}
if(strcmp(szObject, \"Polygon\")==0)
{
for(int i=0;i
{
CGeoArea* pArea=new CGeoArea;//....
//....
}
}
m_LayerArray.Add(pLayer);//读完层在增加} //以上程序读数据流程(难度较大)
//目标
AfxMeageBox(\"ok\");
is.close();
m_bisLoaded = TRUE;
return TRUE;
}
//绘制地图
void CGeoMap::Draw(CDC *pDC)
{
if(m_bisLoaded)
{
pDC->Rectangle(&m_rcBound);
for(int i=0;i
CLayer* pLayer=m_LayerArray.GetAt(i);if(pLayer==NULL) continue;//pLayer->Draw(pDC);
//pDC->Polyline(pts, num);//pDC->Polylgon(pts, num);}
}
}
BOOL CGeoMap::GetMapSize(SIZE &sz)
{
if(!m_bisLoaded)
return FALSE;
sz.cx = m_rcBound.right-m_rcBound.left;sz.cy = m_rcBound.top-m_rcBound.bottom;return TRUE;
}
BOOL CGeoMap::GetWindowOrg(int &x, int &y) {
if(!m_bisLoaded)
return FALSE;
x = (m_rcBound.right+m_rcBound.left)/2;y = (m_rcBound.top+m_rcBound.bottom)/2;return TRUE;
}