MapObject学习笔记-第三讲 图层标注、图层控制和电子地图常用工具开发(添加经过修正与VS2005兼容的Legend控件下载)

第三讲 图层标注、图层控制和电子地图常用工具开发


一、图层标注

利用MO的标注对象LabelRenderer,可以自动添加图层上对象的标注。

1、属性标注

属性标注的方法为:

Set layer.Renderer = New LabelRenderer '设置标注对象

layer.Renderer.Field = "CNTRY_NAME" '指定要显示的字段

layer.Renderer.AllowDuplicates = True '允许标注重复

标注语句要加在图层添加语句:Map1.Layers.Add layer的前面。

几点说明:

RendererMapLayer的属性之一,用于设置或读取图层的着色对象。

着色对象有ClassBreaksRenderer对象,DotDensityRenderer对象,LabelRenderer对象和ValueMapRenderer对象。

其中,LabelRenderer对象描述一种表示地理特征的方法,即在一个地理特征上写字符。显示在地理特征的字符值来自一个字段的值,Field属性表示该字段的名字。AllowDuplicates属性是一个布尔值,表示是否允许在标注处多次标注同样的字符,True为允许,false为不允许。

2、设置图上字体

以上的标注是按照缺省的方式来设置的字体,还可以利用标注对象的Symbol数组,来自己动手设置更合适的字体属性。

layer.Renderer.Symbol(0).Font.Name = "隶书"

layer.Renderer.Symbol(0).Font.Bold = False

layer.Renderer.Symbol(0).Color = moRed

layer.Renderer.Symbol(0).Font.Size = 20

以上设置的字体是固定大小,不随着图形大小的改变而改变。

layer.Renderer.Symbol(0).Height = 10

这时Height设置有优先设置权,Font.BoldFont.Size将不起作用。

二、图层控制

1、利用check控件控制图层的显示和文字标注

用程序添加图层时,系统会自动设置图层对象的序号,最后添加的为图层0,其上为图层1,依次类推。

Option Explicit

Dim dc As New DataConnection

Dim layer As MapLayer

 

Private Sub Check3_Click()

  Set layer = Map1.Layers(2)

  If Check3.Value = 0 Then

    layer.Visible = False

  Else

    layer.Visible = True

  End If

  Map1.Refresh

End Sub

 

Private Sub Check2_Click()

  Set layer = Map1.Layers(1)

  If Check2.Value = 0 Then

    layer.Visible = False

  Else

    layer.Visible = True

  End If

  Map1.Refresh

End Sub

 

Private Sub Check1_Click()

  Set layer = Map1.Layers(0)

  If Check1.Value = 0 Then

    layer.Visible = False

  Else

    layer.Visible = True

  End If

  Map1.Refresh

End Sub

 

Private Sub Check4_Click()

  Set layer = Map1.Layers(0)

  Set layer.Renderer = New LabelRenderer

  If Check4.Value = 0 Then

    layer.Renderer.AllowDuplicates = False

  Else

    Call Layer0Render(layer)

  End If

  Map1.Refresh

End Sub

 

Private Sub Layer0Render(layer1 As MapLayer) '重复设置LabelRenderer对象的过程

  Set layer1.Renderer = New LabelRenderer

  layer1.Renderer.Field = "NAME"      '指定要显示的字段

  'layer1.Renderer.Symbol(0).Font.Name = "Times New Roman"

  layer1.Renderer.Symbol(0).Font.Bold = False     '缺省为True

  layer1.Renderer.Symbol(0).Color = moBlack

  layer1.Renderer.Symbol(0).Font.Size = 8

  layer1.Renderer.AllowDuplicates = True

End Sub

 

Private Sub LayerSet()

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("states")

  layer.Symbol.Color = moYellow

  layer.Symbol.Size = 1

  'layer.Symbol.Style = 2

  layer.Symbol.OutlineColor = moBrown

  Map1.Layers.Add layer

 

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("roads")

  layer.Symbol.Color = moDarkGreen

  layer.Symbol.Size = 2

  Map1.Layers.Add layer

 

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("Cities")

  layer.Symbol.Color = moRed

  layer.Symbol.Size = 4

  layer.Symbol.Style = 0

  Call Layer0Render(layer)

  Map1.Layers.Add layer

