动态显示标记

本节内容可以参考CaseStudy目录下的文件"地图.Table"的示例八。

下面的Map显示了中国全部城市(地级市以上),人口越多,其圆形标记越大。

城市太多了,合计有300多个,所以很多内容堆叠在一起:

本节的任务是根据map控件的缩放指数,动态显示内容,一开始只显示超大城市(人口1500万以上),随着地图放大,再逐步显示中小城市:

 

要实现这个功能很简单,只需将Marker的LOD属性设置为一个LOD对象,例如:

mark.Lod = New LOD(0, 0, 4, 20)

创建LOD的时候,头两个参数保持为0,第三个参数和第四个参数指定一个缩放指数(Zoom)范围,上述代码的意思是:Zoom属性值在4到20之间的时候,才会显示这个标记。

示例

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

2、将Map控件的GetMapTile事件代码设置为:

Dim style As Integer = 8 '地图类型,可选值为610,其中6为卫星图
Dim
size As Integer = 1
Dim
scale As Integer = 1
Dim
server As Integer = Rand.Next(1, 5) '随机使用14号服务器
Dim
scl As Integer = 2 '设置为2可以隐藏地图的文字标注,且分辨率更好
Dim
Language As String = "zh_cn" '中文地图,如果需要英文可设置为"en",我 测试只有style8的时候才支持英文
Dim
url As String
If
style = 7 OrElse style = 8 Then
    url =
"https://webrd0{0}.is.autonavi.com/appmaptile?lang={1}&size={2}&scale={3}&style={4}&x={5}&y={6}&z={7}&scl={8}"
Else

    url =
"https://webst0{0}.is.autonavi.com/appmaptile?lang={1}&size={2}&scale={3}&style={4}&x={5}&y={6}&z={7}&scl={8}"
End
If
e.URI = CExp(url, server, Language, Size, scale, style, e.X, e.Y, e.Z, scl)

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

Dim map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer As New VectorLayer() '定义矢量层
layer.LabelVisibility = LabelVisibility.AutoHide
'标题可见,且自动隐藏重叠标题
layer.LabelStyle.ForeColor = Color.Green
'文字为绿色
map.Layers.Add(layer)
'将矢量层增加代map控件中
'
逐个增加城市
For
Each dr As DataRow In DataTables("").DataRows
   
Dim mark As New VectorPlacemark() '增加一个标记
    mark.Geometry =
New GeoPoint(dr("经度"), dr("纬度")) '设置位置
    mark.Marker.Shape = MarkerShape.Circle
    mark.Style.BackColor = Color.RoyalBlue
    mark.Marker.Caption = dr(
"") '指定标题
    mark.Marker.LabelPosition = LabelPosition.Right
    mark.Tag = dr(
"市代码")
   
If dr("人口") >= 1500 Then '如果人口大于1500万,则始终显示
        mark.Lod =
New LOD(0, 0, 0, 20) '始终显示
        mark.Marker.Size =
New Size(12, 12)
   
ElseIf dr("人口") >= 1000 Then
        mark.Lod =
New LOD(0, 0, 4, 20) 'Zoom超过4才显示
        mark.Marker.Size =
New Size(10, 10)
   
ElseIf dr("人口") >= 500 Then
        mark.Lod =
New LOD(0, 0, 5, 20) 'Zoom超过5才显示
        mark.Marker.Size =
New Size(8, 8)
   
Else
        mark.Lod =
New LOD(0, 0, 6, 20) 'Zoom超过6才显示
        mark.Marker.Size =
New Size(6, 6)
   
End If
    layer.Items.Add(mark)

Next

4、如果希望单击某个城市的标记,可以显示该城市的人口和GDP数据.,可以将Map控件的Click事件代码设置为:

Dim map As GeoMap = e.Sender.GeoMap
Dim
ifo As HitTestInfo = map.HitTest(e.Sender.MousePosition)
Dim
tip As String = ""
If
ifo IsNot Nothing AndAlso ifo.Vector IsNot Nothing Then
   
If ifo.Vector.Tag IsNot Nothing Then
     
Dim dr As DataRow = DataTables("").Find("市代码='" & ifo.Vector.Tag.ToString() & "'")
     
If dr IsNot Nothing Then
          tip =
"人口:" & dr("人口") & "" & vbCrLf & "GDP" & dr("GDP") & "亿" & vbCrLf & "人均:" & dr("人均GDP") & ""
     
End If
   
End If
End
If
e.Sender.ShowToolTip(tip, e.Sender.MousePosition)

提示:

请注意下面这一行代码并非是隐藏全部标题,而是当多个标题重叠在一起的时候,只显示其中一个,其余的自动隐藏:

layer.LabelVisibility = LabelVisibility.AutoHide '


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