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

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

📁 Mapobjecst最短路径的计算方法,
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            0.00000001)&nbsp;&nbsp;<BR>&nbsp;{&nbsp;<BR>&nbsp;&nbsp;if(fabs(med) 
            &lt; 
            0.00000001)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;ptNearest-&gt;x = 
            Px ;<BR>&nbsp;&nbsp;&nbsp;ptNearest-&gt;y = Ay 
            ;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;ptNearest-&gt;y 
            = Py ;<BR>&nbsp;&nbsp;&nbsp;ptNearest-&gt;x = Ax 
            ;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{&nbsp;<BR>&nbsp;&nbsp;k1 
            = (Ay - By) / ( Ax - Bx) ;&nbsp;<BR>&nbsp;&nbsp;k2 = -1.0 / k1 
            ;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;b1 = Ay - k1 * Ax 
            ;<BR>&nbsp;&nbsp;b2 = Py - k2 * Px ;<BR>&nbsp;&nbsp;S = (b2 - b1) / 
            (k1 - k2) ;<BR>&nbsp;&nbsp;ptNearest-&gt;x = S ;<BR>&nbsp;&nbsp;S = 
            k1 * S + b1 ;<BR>&nbsp;&nbsp;ptNearest-&gt;y = S 
            ;<BR>&nbsp;}<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            得到最邻近的点<BR>void NetLine::GetNearestPoint(NetPoint point, NetPoint* 
            ptNearestPoint, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            int* nSegmentIndex, double* dLeastDistance)<BR>{<BR>&nbsp;int 
            nPointNum = m_pCoords.GetCount();&nbsp;&nbsp;&nbsp;<BR>&nbsp;double 
            dDistance;<BR>&nbsp;NetPoint ptTemp;<BR>&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;NetPoint firstPt = 
            m_pCoords.GetAt(m_pCoords.FindIndex(0));<BR>&nbsp;NetPoint secondPt 
            = m_pCoords.GetAt(m_pCoords.FindIndex(1));<BR>&nbsp;GetNearestPoint( 
            point, firstPt, secondPt, ptNearestPoint, 
            dLeastDistance);<BR>&nbsp;nSegmentIndex = 0 ;<BR>&nbsp;<BR>&nbsp;// 
            遍历每一条弧段来搜索最近的点<BR>&nbsp;int nIndex ;<BR>&nbsp;for(nIndex = 1 ; 
            nIndex&lt;nPointNum-1 ; nIndex ++ ) 
            <BR>&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;// 
            得到最近的点<BR>&nbsp;&nbsp;GetNearestPoint(point, 
            m_pCoords.GetAt(m_pCoords.FindIndex(0)), 
            <BR>&nbsp;&nbsp;&nbsp;m_pCoords.GetAt(m_pCoords.FindIndex(1)), 
            &amp;ptTemp, &amp;dDistance ) 
            ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;// 
            比较最小的距离<BR>&nbsp;&nbsp;if( dDistance &lt; *dLeastDistance 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;*dLeastDistance = dDistance 
            ;<BR>&nbsp;&nbsp;&nbsp;ptNearestPoint-&gt;x = ptTemp.x; 
            <BR>&nbsp;&nbsp;&nbsp;ptNearestPoint-&gt;y = 
            ptTemp.y;<BR>&nbsp;&nbsp;&nbsp;*nSegmentIndex = nIndex 
            ;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            获得根据给定点分裂线得到的两个部分的比例, 但并不真正分裂线<BR>// 参数point: 给定点<BR>// 
            参数ptNearestPoint: 分裂线时的分裂点 (返回)<BR>// 参数dRatio: 起始结点部分的比例 
            (返回)<BR>BOOL NetLine::GetSplitRatioByNearestPoint(NetPoint point, 
            NetPoint* ptNearest, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            double* dRatio)<BR>{<BR>&nbsp;int nIndex = 0;<BR>&nbsp;double 
            dDistance = 0.0;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;int nPointNum = 
            m_pCoords.GetCount();<BR>&nbsp;// 
            首先得到最近的点和线段索引<BR>&nbsp;GetNearestPoint(point, ptNearest, 
            &amp;nIndex, &amp;dDistance );<BR>&nbsp;<BR>&nbsp;// 
            检查线上最近的点是否与首尾点相重合<BR>&nbsp;if( nIndex == 0 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;if( IsPtCoincide(*ptNearest, 
            m_pCoords.GetAt(m_pCoords.FindIndex(0))))<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;dRatio 
            = 0;<BR>&nbsp;&nbsp;&nbsp;return 
            true;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
            <P>&nbsp;if( nIndex == nPointNum-2 )<BR>&nbsp;{<BR>&nbsp;&nbsp;if( 
            IsPtCoincide(*ptNearest, 
            m_pCoords.GetAt(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            m_pCoords.FindIndex(nPointNum-1))))<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;*dRatio 
            = 1.0;<BR>&nbsp;&nbsp;&nbsp;return 
            true;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;// 
            计算分裂出来的第二条线的长度<BR>&nbsp;int nLoop;<BR>&nbsp;double dLength = 
            0;<BR>&nbsp;// 如果最近点与本线上的下一点不重合,则需将最近点计算在内<BR>&nbsp;if ( 
            !IsPtCoincide(*ptNearest, 
            m_pCoords.GetAt(m_pCoords.FindIndex(nIndex+1))))<BR>&nbsp;{<BR>&nbsp;&nbsp;NetPoint 
            PostPoint = 
            m_pCoords.GetAt(m_pCoords.FindIndex(nIndex+1));<BR>&nbsp;&nbsp;dLength 
            += sqrt( ( PostPoint.x - ptNearest-&gt;x ) * ( PostPoint.x - 
            ptNearest-&gt;x ) + <BR>&nbsp;&nbsp;&nbsp;( PostPoint.y - 
            ptNearest-&gt;y ) * ( PostPoint.y - ptNearest-&gt;y 
            ));<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;for( nLoop = nIndex+2; 
            nLoop&lt;nPointNum; nLoop ++ )<BR>&nbsp;{<BR>&nbsp;&nbsp;NetPoint 
            CurPoint = 
            m_pCoords.GetAt(m_pCoords.FindIndex(nLoop));<BR>&nbsp;&nbsp;NetPoint 
            PrePoint = 
            m_pCoords.GetAt(m_pCoords.FindIndex(nLoop-1));<BR>&nbsp;&nbsp;dLength 
            += sqrt( ( CurPoint.x - PrePoint.x ) * ( CurPoint.x - PrePoint.x ) + 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ( PrePoint.y - PrePoint.y ) * ( PrePoint.y - PrePoint.y 
            ));<BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;*dRatio = 1.0 - 
            dLength / CalcLength();<BR>&nbsp;return 
            true;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            加入一个连接的弧段(调用前需确定弧段是连接在该点上的)<BR>BOOL NetNode::Add(int nLink, double 
            dAngle )<BR>{<BR>&nbsp;// 结点连接的弧段按角度排序<BR>&nbsp;int i = 
            0;<BR>&nbsp;for(i=0; i&lt;m_arrLinks.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;if(dAngle &lt; 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).fAngle 
            )<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;NetEdge 
            pEdge;<BR>&nbsp;pEdge.nLink = nLink;<BR>&nbsp;pEdge.fAngle = 
            (float)dAngle;<BR>&nbsp;m_arrLinks.InsertBefore(m_arrLinks.FindIndex(i), 
            pEdge );<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;return 
            true;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            删除一个已连接的弧段<BR>BOOL NetNode::Remove( int nLink 
            )<BR>{<BR>&nbsp;for(int i=0; i&lt;m_arrLinks.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;if ( nLink == 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).nLink 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;m_arrLinks.RemoveAt(m_arrLinks.FindIndex(i));<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;return 
            true;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            得到一个连接弧段的角度<BR>double NetNode::GetLinkAngle( int nLink 
            )<BR>{<BR>&nbsp;for(int i=0; i&lt;m_arrLinks.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;if ( nLink == 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).nLink 
            )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;return 
            m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).fAngle;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;return 
            -1;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            构造函数<BR>NetLink::NetLink()<BR>{<BR>&nbsp;m_GeoID = 
            -1;<BR>&nbsp;m_nFNode = -1;<BR>&nbsp;m_nTNode = 
            -1;<BR>&nbsp;m_fLength = 0;<BR>&nbsp;m_fFromImp = 
            0;<BR>&nbsp;m_fToImp = 
            0;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            拷贝另一弧段的数据<BR>void NetLink::Copy( NetLink link 
            )<BR>{<BR>&nbsp;m_GeoID = link.m_GeoID;<BR>&nbsp;m_nFNode = 
            link.m_nFNode;<BR>&nbsp;m_nTNode = link.m_nTNode;<BR>&nbsp;m_fLength 
            = link.m_fLength;<BR>&nbsp;m_fFromImp = 
            link.m_fFromImp;<BR>&nbsp;m_fToImp = 
            link.m_fToImp;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>// 
            判断两弧段是否是同一弧段<BR>BOOL NetLink::IsEqual( NetLink link 
            )<BR>{<BR>&nbsp;return m_GeoID == 
            link.m_GeoID;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>BOOL 
            NetLinkBackup::Add(int nSeg, double dRatio)<BR>{<BR>&nbsp;int i = 
            0;<BR>&nbsp;for(i = 0; i&lt;m_arrSegs.GetCount(); i++ 
            )<BR>&nbsp;{<BR>&nbsp;&nbsp;if (dRatio &lt; 
            m_arrSegs.GetAt(m_arrSegs.FindIndex(i)).dRatio 
            )<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;NetLinkSeg 
            pSeg;<BR>&nbsp;pSeg.nSegID = nSeg;<BR>&nbsp;pSeg.dRatio = 
            dRatio;<BR>&nbsp;m_arrSegs.InsertBefore(m_arrSegs.FindIndex(i), 
            pSeg);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;return 
            true;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>CNetLayer::CNetLayer(CMoMapLayer 
            layer)<BR>{<BR>&nbsp;m_nLinkNum = 0;<BR>&nbsp;m_nNodeNum = 
            0;<BR>&nbsp;m_pPath = NULL;<BR>&nbsp;m_layer = 
            layer;<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>CNetLayer::~CNetLayer(void)<BR>{<BR>&nbsp;if(m_pPath)<BR>&nbsp;{<BR>&nbsp;&nbsp;delete 
            m_pPath;<BR>&nbsp;&nbsp;m_pPath = 
            NULL;<BR>&nbsp;}<BR>}<BR>//-----------------------------------------------------------------------------------------<BR>BOOL 
            CNetLayer::ReadNetTable()<BR>{<BR>&nbsp;CMainFrame* pMainWnd = 
            (CMainFrame*)AfxGetMainWnd();<BR>&nbsp;CDaoDatabase* tmpDB = new 
            CDaoDatabase;<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp;&nbsp;tmpDB-&gt;Open(pMainWnd-&gt;m_environment.m_szDBName);<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;}</P>
            <P>&nbsp;CDaoRecordset 
            rs(tmpDB);&nbsp;<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp;&nbsp;CString 
            szSQL = "Select * From AAT Order By 
            ARCID";<BR>&nbsp;&nbsp;rs.Open(dbOpenDynaset,szSQL);</P>
            <P>&nbsp;&nbsp;COleVariant 
            var;<BR>&nbsp;&nbsp;while(!rs.IsEOF())<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;NetLink 
            lk;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("GeoID");<BR>&nbsp;&nbsp;&nbsp;lk.m_GeoID = 
            V_I4(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("FNODE");<BR>&nbsp;&nbsp;&nbsp;lk.m_nFNode = 
            V_I4(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("TNODE");<BR>&nbsp;&nbsp;&nbsp;lk.m_nTNode = 
            V_I4(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("LENGTH");<BR>&nbsp;&nbsp;&nbsp;lk.m_fLength = 
            V_R8(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("FIMP");<BR>&nbsp;&nbsp;&nbsp;lk.m_fFromImp&nbsp; = 
            V_R8(&amp;var); <BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("TIMP");<BR>&nbsp;&nbsp;&nbsp;lk.m_fToImp&nbsp; = 
            V_R8(&amp;var); <BR>&nbsp;&nbsp;&nbsp;m_arrLinks.AddTail(lk );</P>
            <P>&nbsp;&nbsp;&nbsp;rs.MoveNext();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;rs.Close();</P>
            <P>&nbsp;&nbsp;szSQL = "Select * From NAT Order By 
            NODEID";<BR>&nbsp;&nbsp;rs.Open(dbOpenDynaset,szSQL);<BR>&nbsp;&nbsp;while(!rs.IsEOF())<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;int 
            nNode, nLink;<BR>&nbsp;&nbsp;&nbsp;double x, y, 
            dAngle;<BR>&nbsp;&nbsp;&nbsp;CString szArcID, 
            szAngle;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("NODEID");<BR>&nbsp;&nbsp;&nbsp;nNode = 
            V_I4(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("X");<BR>&nbsp;&nbsp;&nbsp;x = 
            V_R8(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("Y");<BR>&nbsp;&nbsp;&nbsp;y = 
            V_R8(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("ARCID");<BR>&nbsp;&nbsp;&nbsp;szArcID = 
            V_BSTRT(&amp;var);<BR>&nbsp;&nbsp;&nbsp;var = 
            rs.GetFieldValue("ANGLE");<BR>&nbsp;&nbsp;&nbsp;szAngle = 
            V_BSTRT(&amp;var);&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;NetNode 
            node(x,y);&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;&nbsp;&nbsp;int nPos;<BR>&nbsp;&nbsp;&nbsp;CString 
            szTemp;<BR>&nbsp;&nbsp;&nbsp;while ( (nPos = szArcID.Find( ';' )) != 
            -1 )<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;szTemp = 
            szArcID.Left(nPos );<BR>&nbsp;&nbsp;&nbsp;&nbsp;nLink = atoi( szTemp 
            );<BR>&nbsp;&nbsp;&nbsp;&nbsp;szArcID = 
            szArcID.Right(szArcID.GetLength() - nPos - 1 
            );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;nPos = szAngle.Find( ';' 
            );<BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( nPos == -1 

⌨️ 快捷键说明

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