End Sub

 

Private Sub Form_Load()

  dc.Database = "F:\MO实验\USA"

  If Not dc.Connect Then

    MsgBox "在指定的文件夹下没找到图层数据文件!"

    End

  End If

  LayerSet

  Map1.Refresh

End Sub

几点说明:

Layers对象的属性只有一个,即count。这个值表示Layers集合当前具有多少个图层,如果这个值为-1,说明图层不确定。

Call 语句,将控制权转移到一个 Sub 过程,Function 过程。如:Call Layer0Render(layer),调用Layer0Render(layer)过程。

2、使用Legend控件

使用Legend组件,可以调用图层控制功能。添加Legend控件后Form_Load过程中写入:legend1.setMapSource Map1legend1.LoadLegend True,再添加AfterSetLayerVisible过程,Map1.Refresh,可以在取消和添加图层后刷新。

运行程序后,可以看见Legend控件不仅可以自动标上图层名称,而且可以上下拖动,改变加载的顺序。加上legend1.EnableDragDrop = False可以取消图层拖动的功能,还可以在Legend控件的属性框中设置字体,backcolorforecolor等。另外在Legend上不能控制图层的标注,但可以多加载一个显示标注的图层的迂回方法,就可以实现控制图层标注的目的。示例代码如下:

Option Explicit

Dim dc As New DataConnection

Dim layer As MapLayer

 

Private Sub legend1_AfterSetLayerVisible(index As Integer, isVisible As Boolean)

  Map1.Refresh

End Sub

 

Private Sub LayerSet()

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("区县")

  layer.Symbol.Color = moOrange

  layer.Symbol.Size = 1

  layer.Symbol.Style = 9

  layer.Symbol.OutlineColor = moBrown

  layer.Name = "行政区"

  Map1.Layers.Add layer

 

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("河流1")

  layer.Symbol.Color = moDarkGreen

  layer.Symbol.Size = 2

  layer.Name = "河流"

  Map1.Layers.Add layer

 

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("测站")

  layer.Symbol.Color = moRed

  layer.Symbol.Size = 3

  layer.Symbol.Style = 0

  layer.Name = "测站"

 

  Set layer.Renderer = New LabelRenderer

  layer.Renderer.Field = "NAME"      '指定要显示的字段

  'layer.Renderer.Symbol(0).Font.Name = "幼圆"

  'layer.Renderer.Symbol(0).Font.Bold = False     '缺省为True

  layer.Renderer.Symbol(0).Color = moBlack

  layer.Renderer.Symbol(0).Font.Size = 8

  layer.Renderer.AllowDuplicates = True

  Map1.Layers.Add layer

End Sub

 

Private Sub Form_Load()

  dc.Database = App.Path + "\..\" + "beijing"

  If Not dc.Connect Then

    MsgBox "在指定的文件夹下没找到图层数据文件!"

    End

  End If

  LayerSet

 

  legend1.setMapSource Map1

  legend1.LoadLegend True

  Map1.Refresh

End Sub

三、电子地图常用工具开发

电子地图常用工具开发和方法包括指示图(locator map)、比例尺(scalebar)和状态栏(statusbar)、打印功能的设置、鼠标提示(tip text)的设置以及查看属性设置等。

1、使用指示图(即鹰眼功能)之添加指示窗口

一般电子地图系统在主窗口的附近有一个指示图,指示图用显著颜色的方框显示目前主窗口在全图的位置,并可以拖动方框或其他方式,在全图中迅速定位。

 

示例代码如下:

Option Explicit

Dim dc As New DataConnection

Dim layer As MapLayer

 

Private Sub Form_Load()

  dc.Database = App.Path + "\..\" + "world"

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("country")

  layer.Symbol.Color = moYellow

  layer.Symbol.Size = 1

  'layer.Symbol.Style = 2

  layer.Symbol.OutlineColor = moBrown

  Map1.Layers.Add layer

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("Cities")

  layer.Symbol.Color = moRed

  layer.Symbol.Size = 4

  layer.Symbol.Style = 0

  Map1.Layers.Add layer

  Set layer = New MapLayer

  Set layer.GeoDataset = dc.FindGeoDataset("country")

  layer.Symbol.Color = moPaleYellow

  Map2.Layers.Add layer

  Map2.Refresh

End Sub

'使Map1Map2联动,利用AfterLayerDraw事件函数来实现,此方法表示当Map1画完开始执行的事件代码。

Private Sub Map1_AfterLayerDraw(ByVal index As Integer, ByVal canceled As Boolean, ByVal hDC As stdole.OLE_HANDLE)

If index = 1 Then     '代表加载的图层索引号

Map2.TrackingLayer.Refresh True  ' TrackingLayer对象是Map控件中的一个特殊层,它描绘位置可以动态改变的地理目标。Refresh是其的一个函数,用来强制刷新新的TrackingLayer对象,此值是一个布尔值。

End If

End Sub

 

Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = vbLeftButton Then

Set Map1.Extent = Map1.TrackRectangle

ElseIf Button = vbRightButton Then

Map1.Pan

End If

End Sub

 

'Map2上画红色指示框。此处使用Map控件的AfterTrackingLayerDraw事件,表示当控件完成所有TrackingLayer的地理图层对象的更新后自动进入的函数代码。

Private Sub Map2_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)

Dim sym As New Symbol

sym.OutlineColor = moRed

sym.Size = 2

sym.Style = moTransparentFill

Map2.DrawShape Map1.Extent, sym  '在图上画图形特征,这个函数只是在图形刷新事件中调用(例如AfterTrackingLayerDrawAfterLayerDraw),语法为object.DrawShape shape, symbol),shape表示一个几何形状或图形特征选集(Point, Points, Line, Rectangle, Polygon or Ellipse)symbol表示一个符号对象变量。

 

End Sub

 

 

 

 

经过修正与VS2005兼容的Legend控件下载

经过修正与VS2005兼容的Legend控件下载

posted @ 2007-05-22 16:35 GIS云中飞鹏 阅读(1975) 评论(53)  编辑 收藏 所属分类: MapObject开发

  回复  引用  查看    
#1楼 2007-07-23 23:31 | 雪梨飞鱼      
1. 在 VB.Net中,MO的Color值是怎么表示的? 如:
moGreen
RGB(255,255,113)

2. 怎么取消图层标注?

3. 在哪可以加上Legend控件?
  回复  引用  查看    
#2楼 2007-07-23 23:48 | 雪梨飞鱼      
4. 在 VB.Net中,MO的moTransparentFill值是怎么表示的?
  回复  引用    
#3楼 2007-07-24 09:40 | GIS云中飞鹏 [未注册用户]
颜色好像都可以吧,这种问题自己试试不就行了!

Legend scale 控件与vs2005 不兼容的!


  回复  引用  查看    
#4楼 2007-07-24 11:35 | 雪梨飞鱼      
Sorry. 问题可能对你太初级了。请问有没有.NET的MO的函数手册常数说明或中文使用手册?我可以自己看。

我现在用的是:
MS-WindowsXP(中文),
MO2.3(英文),MO2.4还没有找到,
MapGIS正在下载,过2天就可以用了。
MS-VS2001, VS2005已经找到了还没有安装。
  回复  引用    
#5楼 2007-07-24 16:18 | GIS云中飞鹏 [未注册用户]
严格来说 legend sclae 控件不属于mo 原装的控件!属于第三方控件!

不过我这里有个经过修改的legend 与vs兼容的!

可以给我留邮箱我发给你!
  回复  引用    
#6楼 2007-07-24 16:19 | GIS云中飞鹏 [未注册用户]
mo 与。net的问题可以看看这片文章
http://www.cnblogs.com/gispeng/archive/2007/04/18/718347.html
  回复  引用  查看    
#7楼 2007-07-24 23:19 | 雪梨飞鱼      
这篇文章正是MO与.NET,立杆见影的解决了眼下的问题。THX.
我的EMAIL:alanding2006@yahoo.com
  回复  引用  查看    
#8楼 [楼主]2007-07-25 12:54 | GIS云中飞鹏      
Legend.ocx已发送请查收!
  回复  引用  查看    
#9楼 2007-07-25 23:08 | 雪梨飞鱼      
已经收到Legend.ocx了,而且其功能也使用了。多谢。
本章已经学习完成!只是还有一个问题:怎么取消图层标注?我已经把layer.Renderer.Symbol显示在地图上了,可以怎么关闭它?请教。
  回复  引用    
#10楼 2007-07-26 08:21 | GIS云中飞鹏 [未注册用户]
关闭标注我还真没做过!你查查开发文档里有没有这方面的例子?!
  回复  引用    
#11楼 2007-07-28 15:53 | yyding [未注册用户]
我也想要一个Legend.ocx,能发我一个吗,谢谢
  回复  引用    
#12楼 2007-07-28 15:56 | yyding [未注册用户]
scalebar是不是也是第三方的阿,我的邮箱oranger831119@yahoo.com.cn
  回复  引用    
#13楼 2007-07-30 08:36 | GIS云中飞鹏 [未注册用户]
scalebar也属于第三方!
  回复  引用  查看    
#14楼 [楼主]2007-07-30 08:40 | GIS云中飞鹏      
已发送请查收!
  回复  引用    
#15楼 2007-08-06 16:36 | 饕餮行者 [未注册用户]
我用的是VB.net2003,能否给我发一个跟.net1.1兼容的Legend控件?谢谢!
另外,sclae 控件是用来做什么的?
My e-mail: ouyang_mcu@qq.com
  回复  引用    
#16楼 2007-08-06 16:48 | GIS云中飞鹏 [未注册用户]
sclae bar 是比例尺控件啊

legend已发送 请查收
  回复  引用    
#17楼 2007-08-06 16:57 | 饕餮行者 [未注册用户]
收到,谢谢!:)
我琢磨琢磨怎么用,呵呵。
  回复  引用    
#18楼 2007-08-06 21:17 | 饕餮行者 [未注册用户]
英雄,这个legend控件,我怎么用呀?是不是要把那个SampleLegend.ocx文件拷贝到C:\Windows\System32,然后再regsvr32 SampleLegend.ocx

  回复  引用    
#19楼 2007-08-07 10:12 | GIS云中飞鹏 [未注册用户]
可以 或者直接从选择项中(vs2005环境)添加也行!
  回复  引用    
#20楼 2007-08-28 11:33 | ytt [未注册用户]
楼主 可以给我发一个legend.ocx吗?
谢谢啦
我的邮箱是sky.ytt@163.com
  回复  引用    
#21楼 2007-08-28 11:45 | ytt [未注册用户]
顺便也发个 scalebar 给我吧
谢谢楼主啦 :)
  回复  引用    
#22楼 2007-08-28 15:00 | GIS云中飞鹏 [未注册用户]
legend已发送 没有scalebar
  回复  引用    
#23楼 2007-09-14 08:55 | 刘云 [未注册用户]
兄弟 给我一份吧 我正在苦苦的寻找ing。
ipconfig@foxmail.com
  回复  引用    
#24楼 2007-09-14 09:00 | 刘云 [未注册用户]
英雄啊,补充一下,legend 和 scalebar 我都要啊,呵呵。
  回复  引用    
#25楼 2007-09-14 11:48 | 云中飞鹏 [未注册用户]
@刘云
已经发送请查收另:自由legend的没有scale的!
  回复  引用    
#26楼 2007-09-14 15:26 | 刘云 [未注册用户]
飞鹏 你好 legend已经收到,多谢。多谢。多交流,以前我用过一段时间mo是利用vb开发的。现在打算重新用mo做一个程序,好多都已经陌生了,sign。
  回复  引用    
#27楼 2007-09-24 16:30 | 刘云 [未注册用户]
还有个问题需要请教一下各位,我的是mo2.4+vb.net2005,现在碰到的问题是我把legend控件添加上来了,但是却不能和axmap联系到一起。55555
请高人出手啊~~~
ipconfig@foxmail.com
  回复  引用  查看    
#28楼 [楼主]2007-09-25 08:14 | GIS云中飞鹏      
你想怎么联系在一起!

是我给你的那个lengend吗?!

根以前的使用方法一样啊!查看前面相关图层控制的教程!
  回复  引用    
#29楼 2007-12-10 15:54 | Dan [未注册用户]
好文章 太感谢了
请问可以发我legend控件吗 谢谢
bomb-dancer@hotmail.com
再次感谢
  回复  引用  查看    
#30楼 [楼主]2007-12-10 16:32 | GIS云中飞鹏      
hotmail的邮箱不知道能不能收到阿!

给你发一下试试吧!
  回复  引用    
#31楼 2008-01-28 17:21 | onlykey [未注册用户]
请问楼主 为什么我加载legend 后 显示有图层的数量(列表中有打勾的方框),却没有图层的名称,我给图层名称了啊。
然后点击复选框时报错 450 不知道什么原因。
谢谢楼主帮我分析一下,另外能给我发一份legend吗? 万分感谢
我的邮箱 onlykey@163.com
  回复  引用  查看    
#32楼 [楼主]2008-01-29 08:27 | GIS云中飞鹏      
.net环境legend是不兼容的!

我给你发一个修改过的legend吧!
  回复  引用  查看    
#33楼 [楼主]2008-01-29 08:29 | GIS云中飞鹏      
@onlykey
已发送查收!
  回复  引用    
#34楼 2008-01-29 09:37 | onlykey [未注册用户]
邮件收到了 谢谢 感激!
  回复  引用    
#35楼 2008-01-31 16:00 | ying [未注册用户]
帮我发一个,
.net环境legend是不兼容的! 谢谢!
liaoying265@yahoo.com
  回复  引用    
#36楼 2008-01-31 16:02 | ying [未注册用户]
帮我发一个,
.net环境legend兼容的!修改过的legend吧! 谢谢!
liaoying265@yahoo.com.cn

  回复  引用  查看    
#37楼 [楼主]2008-02-01 14:20 | GIS云中飞鹏      
@ying
已发送请查收!
  回复  引用    
#38楼 2008-04-16 15:16 | yangzi612312 [未注册用户]
你好,可以发一份legend sclae 控件给我吗?谢谢!

  回复  引用  查看    
#39楼 [楼主]2008-04-17 07:57 | GIS云中飞鹏      
@yangzi612312
已发送请查收
  回复  引用    
#40楼 2008-04-28 16:53 | 幽谷百合 [未注册用户]
因为图层太多,legend显示不全,所以我想在legend里面加一个垂直滚动条,请问应该怎么编写
  回复  引用    
#41楼 2008-05-07 14:36 | luckdwj [未注册用户]
麻烦给我发一个legend.OCX.
Luckdwj@163.com
谢谢!
  回复  引用  查看    
#42楼 [楼主]2008-05-07 16:08 | GIS云中飞鹏      
已发送查收
  回复  引用    
#43楼 2008-05-08 13:47 | 124535dde [未注册用户]
--引用--------------------------------------------------
幽谷百合: 因为图层太多,legend不能把所有的图层名称都显示出来,所以我想在legend里面加一个垂直滚动条,请问VB6.0应该怎么编写
.谢谢,我急用--------------------------------------------------------minjieh0606@163.com

  回复  引用    
#44楼 2008-06-19 11:36 | 苦苦的挣扎 [未注册用户]
delphi中如何加载legend控件
以前加载成功过,重装系统后再加载就不行了

  回复  引用    
#45楼 2008-07-01 16:51 | zhjy183 [未注册用户]
碰到Legend控件在Net2005中不显示图层名称的问题,请给发一个修改后的控件到我的邮箱,谢谢!!
  回复  引用  查看    
#46楼 [楼主]2008-07-02 09:46 | GIS云中飞鹏      
@zhjy183
已发送请查收!
  回复  引用  查看