逐级绘制形状
本节内容可以参考CaseStudy目录下的文件"地图.Table"的示例十八。
比虚拟矢量层更高效的方法是逐级绘制形状,还是以显示中国三级行政区为例,我们可以换个思路:
1、单击某个省级行政区时,显示该省的全部市级行政区。
2、单击某个市级行政区时,显示该市的全部县级行政区。
3、用鼠标右击地图,或单击“返回上一级”按钮,则显示上一级的行政区:

示例
1、将Map控件的"地图来源"属性设置为"None"
2、将窗口的AfterLoad事件代码设置如下,这里只绘制省级行政区:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
New
VectorLayer()
map.Layers.Add(layer)
layer.Style.Stroke.Color = Color.Gray
layer.LabelVisibility = LabelVisibility.AutoHide
For
Each
dr
As
DataRow
In
DataTables("行政区域").Select("level=
1")
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
polygon.Tag = dr
'将tag为对应的DataRow
mark.Tag = dr
'标记的tag也一样
layer.Items.Add(mark)
Next
3、将MouseClick事件代码设置为:
If
e.Button = MouseButtons.Left
Then
Dim
map
As
GeoMap = e.Sender.GeoMap
Dim
ifo
As
HitTestInfo = map.HitTest(e.Sender.MousePosition)
If
ifo
IsNot
Nothing
AndAlso
ifo.Vector
IsNot
Nothing
Then
If
ifo.Vector.Tag
IsNot
Nothing
Then
Dim
pr
As
DataRow = ifo.Vector.Tag
Dim
layer
As
VectorLayer = ifo.Layer
Dim
drs
As
list(Of
DataRow) = DataTables("行政区域").Select("
[parent]= "
& pr("adcode"))
If
drs.Count > 0
Then
map.CenterTo(pr("centroidX"),
pr("centroidY"))
'将地图中心设置为行政区中心
If
pr("level")
=
"1"
Then
'如果当前是省级行政区(即将显示该省的市级行政区)
e.Sender.Zoom = 5
ElseIf
pr("level")
=
"2"
Then
'如果当前是是级行政区(即将显示该市的县级行政区)
e.Sender.Zoom = 7
End
If
layer.Items.Clear()
'清除现在的形状
For
Each
dr
As
DataRow
In
drs
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
polygon.Tag = dr
'将tag设置为对应的数据行
mark.Tag = polygon.Tag
'标记的tag也一样
layer.Items.Add(mark)
Next
End
If
End
If
End
If
Else
e.Form.Controls("btnBack").PerformClick()
'模拟单击"返回上一级"按钮
End
If
4、"返回上一级"按钮的代码设置为:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(0)
Dim
filter
As
String
If
layer.Items.Count > 0
Then
Dim
cr
As
DataRow =
Nothing
cr = layer.Items(0).Tag
If
cr("level")
= 1
Then
'如果当前显示的是省级行政区,则直接返回
Return
ElseIf
cr("level")
= 2
Then
'如果当前显示的是市级行政区,则显示所有省级行政区
map.Viewport.Zoom = 3
filter =
"level
= 1"
map.CenterTo(103.72,37.93)
ElseIf
cr("level")
= 3
Then
'如果当前显示的是县级行政区,则显示对应省份的市级行政区
cr = DataTables("行政区域").Find("adcode
= "
& cr("parent"))
'取得所属市级行政区的行
cr = DataTables("行政区域").Find("adcode
= "
& cr("parent"))
'取得所属省级行政区的行
map.CenterTo(cr("centroidX"),
cr("centroidY"))
'地图中心设置为这个省的中心
map.Viewport.Zoom = 5
filter =
"[parent]= "
& cr("adcode")
End
If
Else
Return
End
If
layer.Items.Clear()
For
Each
dr
As
DataRow
In
DataTables("行政区域").Select(filter)
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
polygon.Tag = dr
'将tag设置为对应的数据行
mark.Tag = polygon.Tag
'标记的tag也一样
layer.Items.Add(mark)
Next