自行绘制标记

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


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