绘制离线地图

我们可以根据经纬度数据绘制离线地图。

本节的代码稍微复杂了一点点,下一节会介绍更简单的代码。

示例一

本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例九。

任务是利用行政区域表的经纬度数据绘制出中国的省级行政区域,其中湖南用不同的颜色显示:

行政区域表有个geometry列,内容为该行政区域边界的经纬度数据,经纬度数据用逗号分隔,每两个数据为一组,奇数为经度,偶数为纬度。

行政区域可能存在飞地或海岛,所以一个行政区域在地图上可能由多个多边形组成,各多边形的经纬度数据用符号vblf隔开。

所以一个行政区域可能包括多个多边形。

一个多边形由多个经纬度点(GeoPoint)组成,点数越多,经度越高。

所以一个多边形的数据可以表示为
List(Of geopoint),而一个行政区域包括多个多边形,所以其数据可以表示为List(Of List(Of geopoint)),也就是多边形的集合。

看起来有点绕,本节是唯一采用这种比较"笨拙"的方法来绘制离线地图的,这是为了让大家对各种形状的经纬度数据构成有个初步了解,从下一节开始就会采用简单很多的代码绘制离线地图。

1、将Map控件的"地图来源"属性设置为"None"

2、将窗口的AfterLoad事件代码设置为:

Dim map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer As New VectorLayer() '定义矢量层
layer.Style.Stroke.Color = Color.DarkGray
map.Layers.Add(layer)
'将矢量层增加代map控件中
For
Each dr As DataRow In DataTables("行政区域").Select("level= 1")
   
Dim gptss As New List(Of List(Of geopoint)) '行政区域,包括多个List(Of geopoint),一个List(Of geopoint)对应一个多边形
   
For Each ltss As String In dr("geometry").Split(vblf)
       
Dim lts() As String = ltss.Split(",")
       
Dim gpts As New List(Of GeoPoint) '多边形,包括多个GeoPoint
       
For i As Integer = 0 To lts.Length - 1 Step 2
           
Dim x As Double = CDbl(lts(i))
           
Dim y As Double = CDbl(lts(i + 1))
           
Dim gpt As New GeoPoint(x, y)
            gpts.add(gpt)
       
Next
        gptss.Add(gpts)
   
Next
   
Dim polygon As VectorPolygon = map.CreatePolygon(gptss) '创建多边形
    polygon.Style.Stroke.Color = Color.FromArgb(40, 255, 0, 0)
'边框颜色为 半透明红色
   
If dr("name") = "湖南" Then
        polygon.Style.BackColor = Color.FromArgb(125, 0, 255, 0)
'背景颜色 半透明绿色
   
Else
        polygon.Style.BackColor = Color.FromArgb(40, 255, 0, 0)
'背景颜色为透明红色   
   
End If
    layer.Items.Add(polygon)
'将多边形添加到矢量层中
Next

示例二

本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例十。

任务是利用上一节的经纬度数据绘制出湖南省的行政地图:

1、将Map控件的"地图来源"属性设置为"None"

2、将窗口的AfterLoad事件代码设置为:

Dim map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer As New VectorLayer() '定义矢量层
layer.Style.Stroke.Color = Color.DarkGray
map.Layers.Add(layer)
'将矢量层增加代map控件中
For
Each dr As DataRow In DataTables("行政区域").Select("[parent] = 430000") '筛选出湖南的地级市
   
Dim gptss As New List(Of List(Of geopoint))
   
For Each ltss As String In dr("geometry").Split(vblf)
       
Dim lts() As String = ltss.Split(",")
       
Dim gpts As New List(Of GeoPoint)
       
For i As Integer = 0 To lts.Length - 1 Step 2
           
Dim x As Double = CDbl(lts(i))
           
Dim y As Double = CDbl(lts(i + 1))
           
Dim gpt As New GeoPoint(x, y)
            gpts.add(gpt)
       
Next
        gptss.Add(gpts)
   
Next
   
Dim polygon As VectorPolygon = map.CreatePolygon(gptss) '创建多边形
    polygon.Style.Stroke.Color = Color.FromArgb(40, 255, 0, 0)
'边框颜色为透明红色
    polygon.Style.BackColor = Color.FromArgb(40, 255, 0, 0)
'背景颜色为红色   
    layer.Items.Add(polygon)
'将多边形添加到矢量层中
Next

提示,如果想绘制湖南的县级行政区域,可以将筛选过条件改为:

For Each dr As DataRow In DataTables("行政区域").Select("[adcode] > 430000 and [adcode] < 440000 and level = 3") '筛选出湖南的县级行政区域
'其他代码
Next

示例三

本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例十一。

本示例的任务是在中国地图上绘制出包茂高速公路经过的各城市:

1、将Map控件的"地图来源"属性设置为"None"

2、将窗口的AfterLoad事件代码设置为:

Dim map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer As New VectorLayer() '定义矢量层
map.Layers.Add(layer)
'将矢量层增加代map控件中
'
绘制省级行政区域
For
Each dr As DataRow In DataTables("行政区域").Select("level= 1")
   
