动态显示标记
本节内容可以参考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
'地图类型,可选值为6到10,其中6为卫星图
Dim
size
As
Integer
= 1
Dim
scale
As
Integer
= 1
Dim
server
As
Integer
= Rand.Next(1, 5)
'随机使用1到4号服务器
Dim
scl
As
Integer
= 2
'设置为2可以隐藏地图的文字标注,且分辨率更好
Dim
Language
As
String
=
"zh_cn"
'中文地图,如果需要英文可设置为"en",我
测试只有style为8的时候才支持英文
Dim
url
As
String
If
style = 7
OrElse
style = 8
Then
url =
Else
url =
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
'