在许多GIS程序中,我们都可以看到两个相辅相成的功能“前一视图”和“后一视图”,要实现这个功能的办法其实很多,首先程序员可以在视图改变时将视图范围对象envelope保存到一个IArray或ISet对象中,然后依据某个标记取出其中的一个范围赋给当前范围,即可以实现这两个功能。第二是可以使用ISpatialBookmark对象,其实它做的事情与第一种方式无异,我个人甚至怀疑它是否就是按照这个思路实现的。
下面谈一谈具体的代码,首先我们两个公共变量,一是当前的视图号,只要地图的范围发生变化,我们都给它一个视图号并建立一个与视图号对应的spatialbookmark对象,添加到地图中去;另一个是在使用了两个功能中的一个后,用来标识当前视图是spatialbookmark中的哪一个的ID。
Public pViewChangeCount As Long '视图变化的数量
Public pChangeView As Long '目前视图在spatialbookmark中的空间戳ID
新建spatialbookmark的方法,在新建一个bookmark时,我们需要将两个ID号保持一致,以确定当前的视图就是最新的bookmark保存的视图范围:
Public Sub CreateBookmark(ByVal pViewChangeCount As Long)
Dim pAOIBookmark As IAOIBookmark
pAOIBookmark = New AOIBookmark
pAOIBookmark.Location = pMainAV.Extent
pAOIBookmark.Name = pViewChangeCount.ToString
Dim pMapBookmarks As IMapBookmarks
pMapBookmarks = pMainMap
pMapBookmarks.AddBookmark(pAOIBookmark)
pChangeView = pViewChangeCount
End Sub
我们假设一个事件使用这个方法,如放大地图的操作,使用这个方法如下:
pViewChangeCount = pViewChangeCount + 1
CreateBookmark(pViewChangeCount)
前一视图的方法:
Public Sub PanToBookmark(ByVal pViewChangeCount As Long)
Dim pMapBookmarks As IMapBookmarks
pMapBookmarks = pMainMap
Dim pEnumBookmarks As IEnumSpatialBookmark
pEnumBookmarks = pMapBookmarks.Bookmarks
pEnumBookmarks.Reset()
Dim pBookMark As ISpatialBookmark
pBookMark = pEnumBookmarks.Next ' first bookmark in map
Do While Not pBookMark Is Nothing
If pBookMark.Name = (pChangeView - 1).ToString Then
pBookMark.ZoomTo(pMainMap)
pChangeView -= 1
pMainAV.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)
Exit Sub
End If
pBookMark = pEnumBookmarks.Next
Loop
End Sub
后一视图的方法:
Public Sub PanBackBookmark(ByVal pViewChangeCount As Long)
Dim pMapBookmarks As IMapBookmarks
pMapBookmarks = pMainMap
Dim pEnumBookmarks As IEnumSpatialBookmark
pEnumBookmarks = pMapBookmarks.Bookmarks
pEnumBookmarks.Reset()
Dim pBookMark As ISpatialBookmark
pBookMark = pEnumBookmarks.Next ' first bookmark in map
Do While Not pBookMark Is Nothing
If pBookMark.Name = (pChangeView + 1).ToString Then
pBookMark.ZoomTo(pMainMap)
pChangeView += 1
pMainAV.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)
Exit Sub
End If
pBookMark = pEnumBookmarks.Next
Loop
End Sub
(本文已被浏览 次) | | |