📄 sepathanalystex.cpp
字号:
// SePathAnalystEx.cpp: implementation of the CSePathAnalystEx class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PathAnalyst.h"
#include "SePathAnalystEx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSePathAnalystEx::CSePathAnalystEx()
{
}
CSePathAnalystEx::~CSePathAnalystEx()
{
}
bool CSePathAnalystEx::SetPathRuleParams( long nRuleType )
{ //设置路径分析模型
if( nRuleType < 0 || nRuleType > 3 )
{
return false;
}
ReleaseAdjacentMatrix();
m_nRuleType = nRuleType;
return true;
}
//根据实际规则返回节点间的连同性(重载函数)
bool CSePathAnalystEx::GetDistance( CSeRecordset *pRecordsetArc, long &nArcID, long &nFromNodeID, long &nToNodeID,
double &dDistanceStartToEnd, double &dDistanceEndToStart )
{
nArcID = pRecordsetArc->GetID();
CSeVariant variant;
// 起始点ID
m_pDatasetNetwork->GetFieldValue( m_nFNodeFieldIndex, nArcID, variant );
nFromNodeID = variant.lVal;
// 终止点ID
m_pDatasetNetwork->GetFieldValue( m_nTNodeFieldIndex, nArcID, variant );
nToNodeID = variant.lVal;
if( nArcID >= 0 && nFromNodeID >= 0 && nToNodeID >= 0 )
{
if( m_pDatasetNetwork->GetFieldValue( m_nLengthFieldIndex, nArcID, variant ) && variant.vt != VT_EMPTY )
{
dDistanceStartToEnd = variant.dblVal;
dDistanceEndToStart = variant.dblVal;
//UserID 字段存储如下信息:
//高字节: 管理者Code(4bit) 道路幅员区分Code(3bit) 周日Code(5bit) 车种Code(4bit)
//低字节: 自动车专用Code(2bit) 有料道路Code(2bit) 道路种别Code(4Bit) 交通规制Code(4Bit) 可否通行Code(4Bit)
//注意:上述参数也可以用字段的形式存储,依数据而定
switch( m_nRuleType )
{
case 0://无规则最短路径
break;
case 1://有规则最短路径
if( m_pDatasetNetwork->GetFieldValue( "SMUSERID", nArcID, variant ) && variant.vt != VT_EMPTY )
{
long nPassLimit = ( variant.lVal & 0x0000000f );//取出可否通行的字节
long nRuleCode = ( variant.lVal & 0x000000f0 ) >> 4; //取出交通规则字节
if( nPassLimit > 1 )
{//只有0, 1这两种情况下可以走,其余的不行,转到下一个循环
return false;
}
switch( nRuleCode )
{//走车方向的限定
case 0://此模型规定:这三个值表明双向可以通行
case 1:
case 3:
{
}
break;
case 2://此模型规定:这个值表明禁止通行
{
return false;
}
case 4://此模型规定:这三个值表明正向可以通行
case 6:
{
dDistanceEndToStart = -1;
}
break;
case 5://此模型规定:这三个值表明逆向可以通行
case 7:
{
dDistanceStartToEnd = -1;
}
break;
}
}
break;
case 2://无规则最短时间
if( m_pDatasetNetwork->GetFieldValue( "SMUSERID", nArcID, variant ) && variant.vt != VT_EMPTY )
{
long nRoadCode = ( variant.lVal & 0x00000f00 ) >> 8;//取出道路种别字节
//获取限制速度
nRoadCode = GetSpeedLimit( nRoadCode );
//返回时间
dDistanceStartToEnd /= nRoadCode;
dDistanceEndToStart /= nRoadCode;
}
break;
case 3://有规则最短时间
if( m_pDatasetNetwork->GetFieldValue( "SMUSERID", nArcID, variant ) && variant.vt != VT_EMPTY )
{
long nRuleCode = ( variant.lVal & 0x000000f0 ) >> 4;//取出交通规则字节
long nPassLimit = ( variant.lVal & 0x0000000f ); //取出可否通行的字节
long nRoadCode = ( variant.lVal & 0x00000f00 ) >> 8;//取出道路种别字节
nRoadCode = GetSpeedLimit( nRoadCode ); //获取限制速度
dDistanceStartToEnd /= nRoadCode; //返回时间
dDistanceEndToStart /= nRoadCode;
if( nPassLimit > 1 )
{//只有0, 1这两种情况下可以走,其余的不行,转到下一个循环
return false;
}
switch( nRuleCode )
{//走车方向的限定
case 0://此模型规定:这三个值表明双向可以通行
case 1:
case 3:
{
}
break;
case 2://此模型规定:这个值表明禁止通行
{
return false;
}
case 4://此模型规定:这三个值表明正向可以通行
case 6:
{
dDistanceEndToStart = -1;
}
break;
case 5://此模型规定:这三个值表明逆向可以通行
case 7:
{
dDistanceStartToEnd = -1;
}
break;
}
}
break;
}
return true;
}
}
return false;
}
//根据实际规则返回道路的限制速度!
long CSePathAnalystEx::GetSpeedLimit( BYTE btRoadType )
{
switch( btRoadType )//该模型规定:
// 1-100 2-80 3-60 4-50 5-40 6-30
// 7-30 9-10 other - 10 Km/h
{
case 1:
return 100;
break;
case 2:
return 80;
break;
case 3:
return 60;
break;
case 4:
return 50;
break;
case 5:
return 40;
break;
case 6:
return 30;
break;
case 7:
return 30;
break;
case 8:
return 100;
break;
}
return 10;
}
bool CSePathAnalystEx::CanForward( long nFromNodeID, long nCurrentNodeID, long nToNodeID )
{ //根据实际规则判断节点是否可以通达,依数据及模型而定(重载函数)
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -