绘制非标形状
本节内容可以参考CaseStudy目录下的文件"地图.Table"的示例三十四。
地图只支持三种标准形状,分别是标记、线条和多边形。
SHP、KML和GeoJson这三种通用地图数据文件也只支持上述三种标准形状。
为方便用户,
Foxtable另外提供了11种非标形状,分别是四边形、菱形、圆形、椭圆、扇形、弧线、贝塞尔曲线、水滴曲线,以及带箭头的水滴曲线、直线和贝塞尔曲线。
四边形和菱形本身就是一种多边形,圆形和扇形则是通过多边形来模拟的(其实数学上不存在绝对圆形,所有的圆形都是多边形模拟的),所以四边形、菱形、圆形与扇形的类型和多边形一样,都是VectorPolygon。
就像圆形是通过多边形模拟出来的,弧线和曲线是通过线条来模拟的,所以弧线和曲线的类型和线条一样,都是VectorPolyline。
CreateCircle
CreateCircle方法用于绘制圆形,第一个参数为圆心,第二个参数为圆周上一个点,第三个参数是逻辑型,用于决定是否绘制像素意义的圆形(地球是球面,在球面上绘制的圆形默认是有形变的)。
例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("西安",
New
GeoPoint(108.948, 34.2632))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
'以西安为圆心,以西安到成都之间的距离为半径绘制一个圆形
Dim
crcl
As
VectorPolygon = map.CreateCircle(cities("西安"),
cities("成都"),
True)
crcl.Style.Stroke.Color = Color.Red
crcl.Style.BackColor = Color.FromArgb(38, 255, 0, 0)
layer.Items.Add(crcl)

CreateEllipse
CreateEllipse方法用于绘制椭圆,两个参数分别用户指定指定椭圆所在四边形的对角顶点。
例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("长沙",
New
GeoPoint(112.9823, 28.1941))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
'绘制一个椭圆,对角定点分别为西安和成都
Dim
elp
As
VectorPolygon = map.CreateEllipse(cities("长沙"),
cities("成都"))
elp.Style.Stroke.Color = Color.Red
elp.Style.BackColor = Color.FromArgb(38, 255, 0, 0)
layer.Items.Add(elp)

CreatePie
CreatePie方法用于绘制扇形,第一个参数为圆心,第二个参数为扇形起点,第三个参数为扇形的扫描角度数,例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
'以广州为圆心,以成都为扇形起点,扇形
的扫描角度数为30度
Dim
pie
As
VectorPolygon = map.CreatePie(cities("广州"),
cities("成都"),
30)
pie.Style.Stroke.Color = Color.Red
pie.Style.BackColor = Color.FromArgb(38, 255, 0, 0)
layer.Items.Add(pie)

提示:角度为正表示顺时钟扫描,角度为负表示逆时扫描。
CreateArc
CreateArc用于绘制弧线,一个参数为圆心,第二个参数为弧线起点,第三个参数为扇形扫描角 的度数,例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
'以广州为圆心,以成都为起点,弧线扫描角
的度数为60度
Dim
line
As
VectorPolyline = map.CreateArc(cities("广州"),
cities("成都"),
60)
line.Style.Stroke.Color = Color.Red
line.Style.Stroke.Width = 2
layer.Items.Add(line)

提示:角度为正表示顺时钟扫描,角度为负表示逆时扫描。
CreateLinkArc
CreateLinkArc同样用于绘制弧线,第一个参数为弧线起点,第二个参数为弧线终点,第三个参数指定弧线 的弯曲度(绝对值越大弯曲越明显,正数向上弯,负数向下弯),例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
For
curv
As
Double
= -2
To
2
Step
0.1
Dim
line
As
VectorPolyline = map.CreateLinkArc(cities("广州"),
cities("北京"),
curv)
line.Style.Stroke.Color = Color.BurlyWood
layer.Items.Add(line)
Next

再例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
cities.Add("上海",
New
GeoPoint(121.4726, 31.2317))
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
cities.Add("哈尔滨",
New
GeoPoint(126.6425, 45.757))
For
Each
city
As
String
In
cities.Keys
If
city <>
"北京"
Then
Dim
curv
As
Double
= 0.3
If
cities(city).X < cities("北京").X
Then
'翻转弧线方向
curv = -curv
End
If
Dim
line
As
VectorPolyline = map.CreateLinkArc(cities(city), cities("北京"),
curv)
line.Style.Stroke.Color = Color.Red
line.Style.Stroke.Style =
GeoDashStyle.Dot
layer.Items.Add(line)
End
If
Next

CreateCurve
CreateCurve用于创建水滴状曲线,和CreateLinkArc有些类似,不过多了一个用于指定拱点位置的参数。
第一个参数为起点;第二个参数为终点;第三个参数指定曲线的弯曲度(绝对值越大弯曲越明显,正数向上弯,负数向下弯);第四个参数指定曲线拱点位置,取值范围为0到1之间,0靠近起点,1靠近终点,如果设置为0.5,则
居中。
例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
For
curv
As
Double
= -2
To
2
Step
0.1
'起点为广州,终点为北京,拱点靠近北京
Dim
line
As
VectorPolyline = map.CreateCurve(cities("广州"),
cities("北京"),
curv, 1)
line.Style.Stroke.Color = Color.BurlyWood
layer.Items.Add(line)
Next

再例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
cities.Add("上海",
New
GeoPoint(121.4726, 31.2317))
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
cities.Add("哈尔滨",
New
GeoPoint(126.6425, 45.757))
For
Each
city
As
String
In
cities.Keys
If
city <>
"北京"
Then
Dim
curv
As
Double
= 0.3
If
cities(city).X < cities("北京").X
Then
'翻转弧线方向
curv = -curv
End
If
Dim
line
As
VectorPolyline = map.CreateCurve(cities(city), cities("北京"),
curv, 0.8)
line.Style.Stroke.Color = Color.Red
line.Style.Stroke.Width = 2
layer.Items.Add(line)
End
If
Next

CreateCurveWithArrow
CreateCurveWithArrow用于绘制带箭头的水滴状曲线,这个函数在CreateCurve的基础上,增加了两个参数,一个用于指定箭头长度,一个用于指定箭头夹角度数。
例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
cities.Add("上海",
New
GeoPoint(121.4726, 31.2317))
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
cities.Add("哈尔滨",
New
GeoPoint(126.6425, 45.757))
For
Each
city
As
String
In
cities.Keys
If
city <>
"北京"
Then
Dim
curv
As
Double
= -0.3
If
cities(city).X < cities("北京").X
Then
'翻转弧线方向
curv = -curv
End
If
'箭头长度为8,夹角为30度:
Dim
line
As
VectorPolyline = map.CreateCurveWithArrow(cities("北京"),
cities(city), curv, 0.2, 8, 30)
line.Style.Stroke.Color = Color.Red
line.Style.Stroke.Width = 2
layer.Items.Add(line)
End
If
Next

CreateRectangle
CreateRectangle用于创建平行四边形,就两个参数,分别用于指定平行四边形其中一条对角线的两个顶点,例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("西安",
New
GeoPoint(108.948, 34.2632))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
'以西安和成都为对角线点绘制一个平行四边形
Dim
pie
As
VectorPolygon = map.CreateRectangle(cities("西安"),
cities("成都"))
pie.Style.Stroke.Color = Color.Red
pie.Style.BackColor = Color.FromArgb(38, 255, 0, 0)
layer.Items.Add(pie)

CreateDiamond
CreateDiamond方法用于绘制菱形,两个参数分别用于指定菱形的左(或又)顶点和上(或下)顶点,例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("昆明",
New
GeoPoint(102.7123, 25.0406))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
'以成都和西安为顶点绘制一个菱形
Dim
damd
As
VectorPolygon = map.CreateDiamond(cities("昆明"),
cities("成都"))
damd.Style.Stroke.Color = Color.Red
damd.Style.BackColor = Color.FromArgb(38, 255, 0, 0)
layer.Items.Add(damd)

