绘制非标形状

本节内容可以参考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)


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