⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pathanalystview.cpp

📁 Embedded vc++下开发的路经分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -