cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:993回复:0

AE实现GPS用户追踪的功能(VB.Net源码)

楼主#
更多 发布于:2008-07-17 18:08
<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>
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
游客

返回顶部