CreateBezierCurve
CreateBezierCurve用于绘制贝塞尔曲线,例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
cities.Add("西安",
New
GeoPoint(108.948, 34.2632))
cities.Add("福州",
New
GeoPoint(119.3062, 26.0753))
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
'绘制一条贝塞尔曲线连接这四个城市
Dim
bzr
As
VectorPolyline = map.CreateBezierCurve({cities("北京"),
cities("西安"),
cities("福州"),
cities("广州")})
bzr.Style.Stroke.Color = Color.Red
bzr.Style.Stroke.Width = 2
layer.Items.Add(bzr)

CreateBezierCurveArrow
CreateBezierCurveArrow方法用于绘制带箭头的贝塞尔曲线,例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
cities.Add("西安",
New
GeoPoint(108.948, 34.2632))
cities.Add("福州",
New
GeoPoint(119.3062, 26.0753))
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
'绘制一条贝塞尔曲线连接这四个城市
Dim
bzr
As
VectorPolyline = map.CreateBezierCurveArrow({cities("广州"),
cities("福州"),
cities("西安"),
cities("北京")})
bzr.Style.Stroke.Color = Color.Red
bzr.Style.Stroke.Width = 2
layer.Items.Add(bzr)

CreateLineWithArrow
CreateLineWithArrow用于绘制一条带箭头的线条,有三个语法:
CreateLineWithArrow(p1,p2,arrowLength,arrowAngle)
CreateLineWithArrow(points,arrowLength,arrowAngle)
CreateLineWithArrow(pointsString,arrowLength,arrowAngle)
p1:线条起点
p2:线条终点
points: 集合,包括线条的所有转折点
pointsString:字符串,线条所有转折点的经纬度数据,数据用逗号隔开,奇数位置为经度,偶数位置为纬度
arrowLength:可选参数,箭头长度,默认为8
arrowAngle:可选参数,箭头夹角,默认为30
例如:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
VectorLayer = map.Layers(1)
layer.Items.Clear()
'清除矢量层已经绘制的内容
Dim
cities
As
New
Dictionary(Of
String,
GeoPoint)
cities.Add("北京",
New
GeoPoint(116.4053, 39.905))
cities.Add("上海",
New
GeoPoint(121.4726, 31.2317))
cities.Add("广州",
New
GeoPoint(113.2806, 23.1252))
cities.Add("成都",
New
GeoPoint(104.0657, 30.6595))
cities.Add("郑州",
New
GeoPoint(113.6654, 34.758))
'绘制带箭头的直线
Dim
line
As
VectorPolyline = map.CreateLineWithArrow(cities("北京"),
cities("广州"),
6, 30)
line.Style.Stroke.Color = Color.Red
line.Style.Stroke.Width = 2
layer.Items.Add(line)
'绘制带箭头的折线
line = map.CreateLineWithArrow({cities("成都"),
cities("郑州"),
cities("上海")},
6, 30)
line.Style.Stroke.Color = Color.BlueViolet
line.Style.Stroke.Width = 2
layer.Items.Add(line)
'基于字符形式的经纬数数据绘制带箭头的折线
Dim
lineString
As
String
=
"109.8404,40.6582,109.9903,39.8172,109.7412,38.2902,109.4908,36.5965,"
&
"108.9796,34.9166,108.948,34.2632,109.0293,32.6903,107.5023,31.2095,106.505,29.5332,109.7383,28.3148,"
&
"109.9782,27.5501,111.4692,27.2378,111.608,26.4345,110.2991,25.2742,111.5521,24.4141,112.4725,"
&
"23.0515,112.0444,22.9298,110.9192,21.6598"
line = map.CreateLineWithArrow(lineString, 6, 30)
line.Style.Stroke.Color = Color.Blue
line.Style.Stroke.Width = 2
layer.Items.Add(line)
