使用虚拟矢量层
上一节我们绘制了三级行政区域(示例十六),在打开窗口的时候,会感到明显的迟滞。
这是正常的,因为要解析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
'缩放比例在5到7之间时显示市级行政区
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