posts - 41,  comments - 23,  trackbacks - 1
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
Tag标签: GIS
posted on 2008-07-17 13:42 王者之魂 阅读(360) 评论(1)  编辑 收藏

FeedBack:
2008-08-06 12:21 | GIS云中飞鹏      
好代码!
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 

众 万
志 众
成 一
城 心

诚 心
祝 愿
中 震
国 区
人 百
民 姓
幸 安
福 康

QQ:13945133
MSN:yangguanjunmeteor@hotmail.com


<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

与我联系

搜索

 

常用链接

留言簿(1)

我参与的团队

我的标签

随笔档案(41)

友情链接

最新评论

阅读排行榜

评论排行榜