|
阅读:993回复:0
AE实现GPS用户追踪的功能(VB.Net源码)
<br><br><strong>GPS用户追踪分为两种模式:<br>
一、实时追踪,即当GPS接收到被追踪点新的数据时,就更新当前的视图为以追踪点为中心点的Extent,这种方式更新频繁,效率可能不高,但是如果GPS接收数据的时间间隔合适,则追踪效果很棒;<br> 2、非实时追踪,即当被追踪点超出当前视图范围时,则更新视图范围为以追踪点为中心点的Extent,很明显,这种方式效率较之前一种要高,只是追踪效果上略有不及。<br> 下面附上这两种方式的实现,只需在GPS接收数据的响应事件中调用UpdateExtentByType函数,即可根据要求更新当前视图,至于跟踪点,就用Element的方式绘制与map中即可。</strong><br> <br> <font style="background-color: rgb(204, 232, 207);" face="Verdana"><strong style="color: rgb(128, 0, 128);">#Region "GPS追踪功能"<br> </strong> ''' <summary><br> ''' GPS追踪功能,根据追踪点和追踪方式来更新当前地图范围<br> ''' </summary><br> ''' <param name="pPoint">追踪点</param><br> ''' <param name="pActiveview">当前view</param><br> ''' <param name="pTypeCheck">追踪方式,是否实时更新</param><br> ''' <remarks>实时更新是指接收到新的GPS数据就更新一次,非实时更新是指当跟踪点超出当前范围才更新</remarks><br> Public Sub UpdateExtentByType(ByVal pPoint As IPoint, ByVal pActiveview As IActiveView, Optional ByVal pTypeCheck As Boolean = False)<br> If pTypeCheck Then<br> UpdateExtent(pPoint, pActiveview)<br> Else<br> ''判断是否超出了当前范围<br> If Not GeoIsContainsAnotherGeo(pActiveview.Extent, pPoint) Then<br> UpdateExtent(pPoint, pActiveview)<br> End If<br> End If<br> End Sub<br> ''' <summary><br> ''' 更新当前视图范围为以ppoint为中心点的范围<br> ''' </summary><br> ''' <param name="pPoint">传入的point</param><br> ''' <param name="pActiveview">当前view</param><br> ''' <remarks></remarks><br> Private Sub UpdateExtent(ByVal pPoint As IPoint, ByVal pActiveview As IActiveView)<br> Dim pEnv As IEnvelope = New Envelope<br> pEnv = GetEnvelopeFromPointAndEnvelope(pPoint, pActiveview.Extent)<br> pActiveview.Extent = pEnv<br> pActiveview.PartialRefresh(esriViewDrawPhase.esriViewBackground, Nothing, Nothing)<br> End Sub<br> ''' <summary><br> ''' 根据原视图范围和新的中心点获得一个新的范围<br> ''' </summary><br> ''' <param name="pNewCenter">新中心点</param><br> ''' <param name="pEnv">原视图范围</param><br> ''' <returns>新的范围</returns><br> ''' <remarks></remarks><br> Public Function GetEnvelopeFromPointAndEnvelope(ByVal pNewCenter As IPoint, ByVal pEnv As IEnvelope) As IEnvelope<br> Dim pArea As IArea = pEnv<br> Dim pOldCenter As IPoint = pArea.Centroid<br> Dim pTrans As ITransform2D = pEnv<br> pTrans.Move(pNewCenter.X - pOldCenter.X, pNewCenter.Y - pOldCenter.Y)<br> Return pTrans<br> End Function<br> ''' <summary><br> ''' 判断一个几何体是否包含另一个几何体<br> ''' </summary><br> ''' <param name="pGeo1">包含几何体</param><br> ''' <param name="pGeo2">被包含几何体</param><br> ''' <returns></returns><br> ''' <remarks></remarks><br> Function GeoIsContainsAnotherGeo(ByVal pGeo1 As IGeometry, ByVal pGeo2 As IGeometry) As Boolean<br> Dim pRelationalOperator As IRelationalOperator = New Envelope<br> pRelationalOperator = pGeo1<br> Return (pRelationalOperator.Contains(pGeo2))<br> End Function<br> <strong style="color: rgb(128, 0, 128);">#End Region</strong></font><br> |
|
|