绘制离线地图
我们可以根据经纬度数据绘制离线地图。
本节的代码稍微复杂了一点点,下一节会介绍更简单的代码。
示例一
本示例内容可以参考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