📄 pathanalystview.cpp
字号:
void CPathAnalystView::OnLButtonDown(UINT nFlags, CPoint point)
{//响应鼠标左键按下操作
m_MapWnd.OnLButtonDown(nFlags, point);//重载
if ( m_nAction == PATH_ANALYSE )
{//路径搜索
if( m_bRuleParamSetted )
{//设置路径分析模式和模型后
CSeDatasetVector *pSeDatasetNetwork = m_PathAnalyst.GetDatasetNetwork();
if( pSeDatasetNetwork )
{
//获取网络数据集的节点子数据集
CSeDatasetVector *pSeDatasetNode = pSeDatasetNetwork->GetChildDataset();
if( pSeDatasetNode )
{
CPoint pntNode;
CPoint pntMouse = CPoint(point);
//将像素坐标转换为地图坐标
m_MapWnd.GetDrawParam()->ClientToMap(&pntMouse);
//获取鼠标点击点最近的节点
long nNodeID = pSeDatasetNetwork->FindNearestNode( pntMouse, pntNode );
if( nNodeID >= 0 )//如果找到相应节点
{
if (m_nFromNodeID == -1)//路径分析的起始点
{
m_nFromNodeID = nNodeID; //起始点ID
m_pntToNode = m_pntFromNode = pntNode;//起始点坐标
m_pntFromNode = pntNode;
//刷新跟踪层,等待将分析的路径放入
if( m_MapWnd.m_TrackingLayer.GetCount() > 0 )
{
m_MapWnd.m_TrackingLayer.ReleaseAll();
m_MapWnd.RefreshTrackingLayer(false);
}
//显示起始点
DisplayNodePoint(m_pntFromNode);
}
else//路径分析的终止点
{
m_pntToNode = pntNode;//终止点坐标
DisplayNodePoint(m_pntToNode);//显示终止点
CDWordArray arrIDs;
CDWordArray pntIDs;
double dPathLength = 0.0;
DWORD dwTickStart = GetTickCount();
//开始分析
//m_PathAnalyst.Analyse( m_nFromNodeID, m_pntFromNode, nNodeID, m_pntToNode, arrIDs,dPathLength,pntIDs );
m_PathAnalyst.Analyse( m_nFromNodeID, nNodeID, arrIDs,dPathLength,pntIDs );
//获取系统路径分析的时间
DWORD dwTickCount = GetTickCount() - dwTickStart;
CString strTickCount;
strTickCount.Format( _T("--%dms"), dwTickCount);
CSeGeometry *pSeGeometry = NULL;
CSeDatasetVector *pSeDtV = NULL;
long nCount = arrIDs.GetSize();//获取分析后路径弧段的个数
if( nCount == 0 )
{//如果没有弧度,即没有找到路径
CString strTemp = _T("");
if(m_nAnalystModel < 2 )
{
strTemp = _T("No shortest Path");
}
else
{
strTemp = _T("No best Path");
}
//在状态栏内显示提示信息
CMainFrame *pMainFrame = (CMainFrame *)GetParentFrame();
if( pMainFrame )
{
pMainFrame->m_wndStatusBar.SetWindowText( strTemp+strTickCount );
}
}
else
{//如果找到路径
//获取弧度的记录集
CSeRecordset* pSeRecordset = pSeDatasetNetwork->QueryByIDs( (long *)arrIDs.GetData(), nCount );
//将相应的弧段几何对象加入到跟踪层上
if( pSeRecordset )
{
if( pSeRecordset->MoveFirst() )
{
while( !pSeRecordset->IsEOF() )
{
pSeRecordset->GetGeometry(pSeGeometry);
if (pSeGeometry)
{
m_MapWnd.m_TrackingLayer.AddEvent(pSeGeometry,_T(""));
}
pSeRecordset->MoveNext();
}
}
pSeDatasetNetwork->ReleaseRecordset(pSeRecordset);
}
//清空弧段ID
arrIDs.RemoveAll();
pntIDs.RemoveAll();
CString strMsg = _T("");
if( m_nAnalystModel > 1 )
{
dPathLength /= 1000;//化为小时
}
strMsg.Format(_T("结果: %.8f%s"), dPathLength,m_strUnits);
//在状态栏内显示分析结果,路径长度(路径时间)+分析时间
CMainFrame *pMainFrame = (CMainFrame *)GetParentFrame();
if( pMainFrame )
{
pMainFrame->m_wndStatusBar.SetWindowText( strMsg+strTickCount );
}
//设置跟踪图层的风格
CSeStyleLine *pStyle = new CSeStyleLine;
pStyle->m_dwPenStyle = 0;
pStyle->m_nPenWidth = 8;
pStyle->m_nPenColor = RGB(255,0,0);
m_MapWnd.m_TrackingLayer.SetStyle( pStyle );
//刷新跟踪图层
if( m_MapWnd.m_TrackingLayer.GetCount() > 0 )
{
m_MapWnd.RefreshTrackingLayer();
}
}
m_nFromNodeID = -1;//将起始点ID置-1,待第二次分析
}
}
}
}
}
}
CView::OnLButtonDown(nFlags, point);
}
void CPathAnalystView::OnLButtonUp(UINT nFlags, CPoint point)
{//响应鼠标左键弹起操作
m_MapWnd.OnLButtonUp(nFlags, point);//重载
CView::OnLButtonUp(nFlags, point);
}
void CPathAnalystView::OnAnalyseSetting()
{//分析模型设置
CDlgPathAnalyseSetting dlg;
if ( dlg.DoModal() == IDOK )
{
m_nAnalystMode = dlg.m_nAnalyseMode;
m_nAnalystModel = dlg.m_nAnalyseModel;
m_MapWnd.SetAction( CSeDrawParameters::uaNull);
}
else
{
m_nAnalystMode = 0;
m_nAnalystModel = 0;
}
}
void CPathAnalystView::OnPathAnalyse()
{//路径分析,具体分析在OnLButtonDown()中
if ( m_nAction != PATH_ANALYSE)
{//设置为路径分析
CSeDatasetVector* pDatasetNetwork = NULL;
CDlgSelect dlg;
if ( dlg.DoModal() == IDOK )
{
pDatasetNetwork = dlg.GetDataset();
if ( pDatasetNetwork )
{//设置要分析的网路数据集
if( m_PathAnalyst.SetDatasetNetwork( pDatasetNetwork ) )
{//设置分析模型
m_bRuleParamSetted = m_PathAnalyst.SetPathRuleParams( m_nAnalystModel );
m_nAction = PATH_ANALYSE;
m_MapWnd.SetAction( CSeDrawParameters::uaNull);
if( m_nAnalystMode == 1 )
{
//少内存占有方式,需要导入邻接矩阵文件,如果没有可以先导出一个
if( m_bRuleParamSetted )
{
CFileDialog dlg( TRUE, _T("snf"), _T("*.snf"), OFN_OVERWRITEPROMPT,
_T("eSuperMap NetWork File(*.snf)|*.snf||"), this );
if(dlg.DoModal() == IDOK)
{
m_PathAnalyst.ImportAdjacentMatrix( dlg.GetPathName() );
}
}
}
//设置不同分析模式下的分析结果单位
if( m_nAnalystModel > 1 )
{
m_strUnits = _T("h");
}
else
{
m_strUnits = _T("m");
}
//显示状态栏
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
pFrame->m_wndStatusBar.ShowWindow(SW_SHOW);
pFrame->RecalcLayout();
}
else
{
m_bRuleParamSetted = false;
}
}
}
//清空跟踪层
if( m_MapWnd.m_TrackingLayer.GetCount() > 0 )
{
m_MapWnd.m_TrackingLayer.ReleaseAll();
m_MapWnd.RefreshTrackingLayer(false);
}
}
else
{//取消路径分析
//隐藏状态栏
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
pFrame->m_wndStatusBar.ShowWindow( SW_HIDE );
pFrame->m_wndStatusBar.SetPaneText( 0, _T(""));
pFrame->RecalcLayout();
m_nAction = -1;
}
}
void CPathAnalystView::OnUpdatePathAnalyse(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_nAction == PATH_ANALYSE );
}
void CPathAnalystView::OnExportAdjacentMatrix()
{//导出网络数据集邻接矩阵
CSeDatasetVector *pDatasetNetwork = NULL;
CDlgSelect dlg;
if( dlg.DoModal() == IDOK )//选择数据集对话框
{
pDatasetNetwork = dlg.GetDataset();
if( pDatasetNetwork )
{//设置导出的网络数据集
if ( m_PathAnalyst.SetDatasetNetwork( pDatasetNetwork ))
{
CFileDialog dlg( FALSE, _T("snf"), _T("*.snf"), OFN_OVERWRITEPROMPT,
_T("eSuperMap NetWork File(*.snf)|*.snf||"), this );
if(dlg.DoModal() == IDOK)
{ //导出邻接矩阵
m_PathAnalyst.ExportAdjacentMatrix( dlg.GetPathName() );
}
}
}
}
}
void CPathAnalystView::DisplayNodePoint(CPoint point)
{//画出节点
CDC *pDC = GetDC();
CRect rcCircle;
CSeOperator::RotatePoint( point, m_MapWnd.GetDrawParam()->GetCenter(),
m_MapWnd.GetDrawParam()->GetMapRotationAngleCosValue(),
m_MapWnd.GetDrawParam()->GetMapRotationAngleSinValue()
);
m_MapWnd.GetDrawParam()->MapToClient(&point,1);
rcCircle.top = point.y - 2;
rcCircle.bottom = point.y + 2;
rcCircle.left = point.x - 2;
rcCircle.right = point.x + 2;//5
CBrush brush(RGB(255,0,0));
CBrush *pOld = pDC->SelectObject(&brush);
pDC->Ellipse(&rcCircle);
pDC->SelectObject(pOld);
ReleaseDC(pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -