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

📄 mypathanalyst.cpp

📁 手持PDA汽车导航程序源代码
💻 CPP
字号:
// SmPathAnalyst.cpp: implementation of the CSePathAnalyst class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyPathAnalyst.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyPathAnalyst::CMyPathAnalyst()
{
	//初始化成员变量
	m_pDatasetNetwork = NULL;

	//分析模式
	m_nAnalyseMode = 1;

	m_nFieldIndexFNodeID = 3;//开始节点 ID
	m_nFieldIndexTNodeID = 4;//终止节点 ID
	m_nFieldIndexPathLength = 2;//路的长度

	m_nFieldIndexPathType = 8;//道路等级
	m_nFieldIndexDirection = 9;//行车方向的限定
}

CMyPathAnalyst::~CMyPathAnalyst()
{
}

bool CMyPathAnalyst::Init()
{
	if( m_pDatasetNetwork )
	{
		if( !m_pDatasetNetwork->IsOpen() )
		{
			m_pDatasetNetwork->Open();
		}

		if( m_pDatasetNetwork->IsOpen() )
		{
			CSeFieldInfos FieldInfos;
			if( m_pDatasetNetwork->GetFieldInfos( FieldInfos, false ) )
			{
				//通过字段索引可以更快地取出字段的值, 所以要把传进来的字段名换成索引值
				long nFieldCount = FieldInfos.GetSize();
				for(register i=0;i<nFieldCount;i++)
				{
					if( FieldInfos[i].m_strName.CompareNoCase( _T("Direction") ) == 0 )
					{
						m_nFieldIndexDirection = i;
					}
					else if( FieldInfos[i].m_strName.CompareNoCase( _T("Code") ) == 0 )
					{
						m_nFieldIndexPathType = i;
					}
					else if( FieldInfos[i].m_strName.CompareNoCase( LF_FNODE ) == 0 )
					{
						m_nFieldIndexFNodeID = i;
					}
					else if( FieldInfos[i].m_strName.CompareNoCase( LF_TNODE ) == 0 )
					{
						m_nFieldIndexTNodeID = i;
					}
					else if( FieldInfos[i].m_strName.CompareNoCase( LF_LENGTH ) == 0 )
					{
						m_nFieldIndexPathLength = i;
					}
				}
			}

			//路段的长度字段
			if( m_nFieldIndexPathLength == -1 )
			{
				return false;
			}

			return true;
		}
	}
	return false;
}

bool CMyPathAnalyst::SetAnalyseMode( long nMode )
{   
	//这个模型支持两种类型
	if( nMode > -1 && nMode < 2 )
	{
		if( m_nAnalyseMode != nMode )
		{
			//如果模式改变了,则释放以前创建的邻接矩阵
			ReleaseAdjacentMatrix();
		}

		m_nAnalyseMode = nMode;
		return true;
	}
	else
	{
		return false;
	}
}

//根据实际规则返回节点间的连同性
bool CMyPathAnalyst::GetDistance( CSeRecordset *pRecordsetArc, 
								    long &nArcID, long &nFromNodeID, long &nToNodeID, 
									double &dDistanceStartToEnd, double &dDistanceEndToStart )
{
	CSeVariant variant;

	// 弧段ID
	nArcID = pRecordsetArc->GetID();
	
	// 起始点ID
	pRecordsetArc->GetFieldValue( m_nFieldIndexFNodeID, variant );
	nFromNodeID = variant.lVal;
	
	// 终止点ID
	pRecordsetArc->GetFieldValue( m_nFieldIndexTNodeID, variant );
	nToNodeID = variant.lVal;
	
	if( nArcID >= 0 && nFromNodeID >= 0 && nToNodeID >= 0 )
	{
		if( pRecordsetArc->GetFieldValue( m_nFieldIndexPathLength, variant ) && 
			variant.vt != VT_EMPTY )
		{//此模型规定:指定的弧段长度字段的类型不是长整型就浮点型
			if( variant.vt == VT_I4 )
			{//
				dDistanceStartToEnd = variant.lVal;
				dDistanceEndToStart = variant.lVal;
			}
			else
			{
				dDistanceStartToEnd = variant.dblVal;
				dDistanceEndToStart = variant.dblVal;
			}
		}
		else
		{
			return false;
		}

		long nDirection = 0;
		if( pRecordsetArc->GetFieldValue( m_nFieldIndexDirection, variant ) && variant.vt == VT_I4 )
		{//道路等级
			nDirection = variant.lVal;
		}
		
		//最短路径分析为 0;  最佳路径分析为 1
		switch( m_nAnalyseMode )
		{
		case 1:
			{//最少时间...
				//累积的是时间数 ( 单位为 小时 )
				long nSpeedLimit = 10;// km/h
				if( pRecordsetArc->GetFieldValue( m_nFieldIndexPathType, variant ) && variant.vt == VT_I4 )
				{//道路等级
					nSpeedLimit = GetSpeedLimit( variant.lVal );
					dDistanceStartToEnd /= nSpeedLimit;
					dDistanceEndToStart /= nSpeedLimit;
				}
			}
			break;
		default:
			{
				//累积的是里程数 ( 单位为 米 )
			}
			break;
		}		

		switch( nDirection )
		{
		case 0:
			{//双向不通行
				dDistanceStartToEnd = -1;
				dDistanceEndToStart = -1;
			}
			break;
		case 1:
			{//正向单行
				dDistanceEndToStart = -1;
			}
			break;
		case 2:
			{//反向单行
				dDistanceStartToEnd = -1;
			}
			break;
		case 3:
			{//双向通行, 不用修改它的连通性
			}
			break;
		}

		return true;
	}
	return false;
}

//根据实际规则返回道路的限制速度!
long CMyPathAnalyst::GetSpeedLimit( long  btRoadType )
{// 1,100  2,80  3,60  4,50  5,40  6,30   other,20 Km/h
	switch( btRoadType )
	{
	case 1:
		return 100;
	case 2:
		return 80;
	case 3:
		return 60;
	case 4:
		return 50;
	case 5:
		return 40;
	case 6:
		return 10;
	default:
		return 20;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -