最佳路径分析总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一步:在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;