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