📄 carnaviview.cpp
字号:
// CarNaviView.cpp : implementation of the CCarNaviView class
//
#include "stdafx.h"
#include "CarNavi.h"
#include "CarNaviDoc.h"
#include "CarNaviView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const long USER_ACTION_NONE = 0;
const long USER_ACTION_SELECT_PATH_FROM_POINT = 100;
const long USER_ACTION_SELECT_PATH_TO_POINT = 101;
const long TIMER_SIMULATION = 900;
const long TIMER_REAL = 901;
/////////////////////////////////////////////////////////////////////////////
// CCarNaviView
IMPLEMENT_DYNCREATE(CCarNaviView, CView)
BEGIN_MESSAGE_MAP(CCarNaviView, CView)
//{{AFX_MSG_MAP(CCarNaviView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_COMMAND(ID_MAP_PAN, OnMapPan)
ON_COMMAND(ID_MAP_REFRESH, OnMapRefresh)
ON_COMMAND(ID_MAP_VIEWENTIRE, OnMapViewentire)
ON_COMMAND(ID_MAP_ZOOMIN, OnMapZoomin)
ON_COMMAND(ID_MAP_ZOOMOUT, OnMapZoomout)
ON_COMMAND(ID_NAVI_REAL, OnNaviReal)
ON_COMMAND(ID_NAVI_SIMULATE, OnNaviSimulate)
ON_COMMAND(ID_PATH_FAST, OnPathFast)
ON_COMMAND(ID_PATH_FROM, OnPathFrom)
ON_COMMAND(ID_PATH_SHORTEST, OnPathShortest)
ON_COMMAND(ID_PATH_TO, OnPathTo)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
ON_COMMAND(ID_GPS_OPEN, OnGpsOpen)
ON_COMMAND(ID_GPS_CLOSE, OnGpsClose)
ON_COMMAND(ID_GPS_SHOW_DATA, OnGpsShowData)
ON_COMMAND(ID_GPS_SHOW_ON_MAP, OnGpsShowOnMap)
ON_COMMAND(ID_GPS_SHOW_SAT_STATUS, OnGpsShowSatStatus)
ON_UPDATE_COMMAND_UI(ID_GPS_SHOW_ON_MAP, OnUpdateGpsShowOnMap)
ON_UPDATE_COMMAND_UI(ID_NAVI_REAL, OnUpdateNaviReal)
ON_UPDATE_COMMAND_UI(ID_NAVI_SIMULATE, OnUpdateNaviSimulate)
ON_COMMAND(ID_PATH_REMOVE, OnPathRemove)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCarNaviView construction/destruction
CCarNaviView::CCarNaviView()
{
//初始化
m_bFileOpened = false;
m_bGPSOpened = false;
m_bShowGPSonMap = false;
//路径出发地、目的地是否显示
m_bShowPathFromnToPoint = false;
m_bNaviReal = false; //真实导航
m_bNaviSimulate = false; //模拟导航
}
CCarNaviView::~CCarNaviView()
{
}
BOOL CCarNaviView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCarNaviView drawing
void CCarNaviView::OnDraw(CDC* pDC)
{
CCarNaviDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//{{显示地图
CRect rcClient;
GetClientRect( &rcClient );
if( m_bFileOpened )
{
m_MapWnd.OnDraw( pDC, rcClient, rcClient );
}
else
{
pDC->FillSolidRect( &rcClient, RGB(255,255,255) );
}
//}}显示地图
//{{显示GPS点
if( m_bShowGPSonMap )
{
DrawGPSonMap( pDC );
}
//}}显示GPS点
//{{显示路径的出发地和目的地
if( m_bShowPathFromnToPoint )
{
DrawPathFromnToPoint( pDC );
}
//}}显示路径的出发地和目的地
}
/////////////////////////////////////////////////////////////////////////////
// CCarNaviView diagnostics
#ifdef _DEBUG
void CCarNaviView::AssertValid() const
{
CView::AssertValid();
}
void CCarNaviView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CCarNaviDoc* CCarNaviView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCarNaviDoc)));
return (CCarNaviDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCarNaviView message handlers
void CCarNaviView::OnFileOpen()
{
CFileDialog dlgFile( true, _T(""), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("WorkSpace Files (*.pmw)|*.pmw") );
//弹出对话框选择工作空间文件
if( dlgFile.DoModal() == IDOK )
{
//如果已经打开工作空间文件,则先关闭
if( theApp.m_WorkSpace.IsOpen() )
{
theApp.m_WorkSpace.Close();
m_MapWnd.Close();
m_bFileOpened = false;
}
//获得图形文件的完整路径及文件名
CString strFileName = dlgFile.GetPathName();
//打开工作空间
if( theApp.m_WorkSpace.Open( strFileName ) )
{
//与地图窗口关联
m_MapWnd.OnInitialUpdate( &theApp.m_WorkSpace, this );
//获取地图列表
CSeMaps *pMaps = theApp.m_WorkSpace.GetMaps();
if( pMaps )
{
if( pMaps->GetMapCount() > 0 )
{//如果有定义好的地图就打开第一个地图
CSeMapDef MapDef;
//打开地图方法一: 通过名字取地图
CString strMapName = pMaps->GetMapNameAt(0);
if( pMaps->GetMap( strMapName, MapDef ) )
{
if( m_MapWnd.OpenMap( MapDef ) )
{
m_MapWnd.Refresh();
}
}
}
else
{//没有地图,打开第一个数据源的第一个数据集作为当前地图
CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt( 0 );
if( pDataSource && pDataSource->GetDatasetCount() > 0 )
{
//取第一个数据集添加到地图窗口中
CSeDataset *pDataset = pDataSource->GetDatasetAt( 0 );
if( pDataset )
{
m_MapWnd.AddLayer( pDataset );
m_MapWnd.Refresh();
}
}
}
}
m_bFileOpened = true;
}
}
}
void CCarNaviView::OnFileClose()
{
theApp.m_WorkSpace.Close();
m_MapWnd.Close();
m_bFileOpened = false;
m_MapWnd.Refresh();
}
void CCarNaviView::OnMapPan()
{
//平移地图
m_MapWnd.SetAction( CSeDrawParameters::uaPan );
}
void CCarNaviView::OnMapRefresh()
{
//刷新
m_MapWnd.Refresh();
}
void CCarNaviView::OnMapViewentire()
{
//整幅显示
m_MapWnd.ViewEntire();
}
void CCarNaviView::OnMapZoomin()
{
//放大
m_MapWnd.SetAction( CSeDrawParameters::uaZoomIn );
}
void CCarNaviView::OnMapZoomout()
{
//缩小
m_MapWnd.SetAction( CSeDrawParameters::uaZoomOut );
}
void CCarNaviView::OnLButtonDown(UINT nFlags, CPoint point)
{
//响应鼠标操作
m_MapWnd.OnLButtonDown(nFlags, point);
CView::OnLButtonDown(nFlags, point);
}
void CCarNaviView::OnLButtonUp(UINT nFlags, CPoint point)
{
//响应鼠标操作
m_MapWnd.OnLButtonUp(nFlags, point);
//{{路径分析
if( m_MapWnd.GetAction() == USER_ACTION_SELECT_PATH_FROM_POINT )
{
//选择出发地
m_pntFrom = point;
m_MapWnd.GetDrawParam()->ClientToMap( &m_pntFrom, 1 );
//刷新显示出发地、目的地
m_bShowPathFromnToPoint = true;
m_MapWnd.Refresh();
}
else if( m_MapWnd.GetAction() == USER_ACTION_SELECT_PATH_TO_POINT )
{
//选择目的地
m_pntTo = point;
m_MapWnd.GetDrawParam()->ClientToMap( &m_pntTo, 1 );
//刷新显示出发地、目的地
m_bShowPathFromnToPoint = true;
m_MapWnd.Refresh();
}
//}}路径分析
CView::OnLButtonUp(nFlags, point);
}
//===================================================================================
//{{路径分析
void CCarNaviView::OnPathFrom()
{
//设置用户动作为 选择 出发地
m_MapWnd.SetAction( (CSeDrawParameters::Action) USER_ACTION_SELECT_PATH_FROM_POINT );
}
void CCarNaviView::OnPathTo()
{
//设置用户动作为 选择 目的地
m_MapWnd.SetAction( (CSeDrawParameters::Action) USER_ACTION_SELECT_PATH_TO_POINT );
}
void CCarNaviView::OnPathShortest()
{
//初始化路径分析对象 -- 最短路径分析
PathAnalyseInit( 0 );
//最短路径分析
PathAnalysing();
}
void CCarNaviView::OnPathFast()
{
//初始化路径分析对象 -- 最快路径分析
PathAnalyseInit( 1 );
//最快路径分析
PathAnalysing();
}
void CCarNaviView::PathAnalyseInit( long nMode )
{
//如果没有初始化m_PathAnalyst对象, 它的网络数据集指针肯定为空
if( m_PathAnalyst.GetDatasetNetwork() == NULL )
{
//获取数据源指针
CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt( 0 );
if( pDataSource )
{
//获取数据集数
long nCount = pDataSource->GetDatasetCount();
CSeDataset *pDataset = NULL;
for( long i=0;i <nCount; i++ )
{
//获取数据集指针
pDataset = pDataSource->GetDatasetAt( i );
if( pDataset )
{
//如果是网络数据集,则用它来初始化导航对象
if( pDataset->GetType() == CSeDatasetInfo::Network )
{
m_PathAnalyst.SetDatasetNetwork( (CSeDatasetVector *)pDataset );
m_PathAnalyst.Init();
}
}
}
}
}
//分析模式
m_PathAnalyst.SetAnalyseMode( nMode );
}
bool CCarNaviView::PathAnalysing()
{
CSeDatasetVector *pDatasetV = m_PathAnalyst.GetDatasetNetwork();
if( pDatasetV )
{
CPoint pntFrom; //出发地坐标点
CPoint pntTo; //目的地坐标点
//找出出发地节点ID
long nFromNodeID = pDatasetV->FindNearestNode( m_pntFrom, pntFrom );
//找出目的地节点ID
long nToNodeID = pDatasetV->FindNearestNode( m_pntTo, pntTo );
//把以前的结果先清空
m_arrArcIDs.RemoveAll();
m_arrNodeIDs.RemoveAll();
//清空跟踪层的对象
m_MapWnd.m_TrackingLayer.ReleaseAll();
//进行分析
long nLineCount = m_PathAnalyst.Analyse( nFromNodeID, nToNodeID, m_arrArcIDs, m_dPathTotalLength, m_arrNodeIDs );
if( nLineCount > 0 )
{
//根据分析返回的路段ID查出记录集
CSeRecordset *pRcordset = pDatasetV->QueryByIDs( (long *)m_arrArcIDs.GetData(), m_arrArcIDs.GetSize() );
if( pRcordset )
{
//遍历记录集
if( pRcordset->MoveFirst() )
{
CSeGeometry *pLine = NULL;
while( !pRcordset->IsEOF() )
{
if( pRcordset->GetGeometry( pLine ) )
{
if( pLine )
{
//把取出来的几何对象添加到跟踪层
m_MapWnd.m_TrackingLayer.AddEvent( pLine, _T("") );
}
}
pRcordset->MoveNext();
}
//{{设置跟踪层的风格
CSeStyleLine *pStyle = new CSeStyleLine;
pStyle->m_dwPenStyle = 0;
pStyle->m_nPenColor = RGB( 255, 0 , 255 );
pStyle->m_nPenWidth = 5;
m_MapWnd.m_TrackingLayer.SetStyle( pStyle );
m_MapWnd.m_TrackingLayer.SetFixedStyle( true );
m_MapWnd.Refresh();
//}}设置跟踪层的风格
}
//释放记录集指针
pDatasetV->ReleaseRecordset( pRcordset );
}
return true;
}
}
return false;
}
//删除分析出来的路径, 隐藏出发地和目的地的
void CCarNaviView::OnPathRemove()
{
//把以前的结果先清空
m_arrArcIDs.RemoveAll();
m_arrNodeIDs.RemoveAll();
//清空跟踪层的对象
m_MapWnd.m_TrackingLayer.ReleaseAll();
m_bShowPathFromnToPoint = false;
m_strNaviInfo = _T("");
m_MapWnd.Refresh();
}
void CCarNaviView::DrawPathFromnToPoint( CDC *pDC )
{
//简单绘制一个"紫方块"来表示出发地
CPoint pntDraw( m_pntFrom );
m_MapWnd.GetDrawParam()->MapToClient( &pntDraw, 1 );
pDC->FillSolidRect( pntDraw.x-5, pntDraw.y-5, 10, 10, RGB(255,0,255) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -