再谈图示数据

本示例内容可以参考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,不是DictionarySortedDictionary自动按照键值大小排序
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


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