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

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

📁 Mapobjecst最短路径的计算方法,
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;szTemp 
            = szAngle.Left(nPos );<BR>&nbsp;&nbsp;&nbsp;&nbsp;dAngle = 
            atof(szTemp );<BR>&nbsp;&nbsp;&nbsp;&nbsp;szAngle = 
            szAngle.Right(szAngle.GetLength() - nPos - 1 
            );<BR>&nbsp;&nbsp;&nbsp;&nbsp;node.Add( nLink, dAngle 
            );<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;m_arrNodes.AddTail( 
            node );<BR>&nbsp;&nbsp;&nbsp;rs.MoveNext();<BR>&nbsp;&nbsp;}</P>
            <P>&nbsp;&nbsp;rs.Close();<BR>&nbsp;}<BR>&nbsp;catch (CDaoException* 
            e)<BR>&nbsp;{<BR>&nbsp;&nbsp;DisplayDaoException(e);<BR>&nbsp;&nbsp;delete 
            tmpDB;<BR>&nbsp;&nbsp;e-&gt;Delete();<BR>&nbsp;&nbsp;return 
            FALSE;<BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 
            if(tmpDB)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(tmpDB-&gt;IsOpen())<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;tmpDB-&gt;Close();<BR>&nbsp;&nbsp;}</P>
            <P>&nbsp;&nbsp;delete tmpDB;<BR>&nbsp;&nbsp;tmpDB = 
            NULL;<BR>&nbsp;}</P>
            <P>&nbsp;return 
            TRUE;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>BOOL 
            CNetLayer::PathAnalysis(double x1, double y1, double x2, double y2, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CList&lt;double, 
            double&amp;&gt;* path )<BR>{<BR>&nbsp;NetPoint pt1( x1, y1 
            );<BR>&nbsp;NetPoint pt2( x2, y2 );</P>
            <P>&nbsp;CList&lt;NetPoint, NetPoint&amp;&gt; 
            points;<BR>&nbsp;points.AddTail(pt1);<BR>&nbsp;points.AddTail(pt2);</P>
            <P>&nbsp;CList&lt;int, int&amp;&gt; stops;&nbsp;<BR>&nbsp;if ( 
            !LoadStops(&amp;points, &amp;stops ) )<BR>&nbsp;&nbsp;return 
            FALSE;<BR>&nbsp;if ( stops.GetCount() != 2 )<BR>&nbsp;&nbsp;return 
            FALSE;</P>
            <P>&nbsp;CList&lt;int, int&amp;&gt; nodes;<BR>&nbsp;double 
            dDistance;<BR>&nbsp;// 得到起点<BR>&nbsp;int nFirst = 
            stops.GetAt(stops.FindIndex(0));<BR>&nbsp;// 得到终点<BR>&nbsp;int 
            nSecnd = stops.GetAt(stops.FindIndex(1));<BR>&nbsp;// 
            计算距离<BR>&nbsp;dDistance = Path(nFirst, nSecnd, &amp;nodes, 
            FALSE);<BR>&nbsp;if ( dDistance &lt; 0 )<BR>&nbsp;&nbsp;return 
            FALSE;</P>
            <P>&nbsp;NetLine* line;<BR>&nbsp;line = new 
            NetLine(m_layer);<BR>&nbsp;// 根据节点创建线对象<BR>&nbsp;if ( 
            !CreateResultPath(&amp;nodes, line, FALSE) )<BR>&nbsp;&nbsp;return 
            FALSE;</P>
            <P>&nbsp;for ( int i=0; i&lt;line-&gt;m_pCoords.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;NetPoint np = 
            line-&gt;m_pCoords.GetAt(line-&gt;m_pCoords.FindIndex(i));<BR>&nbsp;&nbsp;path-&gt;AddTail(np.x 
            );<BR>&nbsp;&nbsp;path-&gt;AddTail(np.y );<BR>&nbsp;}</P>
            <P>&nbsp;// 
            释放资源<BR>&nbsp;UnloadStops();<BR>&nbsp;if(line)<BR>&nbsp;{<BR>&nbsp;&nbsp;delete 
            line;<BR>&nbsp;&nbsp;line = NULL;<BR>&nbsp;}</P>
            <P>&nbsp;return 
            true;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>BOOL 
            CNetLayer::LoadStops(CList&lt;NetPoint, NetPoint&amp;&gt;* pPoints, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CList&lt;int, 
            int&amp;&gt;* pNodes )<BR>{&nbsp;<BR>&nbsp;int nLineID;<BR>&nbsp;int 
            i, nNewNode;<BR>&nbsp;NetPoint* ptNearest = NULL;<BR>&nbsp;ptNearest 
            = new NetPoint();<BR>&nbsp;double dRatio;&nbsp;</P>
            <P>&nbsp;// 先清空站点表&nbsp;<BR>&nbsp;int nNum = 
            pPoints-&gt;GetCount();<BR>&nbsp;for ( i = 0; i &lt; nNum; i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;// 计算距离该点最近的线<BR>&nbsp;&nbsp;NetLine 
            line(m_layer);<BR>&nbsp;&nbsp;NetPoint np = 
            pPoints-&gt;GetAt(pPoints-&gt;FindIndex(i));<BR>&nbsp;&nbsp;nLineID 
            = line.GetNearestLineData( np.x, np.y);<BR>&nbsp;&nbsp;if ( nLineID 
            == -1 
            )<BR>&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return 
            false;<BR>&nbsp;&nbsp;}</P>
            <P>&nbsp;&nbsp;/* 计算该点分裂该线的位置, 并不实际分裂该线, <BR>&nbsp;&nbsp;只是计算分裂的比例, 
            用于更改弧段表和结点表 */<BR>&nbsp;&nbsp;dRatio = 
            0;<BR>&nbsp;&nbsp;line.GetSplitRatioByNearestPoint (np, ptNearest, 
            &amp;dRatio );</P>
            <P>&nbsp;&nbsp;// 更新弧段表和结点表<BR>&nbsp;&nbsp;UpdateLinkNodeTable( 
            nLineID, *ptNearest, dRatio, &amp;nNewNode );&nbsp;&nbsp;</P>
            <P>&nbsp;&nbsp;if ( pNodes-&gt;GetCount() &gt; 0 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;int nCount = 
            pNodes-&gt;GetCount() - 1;<BR>&nbsp;&nbsp;&nbsp;if 
            (pNodes-&gt;GetAt(pNodes-&gt;FindIndex(nCount)) == nNewNode 
            )<BR>&nbsp;&nbsp;&nbsp;&nbsp;continue;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;pNodes-&gt;AddTail(nNewNode 
            );<BR>&nbsp;}</P>
            <P>&nbsp;// 填充需要返回的结点数组<BR>&nbsp;if ( pNodes-&gt;GetCount() == 0 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;pNodes = NULL;<BR>&nbsp;&nbsp;return 
            FALSE;<BR>&nbsp;}</P>
            <P>&nbsp;if(ptNearest)<BR>&nbsp;{<BR>&nbsp;&nbsp;delete 
            ptNearest;<BR>&nbsp;&nbsp;ptNearest = 
            NULL;<BR>&nbsp;}<BR>&nbsp;return 
            TRUE;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>BOOL 
            CNetLayer::UpdateLinkNodeTable(int nLineID, NetPoint ptNearest, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double 
            dRatio, int* nNewNode )<BR>{<BR>&nbsp;int i, j;<BR>&nbsp;bool 
            bFound;<BR>&nbsp;double dRatio2;<BR>&nbsp;int nCurLink, 
            nNewLink;<BR>&nbsp;int nCurFNode, 
            nCurTNode;&nbsp;&nbsp;&nbsp;<BR>&nbsp;*nNewNode = -1;</P>
            <P>&nbsp;// 与某条弧段的首点或者位点重合, 不需要更改弧段表和结点表<BR>&nbsp;if ( fabs(dRatio) 
            &lt; 0.00000001 )<BR>&nbsp;{<BR>&nbsp;&nbsp;// 
            首点<BR>&nbsp;&nbsp;nCurLink = GetNode( nLineID, &amp;nCurFNode, 
            &amp;nCurTNode );<BR>&nbsp;&nbsp;*nNewNode = 
            nCurFNode;<BR>&nbsp;&nbsp;return TRUE;<BR>&nbsp;}<BR>&nbsp;else if ( 
            fabs(1-dRatio) &lt; 0.00000001 )<BR>&nbsp;{<BR>&nbsp;&nbsp;// 
            尾点<BR>&nbsp;&nbsp;nCurLink = GetNode( nLineID, &amp;nCurFNode, 
            &amp;nCurTNode );<BR>&nbsp;&nbsp;*nNewNode = 
            nCurTNode;<BR>&nbsp;&nbsp;return TRUE;<BR>&nbsp;}</P>
            <P>&nbsp;bFound = FALSE;<BR>&nbsp;for ( i=0; 
            i&lt;m_arrLinkBackups.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;NetLinkBackup* nl = 
            &amp;(m_arrLinkBackups.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinkBackups.FindIndex(i)));<BR>&nbsp;&nbsp;if ( 
            nl-&gt;m_Link.m_GeoID == nLineID 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;bFound = 
            TRUE;<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
            <P>&nbsp;if ( bFound )<BR>&nbsp;{<BR>&nbsp;&nbsp;NetLinkBackup* nl = 
            &amp;(m_arrLinkBackups.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinkBackups.FindIndex(i)));<BR>&nbsp;&nbsp;for ( j = 0; j &lt; 
            nl-&gt;m_arrSegs.GetCount(); j++ 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;// 如果新点与原有的点重合, 
            则直接返回原来的点<BR>&nbsp;&nbsp;&nbsp;NetLinkSeg nlS = 
            nl-&gt;m_arrSegs.GetAt(nl-&gt;m_arrSegs.FindIndex(j));<BR>&nbsp;&nbsp;&nbsp;double 
            r = nlS.dRatio;<BR>&nbsp;&nbsp;&nbsp;if ( fabs( r - dRatio) &lt; 
            0.00000001 )<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( 
            j == 0 
            )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCurLink 
            = GetNode( nLineID, &amp;nCurFNode, &amp;nCurTNode 
            );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*nNewNode = 
            nCurTNode;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 
            true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetLinkSeg 
            nlSPre = 
            nl-&gt;m_arrSegs.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            nl-&gt;m_arrSegs.FindIndex(j-1));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCurLink 
            = nlSPre.nSegID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*nNewNode = 
            m_arrLinks.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinks.FindIndex(nCurLink)).m_nTNode;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 
            TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}</P>
            <P>&nbsp;&nbsp;&nbsp;// 没有重合的点<BR>&nbsp;&nbsp;&nbsp;r = 
            nlS.dRatio;<BR>&nbsp;&nbsp;&nbsp;if ( dRatio &lt; r 
            )<BR>&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if 
            ( j == 0 )&nbsp;<BR>&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;// 
            第一段<BR>&nbsp;&nbsp;&nbsp;nCurLink = GetNode( nLineID, 
            &amp;nCurFNode, &amp;nCurTNode );<BR>&nbsp;&nbsp;&nbsp;if ( nCurLink 
            == -1 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;</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* nd = 
            &amp;(m_arrNodes.GetAt(m_arrNodes.FindIndex(nCurTNode)));<BR>&nbsp;&nbsp;&nbsp;nd-&gt;Remove( 
            nCurLink );<BR>&nbsp;&nbsp;&nbsp;nd-&gt;Add( nNewLink, -1 );</P>
            <P>&nbsp;&nbsp;&nbsp;// 更新弧段表<BR>&nbsp;&nbsp;&nbsp;*nNewNode = 
            m_arrNodes.GetCount() - 1;<BR>&nbsp;&nbsp;&nbsp;NetLinkSeg nlS = 
            nl-&gt;m_arrSegs.GetAt(nl-&gt;m_arrSegs.FindIndex(0));<BR>&nbsp;&nbsp;&nbsp;dRatio2 
            = nlS.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 = 
            m_arrLinks.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinks.FindIndex(nlS.nSegID)).m_nFNode;<BR>&nbsp;&nbsp;&nbsp;NetLink* 
            oldLink = 
            &amp;(m_arrLinks.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinks.FindIndex(nCurLink)));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fLength 
            = (float)(oldLink-&gt;m_fLength * ( dRatio2 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fFromImp = 
            (float)(oldLink-&gt;m_fFromImp * ( dRatio2 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;pLink.m_fToImp = 
            (float)(oldLink-&gt;m_fToImp * ( dRatio2 - dRatio 
            ));<BR>&nbsp;&nbsp;&nbsp;m_arrLinks.AddTail( pLink );</P>
            <P>&nbsp;&nbsp;&nbsp;oldLink-&gt;m_nTNode = 
            *nNewNode;<BR>&nbsp;&nbsp;&nbsp;oldLink-&gt;m_fLength = (float) 
            (oldLink-&gt;m_fLength * 
            dRatio);<BR>&nbsp;&nbsp;&nbsp;oldLink-&gt;m_fFromImp = (float) 
            (oldLink-&gt;m_fFromImp * 
            dRatio);<BR>&nbsp;&nbsp;&nbsp;oldLink-&gt;m_fToImp = (float) 
            (oldLink-&gt;m_fToImp* dRatio);</P>
            <P>&nbsp;&nbsp;&nbsp;nl-&gt;Add( nNewLink, dRatio 
            );<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else if ( j == 
            nl-&gt;m_arrSegs.GetCount())&nbsp;<BR>&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;// 
            最后一段<BR>&nbsp;&nbsp;&nbsp;NetLinkSeg nlS = 
            nl-&gt;m_arrSegs.GetAt(nl-&gt;m_arrSegs.FindIndex(j-1));<BR>&nbsp;&nbsp;&nbsp;nCurLink 
            = nlS.nSegID;<BR>&nbsp;&nbsp;&nbsp;nCurFNode = 
            m_arrLinks.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinks.FindIndex(nCurLink)).m_nFNode;<BR>&nbsp;&nbsp;&nbsp;nCurTNode 
            = 
            m_arrLinks.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrLinks.FindIndex(nCurLink)).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* netNode = 
            &amp;(m_arrNodes.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_arrNodes.FindIndex(nCurTNode)));<BR>&nbsp;&nbsp;&nbsp;// 

⌨️ 快捷键说明

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