自行绘制标记
本节内容可以参考CaseStudy目录下的文件"地图.Table"的示例三十。
本节使用了一些GDI+的知识,如果忘记了,可以参考:GDI+快速入门
除了使用内置标记和图片作为小计,我们还可以用GDI+自行绘制标记。
本节的任务是使用GDI+绘制城市标记,省会城市标记是两个圆圈,中心的圆圈为实心,其他城市的标记则是一个略小的普通圆圈:

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
layer.LabelStyle.ForeColor = Color.Green
'绘制省级行政区域
For
Each
dr
As
DataRow
In
DataTables("行政区域").Select("level=
1")
layer.Items.Add(map.CreatePolygon(dr("geometry")))
Next
'绘制城市
For
Each
dr
As
DataRow
In
DataTables("市").DataRows
Dim
mark
As
New
VectorPlacemark()
mark.Geometry =
New
GeoPoint(dr("经度"),
dr("纬度"))
mark.Marker.Shape = MarkerShape.Custom
'指定采用标记使用自定形状
mark.Marker.CustomShape = map.CreateMarkShape(dr("省会"))
'创建自定义形状,将是否是省会城市作为Tag
mark.Marker.Caption = dr("市")
mark.Marker.LabelPosition = LabelPosition.Right
If
dr("省会")
=
True
Then
mark.Marker.Size =
New
Size(10, 10)
'省会城市的圈圈大一点
Else
mark.Marker.Size =
New
Size(6, 6)
'非省会城市的圈圈小一点
mark.Lod =
New
Lod(0, 0, 4, 20)
'而且缩放比例达到4以后才显示
End
If
layer.Items.Add(mark)
Next
3、将OwerDrawMark事件代码设置为:
e.Graphics.DrawEllipse(pens.Red, e.Bounds)
'绘制一个圆圈
If
e.ShapeTag =
"True"
Then
'如果是省会,绘制一个小的实心圆,半径比比圆圈小2
e.Graphics.FillEllipse(Brushes.Red, e.Bounds.X + 2, e.Bounds.Y + 2,
e.Bounds.Width - 4, e.Bounds.Height - 4)
End
If
设计要点
1、Map控件的CreateMarkShape方法用于创建标记形状,该方法的唯一参数用于指定形状的ShapeTag属性,这里将是否是省会设置为形状的ShapeTag
2、OwerDrawMark事件负责绘制标记形状,这个事件通过e参数的ShapeTag属性(就是第一步指定的ShapeTag)来区分要绘制的标记。
3、OwerDrawMark的e参数属性:
| 属性 | 说明 |
| Graphics | 返回一个Graphics对象,图形绘都是通过这个对象来完成的 |
| Bounds | 返回一个RectangleF对象,图形绘制在这个对象表示的方形区域中 |
| ShapeTag | 返回要绘制形状的ShapeTag属性,这个属性是通过CreateMarkShape创建形状的时候指定的。 |
| Style | 返回标记的Style属性 |