注:本工程是在地图基本操作工程MapOperation基础上进行的路径分析,它的一些实现步骤和MapOperation相同,这里只介绍重要的实现步骤和方法,详细的路径分析参见PathAnalyst工程和MapOperation工程(有详细的注释)。 |
1、新建一个单文档界面的工程,命名为PathAnalyst; |
2、改造原有的菜单,按 “三、说明及约定”中第一条所说的设置; |
3、改造原有的工具条,按 “三、说明及约定”中第一条所说的设置; |
4、添加两个对话框类:CDlgSelect、CDlgPathAnalyseSetting,其中:
CDlgSelect是在选择要打开的地图或选择要添加的网络数据集时使用,添加的成员变量和函数如下:
定义变量:
CComboBox m_cmbDataSource; //数据源列表
CListCtrl m_lstDataset; //数据集列表
CImageList m_ImageList; //数据集类型图像列表
bool m_bMap; //列表框中是否显示地图名【输入】
CString m_strMapName; //地图名【输出】
CString m_strDatasourceAlias; //数据源别名【输出】
CString m_strDatasetName; //数据集名【输出】
成员函数:
CSeDatasetVector * GetDataset(); //获取网络数据集
void AddMap(); //将地图名加入列表框中
void BuildColumns(int nCols, int *nWidth, CString *csCol); //创建列表框的列
void BuildRows( int nRows, CString *pcValue, int nImage ); //创建列表框的行
void AddDataset(); //将数据集信息加入列表框中
virtual BOOL OnInitDialog(); //初始化对话框
virtual void OnOK(); //响应确定按钮操作
afx_msg void OnCancel(); //响应取消按钮操作
afx_msg void OnSelchangeComboDatasource(); //更新数据集列表
使用说明:
当点击“文件—打开地图”时,如果文件存在地图,则打开该对话框,该对话框中显示的是地图名称列表,选择相应的地图名,就可以打开了,如果没有地图,则新建一个地图,再点击“文件—添加图层”,弹出该对话框,这时对话框显示的是当前工作空间的所有数据源及其相应的网络数据集列表,选择要添加的网络数据集即可。
*****************************************************************************
CDlgPathAnalyseSetting是分析模式和分析模型设置对话框,添加的成员变量和函数如下:
成员变量:
int m_nAnalyseModel; /*分析模式,包括0-多内存占有—速度很快
1-少内存占有—速度少慢*/
int m_nAnalyseMode; /*分析模型:0-无规则最短路径分析
1-有规则最短路径分析
2-无规则最短时间分析
3-有规则最短时间分析*/
成员函数:
virtual void OnOK();
virtual void OnCancel();
使用说明:
点击“分析—分析设置”菜单时,显示该对话框,对话框中将提供分析模式和分析模型的选择,如上条中的变量所述。
|
5、扩展CSePathAnalyst类,构建一个它的继承类CSePathAnalystEx
class CSePathAnalystEx : public CSePathAnalyst
{
enum RuleType //分析模型
{
ShortestWithoutLimit = 0, //0-无规则最短路径分析
ShortestWithLimit = 1, //1-有规则最短路径分析
LeastTimeWithoutLimit = 2, //2-无规则最短时间分析
LeastTimeWithLimit = 3, //3-有规则最短时间分析
};
public:
CSePathAnalystEx();
virtual ~CSePathAnalystEx();
bool SetPathRuleParams( long nRuleType ); //设置路径分析模型
protected://method
//根据实际规则返回节点间的距离
virtual bool GetDistance( CSeRecordset *pRecordsetArc, long &nArcID, long &nFNodeID,
long &nTNodeID, double &dDistanceStartToEnd, double &dDistanceEndToStart );
//根据实际规则返回道路的限制速度!
long GetSpeedLimit( BYTE btRoadType );
//根据实际规则判断节点是否可以通达
virtual bool CanForward( long nFromNodeID, long nCurrentNodeID, long nToNodeID );
protected://attribute
long m_nRuleType; //路径分析模型
};
在SePathAnalystEx.cpp中实现具体的方法,请看PathAnalyst工程。 |
6、在PathAnalystView.h中定义成员变量,并在构造函数中初始化:
CSeMapWnd m_MapWnd; //地图显示
bool m_bFileOpened; //记录地图是否打开
//路径分析时:
CSePathAnalystEx m_PathAnalyst; //路径分析类
long m_nAction; //用户动作,如路径分析
int m_nAnalystMode; //路径分析模式
int m_nAnalystModel; //路径分析模型
CString m_strUnits; //分析结果的单位
BOOL m_bRuleParamSetted; //是否已经设置了路径分析参数
DWORD m_nFromNodeID; //路径分析起始结点ID
CPoint m_pntFromNode; //路径分析起始结点坐标
CPoint m_pntToNode; //路径分析终止结点坐标
并在CPathAnalystView::CPathAnalystView()中初始化 |
7、在PathAnalystView.cpp中实现具体函数(按照菜单和工具条):
文件—打开地图
void CPathAnalystView::OnFileOpen()
文件—添加图层 void CPathAnalystView::OnFileAddLayer()
分析—分析设置 (工具条—分析设置)
void CPathAnalystView::OnAnalyseSetting()
分析—路径分析
void CPathAnalystView::OnPathAnalyse() //路径分析,具体分析在OnLButtonDown()中
void CPathAnalystView::OnUpdatePathAnalyse(CCmdUI* pCmdUI)
分析—导出邻接矩阵
void CPathAnalystView::OnExportAdjacentMatrix() |
8、自定义函数,用于显示选择的点
void CPathAnalystView::DisplayNodePoint(CPoint point) |
9、鼠标重载函数
void CPathAnalystView::OnLButtonDown(UINT nFlags, CPoint point) //实现具体的路径分析 |