📄 mypathanalyst.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 + -