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

📄 sepathanalystex.cpp

📁 Embedded vc++下开发的路经分析程序
💻 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 + -