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

📄 利用vc+mo最短路径算法--gis开发.htm

📁 Mapobjecst最短路径的计算方法,
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            最后一段保留原角度<BR>&nbsp;&nbsp;&nbsp;double dAngle = 
            netNode-&gt;GetLinkAngle( nCurLink 
            );<BR>&nbsp;&nbsp;&nbsp;netNode-&gt;Remove( nCurLink 
            );<BR>&nbsp;&nbsp;&nbsp;netNode-&gt;Add( nNewLink, dAngle );</P>
            <P>&nbsp;&nbsp;&nbsp;// 更新弧段表<BR>&nbsp;&nbsp;&nbsp;*nNewNode = 
            m_arrNodes.GetCount() - 1;<BR>&nbsp;&nbsp;&nbsp;NetLink 
            pLink;<BR>&nbsp;&nbsp;&nbsp;pLink.m_GeoID = 
            nLineID;<BR>&nbsp;&nbsp;&nbsp;pLink.m_nFNode = 
            *nNewNode;<BR>&nbsp;&nbsp;&nbsp;pLink.m_nTNode = 
            nCurTNode;<BR>&nbsp;&nbsp;&nbsp;NetLink nl = 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fLength 
            = (float) (nl.m_fLength * ( 1 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fFromImp = (float)(nl.m_fFromImp * 
            ( 1 - dRatio ));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fToImp = 
            (float)(nl.m_fToImp * ( 1 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;m_arrLinks.AddTail( pLink );</P>
            <P>&nbsp;&nbsp;&nbsp;dRatio2 = 
            nlS.dRatio;<BR>&nbsp;&nbsp;&nbsp;NetLink* nlk = 
            &amp;(m_arrLinks.GetAt(m_arrLinks.FindIndex(nCurLink)));<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_nTNode 
            = *nNewNode;<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_fLength = (float) 
            (nlk-&gt;m_fLength * ( dRatio - dRatio2) 
            );<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_fFromImp = (float) 
            (nlk-&gt;m_fFromImp * ( dRatio - dRatio2) 
            );<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_fToImp = (float) 
            (nlk-&gt;m_fToImp* ( dRatio - dRatio2) 
            );<BR>&nbsp;&nbsp;&nbsp;m_arrLinkBackups.GetAt(m_arrLinkBackups.FindIndex(i)).Add(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            nNewLink, dRatio 
            );<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;// 
            中间某一段<BR>&nbsp;&nbsp;&nbsp;NetLink* nlk = 
            &amp;(m_arrLinks.GetAt(m_arrLinks.FindIndex(nCurLink)));<BR>&nbsp;&nbsp;&nbsp;NetLinkBackup* 
            nlBp = 
            &amp;(m_arrLinkBackups.GetAt(m_arrLinkBackups.FindIndex(i)));<BR>&nbsp;&nbsp;&nbsp;NetLinkSeg 
            nlS = 
            nlBp-&gt;m_arrSegs.GetAt(nlBp-&gt;m_arrSegs.FindIndex(j-1));<BR>&nbsp;&nbsp;&nbsp;nCurLink 
            = nlS.nSegID;<BR>&nbsp;&nbsp;&nbsp;nCurFNode = 
            nlk-&gt;m_nFNode;<BR>&nbsp;&nbsp;&nbsp;nCurTNode = 
            nlk-&gt;m_nTNode;</P>
            <P>&nbsp;&nbsp;&nbsp;// 更新节点表<BR>&nbsp;&nbsp;&nbsp;nNewLink = 
            m_arrLinks.GetCount();<BR>&nbsp;&nbsp;&nbsp;NetNode 
            pNode(ptNearest.x, ptNearest.y );<BR>&nbsp;&nbsp;&nbsp;pNode.Add( 
            nNewLink, -1 );&nbsp;<BR>&nbsp;&nbsp;&nbsp;pNode.Add( nCurLink, -1 
            );<BR>&nbsp;&nbsp;&nbsp;m_arrNodes.AddTail( pNode );</P>
            <P>&nbsp;&nbsp;&nbsp;NetNode* pNd = 
            &amp;(m_arrNodes.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrNodes.FindIndex(nCurTNode)));<BR>&nbsp;&nbsp;&nbsp;pNd-&gt;Remove( 
            nCurLink );<BR>&nbsp;&nbsp;&nbsp;pNd-&gt;Add( nNewLink, -1 );</P>
            <P>&nbsp;&nbsp;&nbsp;// 更新弧段表<BR>&nbsp;&nbsp;&nbsp;*nNewNode = 
            m_arrNodes.GetCount() - 1;<BR>&nbsp;&nbsp;&nbsp;NetLinkSeg nlSPt = 
            nlBp-&gt;m_arrSegs.GetAt(nlBp-&gt;m_arrSegs.FindIndex(j));<BR>&nbsp;&nbsp;&nbsp;dRatio2 
            = nlSPt.dRatio;<BR>&nbsp;&nbsp;&nbsp;NetLink 
            pLink;<BR>&nbsp;&nbsp;&nbsp;pLink.m_GeoID = 
            nLineID;<BR>&nbsp;&nbsp;&nbsp;pLink.m_nFNode = 
            *nNewNode;<BR>&nbsp;&nbsp;&nbsp;pLink.m_nTNode = 
            nCurTNode;<BR>&nbsp;&nbsp;&nbsp;NetLink nlkI = 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fLength 
            = (float)(nlkI.m_fLength * ( dRatio2 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fFromImp = (float)(nlkI.m_fFromImp 
            * ( dRatio2 - dRatio ));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fToImp = 
            (float)(nlkI.m_fToImp * ( dRatio2 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;m_arrLinks.AddTail( pLink );</P>
            <P>&nbsp;&nbsp;&nbsp;dRatio2 = 
            nlS.dRatio;<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_nTNode = 
            *nNewNode;<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_fLength = 
            (float)(nlk-&gt;m_fLength * ( dRatio - dRatio2) 
            );<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_fFromImp = 
            (float)(nlk-&gt;m_fFromImp * ( dRatio - dRatio2) 
            );<BR>&nbsp;&nbsp;&nbsp;nlk-&gt;m_fToImp = (float)(nlk-&gt;m_fToImp* 
            ( dRatio - dRatio2) 
            );<BR>&nbsp;&nbsp;&nbsp;m_arrLinkBackups.GetAt(m_arrLinkBackups.FindIndex(i)).Add(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            nNewLink, dRatio 
            );<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp;&nbsp;nCurLink 
            = GetNode( nLineID, &amp;nCurFNode, &amp;nCurTNode 
            );<BR>&nbsp;&nbsp;if ( nCurLink == -1 )<BR>&nbsp;&nbsp;&nbsp;return 
            FALSE;</P>
            <P>&nbsp;&nbsp;nNewLink = 
            m_arrLinks.GetCount();<BR>&nbsp;&nbsp;NetLink* nlk = 
            &amp;(m_arrLinks.GetAt(m_arrLinks.FindIndex(nCurLink)));<BR>&nbsp;&nbsp;// 
            备份<BR>&nbsp;&nbsp;NetLinkBackup 
            pBackup;<BR>&nbsp;&nbsp;pBackup.m_nIndex = 
            nCurLink;<BR>&nbsp;&nbsp;pBackup.m_Link.Copy(*nlk);<BR>&nbsp;&nbsp;pBackup.Add( 
            nNewLink, dRatio );<BR>&nbsp;&nbsp;m_arrLinkBackups.AddTail( pBackup 
            );</P>
            <P>&nbsp;&nbsp;// 更新结点表<BR>&nbsp;&nbsp;NetNode pNode( ptNearest.x, 
            ptNearest.y );<BR>&nbsp;&nbsp;pNode.Add( nNewLink, -1 
            );&nbsp;<BR>&nbsp;&nbsp;pNode.Add( nCurLink, -1 
            );<BR>&nbsp;&nbsp;m_arrNodes.AddTail( pNode );</P>
            <P>&nbsp;&nbsp;NetNode* pTempNd = 
            &amp;(m_arrNodes.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrNodes.FindIndex(nCurTNode)));<BR>&nbsp;&nbsp;// 
            最后一段保留原角度<BR>&nbsp;&nbsp;double dAngle = pTempNd-&gt;GetLinkAngle( 
            nCurLink );<BR>&nbsp;&nbsp;int nTNode = 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(nCurLink)).m_nTNode;<BR>&nbsp;&nbsp;NetNode* 
            pNd = 
            &amp;(m_arrNodes.GetAt(m_arrNodes.FindIndex(nTNode)));<BR>&nbsp;&nbsp;pNd-&gt;Remove( 
            nCurLink );<BR>&nbsp;&nbsp;pNd-&gt;Add( nNewLink, dAngle 
            );<BR>&nbsp;&nbsp;NetNode* pNd1 = 
            &amp;(m_arrNodes.GetAt(m_arrNodes.FindIndex(nTNode)));</P>
            <P>&nbsp;&nbsp;// 更新弧段表<BR>&nbsp;&nbsp;*nNewNode = 
            m_arrNodes.GetCount() - 1;<BR>&nbsp;&nbsp;NetLink 
            pLink;<BR>&nbsp;&nbsp;pLink.m_GeoID = 
            nLineID;<BR>&nbsp;&nbsp;pLink.m_nFNode = 
            *nNewNode;<BR>&nbsp;&nbsp;pLink.m_nTNode = 
            nlk-&gt;m_nTNode;<BR>&nbsp;&nbsp;pLink.m_fLength = 
            (float)(nlk-&gt;m_fLength * ( 1 - dRatio 
            ));<BR>&nbsp;&nbsp;pLink.m_fFromImp = (float)(nlk-&gt;m_fFromImp * ( 
            1 - dRatio ));<BR>&nbsp;&nbsp;pLink.m_fToImp = 
            (float)(nlk-&gt;m_fToImp * ( 1 - dRatio 
            ));<BR>&nbsp;&nbsp;m_arrLinks.AddTail( pLink );</P>
            <P>&nbsp;&nbsp;nlk-&gt;m_nTNode = 
            *nNewNode;<BR>&nbsp;&nbsp;nlk-&gt;m_fLength = 
            (float)(nlk-&gt;m_fLength * 
            dRatio);<BR>&nbsp;&nbsp;nlk-&gt;m_fFromImp = 
            (float)(nlk-&gt;m_fFromImp * 
            dRatio);<BR>&nbsp;&nbsp;nlk-&gt;m_fToImp = (float)(nlk-&gt;m_fToImp 
            * dRatio);<BR>&nbsp;}<BR>&nbsp;return 
            true;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>int 
            CNetLayer::GetNode( int nLineID, int* nFNode, int* nTNode 
            )<BR>{<BR>&nbsp;*nFNode = -1;<BR>&nbsp;*nTNode = -1;<BR>&nbsp;for ( 
            int i = 0; i&lt;m_arrLinks.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;NetLink nl = 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i));<BR>&nbsp;&nbsp;if(nLineID 
            == nl.m_GeoID )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;*nFNode = 
            nl.m_nFNode;<BR>&nbsp;&nbsp;&nbsp;*nTNode = 
            nl.m_nTNode;<BR>&nbsp;&nbsp;&nbsp;return 
            i;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;return 
            -1;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>double 
            CNetLayer::Path( int nBeginNode, int nEndNode, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CList&lt;int, 
            int&amp;&gt;* pNodes, BOOL bWeight )<BR>{&nbsp;<BR>&nbsp;if 
            (nBeginNode &lt; 0 || nBeginNode &gt;= 
            m_arrNodes.GetCount())<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;if ( 
            nEndNode &lt; 0 || nEndNode &gt;= 
            m_arrNodes.GetCount())<BR>&nbsp;&nbsp;return 
            -1;<BR>&nbsp;<BR>&nbsp;// 如果两个结点相同<BR>&nbsp;if ( nBeginNode == 
            nEndNode )<BR>&nbsp;{<BR>&nbsp;&nbsp;pNodes-&gt;AddTail(nBeginNode 
            );<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;// 
            计算nBeginNode到其他所有结点的最短路径<BR>&nbsp;if ( !CalcPath( nBeginNode, 
            nEndNode, bWeight ) )<BR>&nbsp;&nbsp;return -1;</P>
            <P>&nbsp;// 提取从nBeginNode到nEndNode的路径<BR>&nbsp;// 
            从nEndNode向前搜索前趋结点<BR>&nbsp;int nNode;<BR>&nbsp;nNode = 
            nEndNode;<BR>&nbsp;while(TRUE)<BR>&nbsp;{<BR>&nbsp;&nbsp;// 
            如果没有前趋结点,表示不连通<BR>&nbsp;&nbsp;if ( m_pPath[nNode].m_nPreNode == -1 
            )<BR>&nbsp;&nbsp;&nbsp;return -1;</P>
            <P>&nbsp;&nbsp;// 如果前趋结点为起始结点,路径结束<BR>&nbsp;&nbsp;if ( 
            m_pPath[nNode].m_nPreNode == nBeginNode 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;pNodes-&gt;AddHead( nNode 
            );<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}</P>
            <P>&nbsp;&nbsp;// 加入中间结点<BR>&nbsp;&nbsp;pNodes-&gt;AddHead(nNode 
            );<BR>&nbsp;&nbsp;nNode = m_pPath[nNode].m_nPreNode;<BR>&nbsp;}</P>
            <P>&nbsp;// 加入起点<BR>&nbsp;pNodes-&gt;AddHead(nBeginNode );</P>
            <P>&nbsp;return 
            m_pPath[nEndNode].m_dLength;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>BOOL 
            CNetLayer::CalcPath(int nNode, int nEndNode, BOOL bWeight 
            )<BR>{<BR>&nbsp;if ( nNode &lt; 0 || nNode &gt;= 
            m_arrNodes.GetCount())<BR>&nbsp;&nbsp;return FALSE;</P>
            <P>&nbsp;int i, j, nNodeNum;<BR>&nbsp;int nLink;<BR>&nbsp;byte* 
            pMark = NULL;&nbsp;&nbsp;// 处理标志数组<BR>&nbsp;nNodeNum = 
            m_arrNodes.GetCount();<BR>&nbsp;if ( nNodeNum == 0 
            )<BR>&nbsp;&nbsp;return TRUE;</P>
            <P>&nbsp;pMark = new byte[nNodeNum];<BR>&nbsp;memset(pMark, 0, 
            nNodeNum);</P>
            <P>&nbsp;// (1) 初始化<BR>&nbsp;// 初始化路径数组, 类的构造函数会将长度置为-1, 
            前趋结点为-1<BR>&nbsp;if(m_pPath)<BR>&nbsp;{<BR>&nbsp;&nbsp;delete 
            m_pPath;<BR>&nbsp;&nbsp;m_pPath = NULL;<BR>&nbsp;}<BR>&nbsp;m_pPath 
            = new NetPath[nNodeNum];</P>
            <P>&nbsp;// 自身<BR>&nbsp;m_pPath[nNode].m_dLength = 
            0;<BR>&nbsp;m_pPath[nNode].m_nPreNode = nNode;</P>
            <P>&nbsp;// 对于与该结点直接相连的点, 初始化路径长度为连接弧度的阻力<BR>&nbsp;NetNode* nd = 
            &amp;(m_arrNodes.GetAt(m_arrNodes.FindIndex(nNode)));<BR>&nbsp;for ( 
            i = 0; i&lt;nd-&gt;m_arrLinks.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;NetEdge ng = 
            nd-&gt;m_arrLinks.GetAt(nd-&gt;m_arrLinks.FindIndex(i));<BR>&nbsp;&nbsp;nLink 
            = ng.nLink;<BR>&nbsp;&nbsp;NetLink nl = 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(nLink));<BR>&nbsp;&nbsp;if(nl.m_nFNode 
            == nNode )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;// 路径长度, 
            正向<BR>&nbsp;&nbsp;&nbsp;m_pPath[nl.m_nTNode].m_dLength = bWeight ? 
            nl.m_fFromImp : nl.m_fLength;</P>
            <P>&nbsp;&nbsp;&nbsp;// 前趋结点, 如果长度&lt;0, 
            无前趋结点<BR>&nbsp;&nbsp;&nbsp;if ( m_pPath[nl.m_nTNode].m_dLength &lt; 
            0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_pPath[nl.m_nTNode].m_nPreNode = 
           

⌨️ 快捷键说明

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