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

📄 netlayer.h

📁 北京市交通mo+visual c++开发实例
💻 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 + -