Dim gptss As New List(Of List(Of geopoint))
   
For Each ltss As String In dr("geometry").Split(vblf)
       
Dim lts() As String = ltss.Split(",")
       
Dim gpts As New List(Of GeoPoint)
       
For i As Integer = 0 To lts.Length - 1 Step 2
           
Dim x As Double = CDbl(lts(i))
           
Dim y As Double = CDbl(lts(i + 1))
           
Dim gpt As New GeoPoint(x, y)
            gpts.add(gpt)
       
Next
        gptss.Add(gpts)
   
Next
   
Dim polygon As VectorPolygon = map.CreatePolygon(gptss) '创建多边形
    polygon.Style.Stroke.Color = Color.FromArgb(40, 255, 0, 0)
'边框颜色为透明红色
    polygon.Style.BackColor = Color.FromArgb(40, 255, 0, 0)
'背景颜色为透明红色
    layer.Items.Add(polygon)
'将多边形添加到矢量层中
Next

'
包茂高速单独一个矢量层,这样用户就可以勾选是否显示这条高速
layer =
New VectorLayer()
layer.LabelVisibility = LabelVisibility.AutoHide
'文字可见,且自动隐藏重叠文字
layer.Style.Stroke.Color = Color.Blue
layer.LabelStyle.ForeColor = Color.Green
map.Layers.Add(layer)

'
定义包茂高速经过的城市
Dim
cities() As String = {"包头", "鄂尔多斯", "榆林", "延安", "铜川", "西安", "安康", "达州", "重庆", "吉首", "怀化", "邵阳", "永州", "桂林", "贺州", "肇庆", "云浮", "茂名"}
Dim
citypoints As New List(Of geopoint)
'
绘制包茂高速沿线城市
For
Each city As String In cities
   
Dim dr As DataRow = DataTables("行政区域").Find("name = '" & city & "'")
   
If dr IsNot Nothing Then
       
Dim citypoint As New GeoPoint(dr("centerX"), dr("centerY")) '获得城市的经纬度
       
Dim mark As New VectorPlacemark() '增加一个 标记
        mark.Marker.Caption = dr(
"name") '指定 标记标题
        mark.Marker.Size =
New SizeF(6, 6) '指定 的形状大小
        mark.Marker.Shape = MarkerShape.Circle
'形状为五角星
        mark.Marker.LabelPosition = LabelPosition.Right
'文字显示在形状右边
        mark.Style.BackColor = Color.Blue
'形状的填充颜色为红色
        mark.Geometry = citypoint
'设置标记的位置为城市的经纬度
        layer.Items.Add(mark)
'将形状添加到矢量层中
        citypoints.Add(citypoint)
'将城市的经纬度添加到citypoints集合
   
End If
Next

'
绘制线条链接包茂高速公路沿线城市
Dim
line As VectorPolyline = map.CreateLine(citypoints) '创建线条
line.Style.Stroke.Color = Color.Green
line.Style.Stroke.Style = GeoDashStyle.Solid

layer.Items.Add(line)

关于飞地

一些行政区域可能包括多个不连续的区域,俗称飞地,例如由于海岛的存在,海南岛的行政区域包括133个多边形,浙江省则包括44个多边形。

这不是对外出版的地图,显示这么多飞地有时并没有实际意义,可以在绘制地图的时候,控制要绘制的飞地数量。

例如对于第一个绘制省级行政区域的例子,如果要求最多绘制5个飞地,可以将代码改为:

Dim map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer As New VectorLayer() '定义矢量层
layer.Style.Stroke.Color = Color.DarkGray
map.Layers.Add(layer)
'将矢量层增加代map控件中
For
Each dr As DataRow In DataTables("行政区域").Select("level= 1")
   
Dim gptss As New List(Of List(Of geopoint))
   
For Each ltss As String In dr("geometry").Split(vblf)
       
Dim lts() As String = ltss.Split(",")
       
Dim gpts As New List(Of GeoPoint)
       
For i As Integer = 0 To lts.Length - 1 Step 2
           
Dim x As Double = CDbl(lts(i))
           
Dim y As Double = CDbl(lts(i + 1))
           
Dim gpt As New GeoPoint(x, y)
            gpts.add(gpt)
       
Next
        gptss.Add(gpts)
       
If gptss.Count = 6 Then  '最多绘制6个区域,也就是5个飞地
           
Exit For
       
End If

   
Next
   
Dim polygon As VectorPolygon = map.CreatePolygon(gptss) '创建多边形
    polygon.Style.Stroke.Color = Color.FromArgb(40, 255, 0, 0)
'边框颜色为透明红色
   
If dr("name") = "湖南" Then
        polygon.Style.BackColor = Color.FromArgb(125, 0, 255, 0)
'背景颜色为透明红色
   
Else
        polygon.Style.BackColor = Color.FromArgb(40, 255, 0, 0)
'背景颜色为透明红色   
   
End If
    layer.Items.Add(polygon)
'将多边形添加到矢量层中
Next


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