使用虚拟矢量层

上一节我们绘制了三级行政区域(示例十六),在打开窗口的时候,会感到明显的迟滞。

这是正常的,因为要解析50多兆文本性质的经纬度数据,绘制3000多个多边形与文字标记。

如果要提高效率,可以考虑虚拟矢量层。

虚拟矢量层将整个图层划分成多个瓦片(默认为720*720片),每次只绘制位于可见瓦片中的形状。

以上一节绘制三级行政区域为例,中国有3000个左右的县级行政区,但是窗口大小有效,每次最多也就显示几十个,绝大多数县级行政区始终都没有显示的机会,完全没有必要在打开窗口的时候全部绘制出来。

定义虚拟矢量层的语法为:

AddVirtualLayer(minZoom,MaxZoom)

minZoom和MaxZoom参数用于指定这个图层的缩放比例范围,只有缩放比例位于这个范围内时,图层才可见。

虚拟图层有个SetSlices方法,用于指定瓦片数量:

SetSlices(longSlices, latSlices)

longSlices和latSlices分别用于指定经度和维度方向的瓦片数量,默认都是720,一般无需修改,如果要修改,建议值为360的倍数。

GetVirtualItems事件在绘制虚拟瓦片的时候触发,其属性有:

属性 说明
X1 瓦片的起始经度
X2 瓦片的结束经度
Y1 瓦片的起始纬度
Y2 瓦片的结束纬度
Layer 触发事件的虚拟矢量层
Sender 触发事件的地图控件
GeoMap 触发事件的底层地图控件
Items 形状集合,创建的形状要添加到这个集合中,然后由系统接管绘制


示例

本示例可参考可以参考CaseStudy目录下的文件"地图.Table"的示例十七。

在本实例中,省级和市级行政区域在打开窗口的时候一次性绘制好,县级行政区域则在运行过程中动态绘制。


1、将Map控件的"地图来源"属性设置为"None"

2、将窗口的AfterLoad事件代码设置为:


Dim
map As GeoMap = e.Form.Controls("Map1").GeoMap
For
level As Integer = 1 To 2
   
Dim layer As New VectorLayer() '每一级行政区一个图层
    map.Layers.Add(layer)
    layer.Style.Stroke.Color = Color.Gray
    layer.LabelVisibility = LabelVisibility.AutoHide
'自动隐藏重叠标题
   
If level = 1 Then
        layer.MaxZoom = 4.999999
'缩放比例小于5时显示省级行政区
   
ElseIf level = 2 Then
        layer.MinZoom = 5
'缩放比例在57之间时显示市级行政区
        layer.MaxZoom = 6.999999
   
End If
   
For Each dr As DataRow In DataTables("行政区域").Select("level= " & level)
       
Dim polygon As VectorPolygon = map.CreatePolygon(dr("geometry"), 5)
        layer.Items.Add(Polygon)
       
Dim mark As New VectorPlacemark() '增加标记
        mark.Geometry =
New GeoPoint(dr("centroidX"), dr("centroidY"))
        mark.Marker.Caption = dr(
"name") '指定标题
        mark.Marker.LabelPosition = LabelPosition.Center
'标题显示在标记的中心位置
        layer.Items.Add(mark)
   
Next
Next

'
增加一个虚拟矢量层:
Dim
vlalyer As VirtualLayer = map.AddVirtualLayer(7) '缩放比例超过7之后显示此虚拟图层
vlalyer.Style.Stroke.Color = Color.Gray
vlalyer.LabelVisibility = LabelVisibility.AutoHide
'自动隐藏重叠标题

3、将地图控件的GetVirtualItems事件代码设置为:

Dim filter As String = "level = 3 And centroidX >= {0} And centroidX <= {1} And centroidY >= {2} And centroidY <= {3}"
filter = CExp(filter, e.X1, e.X2, e.Y1, e.Y2)
For Each dr As DataRow In DataTables("行政区域").Select(filter)
   
Dim polygon As VectorPolygon = e.GeoMap.CreatePolygon(dr("geometry"), 5)
   
Dim mark As New VectorPlacemark() '增加标记
    mark.Geometry =
New GeoPoint(dr("centroidX"), dr("centroidY"))
    mark.Marker.Caption = dr(
"name") '指定标题
    mark.Marker.LabelPosition = LabelPosition.Center
'标题显示在标记的中心位置
    polygon.Tag = dr(
"name")
    e.Items.Add(Polygon)
    e.Items.Add(mark)

Next


本页地址:http://www.foxtable.com/webhelp/topics/6149.htm