第一步:在View类里声明一个路径分析类的对象:
public: CSePathAnalyst m_PathAnalyst;//定义一个路径分析类对象
第二步:调用SetDatasetNetwork方法,具体方法如下:
⑴得到网络分析数据集
CSeDatasetVector* pDatasetNetwork = NULL;
CSeDataSource* pDataSource = theApp.m_WorkSpace.GetDataSourceByAlias(_T("新世界阳光花园"));
if( pDataSource != NULL )
{
CSeDatasetVector* pDataset = (CSeDatasetVector
*)pDataSource->GetDataset(_T("道路网络"));
pDatasetNetwork= pDataset;
}
⑵设置网络分析数据集
bool m_setNetWork= m_PathAnalyst.SetDatasetNetwork( pDatasetNetwork );
⑶设置分析模型
m_bRuleParamSetted = true;//判断是否设置分析模型成功,成功的话在LbuttunDown里
m_nAction=10;//值为时表明为路径分析模式,在在LbuttunDown里用到
m_MapWnd.SetAction( CSeDrawParameters::uaNull);//此时将地图上的操作设为空操作
⑷在C路径分析View::OnLButtonDown(UINT nFlags, CPoint point)里进行路径分析 if(m_nAction==10)//如果操作为路径分析模式的话
{//路径搜索
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 );//pntMouse点击点,pntNode得到的最近的点
if( nNodeID >= 0 )//如果找到相应节点
{
if (m_nFromNodeID == -1)//路径分析的起始点
{
m_nFromNodeID = nNodeID; //将得到的最近节点ID赋值给起始点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);
}
//显示起始点(为实现)
//显示起始点(为实现)
}
else//在执行完上面的If语句后,开始设置路径分析的终止点
{
m_pntToNode = pntNode;//将得到的最近点的点的坐标给终止点坐标
//DisplayNodePoint(m_pntToNode);//显示终止点未实现
CDWordArray arrIDs;//路径的各个弧段ID【输出】
CDWordArray pntIDs;//路径的各个节点ID【输出】
double dPathLength = 0.0;//路径的长度
//开始分析
m_PathAnalyst.Analyse( m_nFromNodeID, nNodeID,
arrIDs,dPathLength,pntIDs );
CSeGeometry *pSeGeometry = NULL;
CSeDatasetVector *pSeDtV = NULL;
long nCount = arrIDs.GetSize();//获取分析后路径弧段的个数
if( nCount == 0 )
{//如果没有弧度,即没有找到路径
//AfxMessageBox(_T("Hello World"),MB_OK,NULL);
}
else
{
//AfxMessageBox(_T("Hello World"),MB_OK,NULL);
//如果找到路径
//获取弧度的记录集
CSeRecordset* pSeRecordset = pSeDatasetNetwork->QueryByIDs( (long *)arrIDs.GetData(), nCount );
//设置跟踪图层的风格
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( pSeRecordset )
{
if( pSeRecordset->MoveFirst() )
{
while( !pSeRecordset->IsEOF() )
{
pSeRecordset->GetGeometry(pSeGeometry);
if (pSeGeometry)
{
m_MapWnd.m_TrackingLayer.AddEvent(pSeGeometry,_T(""));
}
pSeRecordset->MoveNext();
}
}
pSeDatasetNetwork->ReleaseRecordset(pSeRecordset);
}
//刷新跟踪图层
if( m_MapWnd.m_TrackingLayer.GetCount() > 0 )
{
m_MapWnd.RefreshTrackingLayer();
}
}
m_nFromNodeID = -1;//将起始点ID置-,待第二次分析
}
}
}
}
}
}。