再谈图示数据
本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例二十五。
本示例的任务是用颜色深浅表示世界各国(地区)的GDP。
由于各国(地区)的GDP差距非常大,如果用线性的颜色变化表示GDP的变化,会使得地图上大多数国家的颜色看起来都差不多。
所以本示例将GDP分成了多个等级,不同等级对应不同的颜色,同一个等级内则用线性颜色变化表示GDP变化,这是图示一些离散性很大的数据通用方法。
提示:这里的代码将GDP和颜色的对应关系用SortedDictionary存储,而不是Dictionary,这是因为我们希望字典按照键值(GDP)的大小排序,你可以将SortedDictionary理解为"有序的字典"。

1、将Map控件的"地图来源"属性设置为"None"
2、将窗口的AfterLoad事件代码设置为:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
New
VectorLayer()
layer.Style.Stroke.Color = Color.Black
layer.LabelVisibility = LabelVisibility.AutoHide
map.Layers.Add(layer)
'为各阶层的GDP设置对应的颜色,注意用的是SortedDictionary,不是Dictionary,SortedDictionary自动按照键值大小排序
Dim
ValueColors
As
New
SortedDictionary(Of
Double,
color)
ValueColors.Add(0, Color.FromArgb(255, 241, 244, 255))
ValueColors.Add(10000, Color.FromArgb(255, 241, 244, 255))
ValueColors.Add(20000, Color.FromArgb(255, 224, 224, 246))
ValueColors.Add(50000, Color.FromArgb(255, 203, 205, 255))
ValueColors.Add(100000, Color.FromArgb(255, 179, 182, 230))
ValueColors.Add(200000, Color.FromArgb(255, 156, 160, 240))
ValueColors.Add(500000, Color.FromArgb(255, 127, 132, 243))
ValueColors.Add(1000000, Color.FromArgb(255, 89, 97, 230))
ValueColors.Add(2000000, Color.FromArgb(255, 56, 64, 217))
ValueColors.Add(4000000, Color.FromArgb(255, 19, 26, 148))
ValueColors.Add(DataTables("全球GDP").Compute("Max(GDP)"),
Color.FromArgb(255, 0, 3, 74))
'绘制世界地图
For
Each
kr
As
VectorRecord
In
map.CreateRecordsFromKML(ProjectPath &
"WorldMap.kml")
layer.Items.Add(kr.VectorItem)
Dim
dr
As
DataRow = DataTables("全球GDP").Find("国家地区
= '"
& kr.Data("name")
&
"'")
If
TypeOf
kr.VectorItem
Is
VectorPlacemark
Then
Dim
mark
As
VectorPlacemark = kr.VectorItem
'设置标记的属性:
mark.Marker.Caption = kr.Data("name")
mark.Marker.LabelPosition = LabelPosition.Center
mark.LabelStyle.ForeColor = Color.Green
mark.Lod =
New
LOD(0, 0, 2, 20)
If
dr
IsNot
Nothing
Then
If
dr("GDP")
> 2000000
Then
'GDP高的国家,因为颜色深,所以用白色字体
mark.LabelStyle.ForeColor = Color.White
End
If
End
If
ElseIf
TypeOf
kr.VectorItem
Is
VectorPolygon
Then
Dim
polygon
As
VectorPolygon = kr.VectorItem
If
dr
IsNot
Nothing
Then
Dim
value
As
Double
= dr("GDP")
For
idx
As
Integer
= 1
To
ValueColors.Keys.Count - 1
'同一阶层GDP颜色线性变化
If
value <= ValueColors.Keys(idx)
Then
Dim
maxValue
As
Double
= ValueColors.Keys(idx)
Dim
minValue
As
Double
= ValueColors.Keys(idx - 1)
Dim
maxColor
As
Color = ValueColors(maxValue)
Dim
minColor
As
Color = ValueColors(minValue)
Dim
radio
As
Double
= (value - minValue) / (maxValue - minValue)
Dim
red
As
Byte
= minColor.R + (CInt(maxColor.R)
-
CInt(minColor.R))
* radio
Dim
green
As
Byte
= minColor.G +
CInt((maxColor.G)
-
CInt(minColor.G))
* radio
Dim
blue
As
Byte
= minColor.B + (CInt(maxColor.B)
-
CInt(minColor.B))
* radio
polygon.Style.BackColor = Color.FromArgb(red, green, blue)
polygon.Tag = kr.Data("name")
& vbCrLf & value
Exit
For
End
If
Next
End
If
End
If
Next
'增加图例
map.Viewport.Margin =
New
Padding(0, 0, 100, 0)
'地图右侧
留空100个像素用于显示图例
Dim
legend
As
New
MapLegend
map.Legends.Add(legend)
legend.Alignment = ContentAlignment.MiddleRight
legend.Layout = MapLegendLayout.Column
legend.Margin =
New
Padding(10)
For
idx
As
Integer
= 0
To
ValueColors.Count - 2
Dim
minValue
As
Double
= ValueColors.Keys(idx)
Dim
MaxValue
As
Double
= ValueColors.Keys(idx + 1)
Dim
item
As
New
MapLegendItem
item.Size =
New
Size(20, 20)
item.Kind = C1.FlexMap.MapLegendItemKind.Rectangle
item.Style.BackColor = ValueColors(minValue)
item.Style.BackColor2 = ValueColors(maxValue)
item.Style.Stroke.Color = Color.LightGray
item.Style.Alignment = ContentAlignment.MiddleLeft
item.Label = minValue.ToString()
legend.Items.Add(item)
Next