逐级绘制形状

本节内容可以参考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


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