📄 netlayer.h
字号:
#pragma once
#include "MoMapLayer.h"
//-----------------------------------------------------------------------------------------
// 定义网络上的一节点
class NetPoint
{
public:
double x; // X坐标
double y; // Y坐标
public:
NetPoint()
{
x = 0;
y = 0;
}
NetPoint( double X, double Y)
{
x = X;
y = Y;
}
};
//-----------------------------------------------------------------------------------------
// 定义网络上的一条线
class NetLine
{
// 属性
public :
CList<NetPoint, NetPoint&> m_pCoords; // 线段包含的节点的坐标
private:
CMoMapLayer m_layer; // 图层对象
// 构造函数
public:
NetLine(CMoMapLayer layer);
~NetLine();
// 计算线的几何长度
double CalcLength();
// 通过线的id得到线数据
BOOL GetLineData(int id);
// 得到距离某点最近的线段,返回该线段的id
int GetNearestLineData( double x, double y);
// 判断两点是否重合
BOOL IsPtCoincide( NetPoint ptFirst, NetPoint ptSecond );
// 得到最邻近的点
void GetNearestPoint(NetPoint ptP, NetPoint ptA, NetPoint ptB,
NetPoint* ptNearest, double* dDistance );
void GetNearestPoint(NetPoint point, NetPoint* ptNearestPoint,
int* nSegmentIndex, double* dLeastDistance);
// 获得根据给定点分裂线得到的两个部分的比例
BOOL GetSplitRatioByNearestPoint(NetPoint point, NetPoint* ptNearest,
double* dRatio );
};
//-----------------------------------------------------------------------------------------
// 定义网络上的一条边
class NetEdge
{
public:
int nLink; // 连接的弧段索引(数组下标索引)
float fAngle; // 水平夹角
public:
NetEdge()
{
nLink = -1;
fAngle = 0;
}
};
//-----------------------------------------------------------------------------------------
// 定义网络上的一节点,包含了与该节点相连的弧段信息
class NetNode : public NetPoint
{
public:
// 与该点连接的弧段数组, 弧段按角度排序
CList<NetEdge, NetEdge&> m_arrLinks;
public:
NetNode()
{
x = 0;
y = 0;
}
NetNode(double X, double Y)
{
x = X;
y = Y;
}
void operator=(const NetNode& netNode)
{
x = netNode.x;
y = netNode.y;
for(int i=0; i<netNode.m_arrLinks.GetCount(); i++)
{
NetEdge neg = netNode.m_arrLinks.GetAt(
netNode.m_arrLinks.FindIndex(i));
m_arrLinks.AddTail(neg);
}
}
// 加入一个连接的弧段(调用前需确定弧段是连接在该点上的)
BOOL Add( int nLink, double dAngle );
// 删除一个已连接的弧段
BOOL Remove( int nLink );
// 得到一个连接弧段的角度
double GetLinkAngle( int nLink );
};
//-----------------------------------------------------------------------------------------
// 网络弧段(链)类
class NetLink
{
public:
int m_GeoID; // 弧段ID(GeoID)
int m_nFNode; // 起始结点(数组下标索引)
int m_nTNode; // 终止结点(数组下标索引)
double m_fLength; // 长度
double m_fFromImp; // 正向阻力(阻力系数*长度 或 (1+阻力系数)*长度)
double m_fToImp; // 逆向阻力
public:
NetLink();
void Copy( NetLink link ); // 拷贝操作
BOOL IsEqual( NetLink link ); // 判断是否相等
};
//-----------------------------------------------------------------------------------------
// 用于分裂操作的结构
struct NetLinkSeg
{
int nSegID; // 分裂点后面的部分的弧段索引(数组下标索引)
double dRatio; // 分裂点前面的到起始结点部分的比例
};
//-----------------------------------------------------------------------------------------
// 用于备份弧段的类
class NetLinkBackup
{
public:
int m_nIndex; // 弧段的索引
NetLink m_Link; // 备份的弧段对象
CList<NetLinkSeg, NetLinkSeg&> m_arrSegs; // 该弧段被多次分割的比例列表
public:
NetLinkBackup()
{
m_nIndex = -1;
}
void operator=(const NetLinkBackup& netLink)
{
m_nIndex = netLink.m_nIndex;
m_Link = netLink.m_Link;
for(int i=0; i<netLink.m_arrSegs.GetCount(); i++)
{
NetLinkSeg nLS = netLink.m_arrSegs.GetAt(
netLink.m_arrSegs.FindIndex(i));
m_arrSegs.AddTail(nLS);
}
}
BOOL Add( int nSeg, double dRatio );
};
//-----------------------------------------------------------------------------------------
// 定义网络上的一条路径
class NetPath
{
public:
double m_dLength; // 该点到给定点的最短路径长度, -1表示不连通
int m_nPreNode; // 该点在该路径上的前趋结点
public:
NetPath()
{
m_dLength = -1;
m_nPreNode = -1;
}
};
//-----------------------------------------------------------------------------------------
class CNetLayer
{
private:
CList<NetLink, NetLink&> m_arrLinks; // 弧段表
CList<NetNode, NetNode&> m_arrNodes; // 节点表
CList<NetLinkBackup, NetLinkBackup&> m_arrLinkBackups; // 弧段备份表
int m_nLinkNum; // 原始弧段数目(网络拓扑建立完成后)
int m_nNodeNum; // 原始结点数目(网络拓扑建立完成后)
NetPath* m_pPath; // 某一个点到所有点的最短路径
CMoMapLayer m_layer; // 图层对象
public:
CNetLayer(CMoMapLayer layer);
~CNetLayer(void);
BOOL ReadNetTable();
BOOL PathAnalysis(double x1, double y1, double x2, double y2, CList<double, double&>* path );
BOOL LoadStops(CList<NetPoint, NetPoint&>* pPoints, CList<int, int&>* pNodes);
BOOL UpdateLinkNodeTable( int nLineID, NetPoint ptNearest, double dRatio, int* nNewNode );
int GetNode(int nLineID, int* nFNode, int* nTNode );
double Path(int nBeginNode, int nEndNode, CList<int, int&>* pNodes, BOOL bWeight);
BOOL CalcPath( int nNode, int nEndNode , BOOL bWeight );
double GetConnectedDistance( int nNode1, int nNode2, BOOL bWeight );
BOOL CreateResultPath(CList<int, int&>* pNodes, NetLine* line, BOOL bWeight);
int IsConnectedDirectly(int nNode1, int nNode2, int* nLink, double* dDistance, BOOL bWeight);
BOOL UnloadStops();
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -