3S基础知识:VB中利用MapX创建用户定制工具
随着地理信息系统的发展,国内外已出现了不少GIS(地理信息系统)软件,其中MapX是MapInfo公司的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而MapX4.0支持绝大多数标准的可视化开发环境,如:VisualBasic,Delphi,PowerBuilder,VisualC++等面向对象语言,而且可以使用Lotus Script将MapX4.0嵌入到Lotus Notes中。
虽然MapX4.0提供了许多标准工具,可以直接使用,但是很多情况下,这些标准工具不能满足实际的需要,这就要求通过定制地图工具来规定工具能完成何种功能,例如画椭圆工具,标尺工具(测线段长度)等等。下面,笔者就通过一具体实例来介绍一下VB中采用MapX4.0控件制作地图的定制工具。
2.VB环境下MapX编程
利用MapX4.0创建用户定制工具分为以下三步:
2.1 创建定制工具
本例创建的是画椭圆工具。首先,宣称全局常量miAddEllipseTool = 1,1就代表了画椭圆这个工具。然后,在主窗体中创建画椭圆工具。
关键方法(创建定制工具):
OBJECT.CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor] , [CtrlCursor], [InfoTips])
OBJECT(对象):Map对象;
ToolNumber(工具号)是创建出代表画椭圆工具的miAddEllipseTool;
Type(类型):描述了工具的行为,这个参数取的ToolTypeConstants(工具类型常量)值。本例,工具是按下鼠标左键到弹上鼠标左键的过程中画椭圆。本例中取的是miToolTypePoint;
Cursor(指针形状):使用该工具时,该工具在地图上显示的形状,该参数从CursorConstants(指针常量)中取值。本例选用的是miCrossCursor,那么当选择该工具时,该工具将在地图上显示成十字叉形状;
ShiftCursor ,CtrlCursor:这两个参数是可选的,缺省情况时,SHIFT键和CTRL键不起作用;
InfoTips(工具提示): Boolean型。 如果要显示工具提示,需要将此参数设为true;缺省值为false。
实际编码:
Public Const miAddEllipseTool = 1 '定制的加椭圆工具
Public RectX1 As Double '新加椭圆(所需的矩形)的点1的X(经纬度)坐标
Public RectY1 As Double '新加椭圆(所需的矩形)的点1的Y(经纬度)坐标
Public RectX2 As Double '新加椭圆(所需的矩形)的点2的X(经纬度)坐标
Public RectY2 As Double '新加椭圆(所需的矩形)的点2的Y(经纬度)坐标
Private Sub Form_Load() '创建定制工具
Map1.CreateCustomTool miAddEllipseTool, _
miToolTypePoint, miCrossCursor
End Sub
此时所创建的工具没有任何功能,要工具具备相应的功能由第二步实现。
2.2编写工具句柄 (工具具备什么功能)。
当按下鼠标左键时,需要记下椭圆的起始位置;当鼠标右键弹上时,需要记下椭圆的结束位置,这时,画出椭圆。椭圆将以这两点为矩形的对角线在矩形框中绘制椭圆。需要特别注意的是,MapX4.0中使用的坐标系统是经/纬度系统,而MouseDOwn,MouseUp事件中的坐标是屏幕坐标,因此,需要将屏幕坐标转化为经/纬度坐标,所画椭圆才能显示在正确的位置上。
关键方法(绘制椭圆):
OBJECT.CreateEllipticalRegion(Rectangle,[Angle] , [Resolution] , [Style] )
OBJECT:FeatureFactory对象;
Rectangle(矩形):Rectangle对象,确定了椭圆的大小;
Angle(角度):变量,决定椭圆绕中心点旋转的角度;
Resolution(精度) :变量, 椭圆的精度,由多少点构成;
Style(样式): 变量,定义了所画椭圆的样式,如颜色,线型等。
实际编码:
Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton And (Map1.CurrentTool = miAddEllipseTool) Then
Map1.NumericCoordSys.Set miLongLat, 0
'将屏幕坐标转变为经纬度坐标
Map1.ConvertCoord X, Y, RectX1, RectY1, miScreenToMap
End if
End Sub
Private Sub Map1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton And (Map1.CurrentTool = miAddEllipseTool) Then
'将地图的坐标系统设为经/纬度坐标
Map1.NumericCoordSys.Set miLongLat, 0
'将屏幕坐标转变为经纬度坐标
Map1.ConvertCoord X, Y, RectX2, RectY2, miScreenToMap
'鼠标弹起时,画椭圆
Call AddEllipse(form1,RectX1,RectY1,RectX2,RectY2)
Endif
End sub
'画椭圆过程
Public Sub AddEllipse(frm As Form, x1 As Double, _
y1 As Double,x2 As Double,y2 As Double, EditLayer As Variant)
Dim RECT As New MapXLib.Rectangle '画椭圆的矩形框
Dim CreatedEllipse As Feature '所画的椭圆
Dim I as integer,EditLayer as integer
'设置画椭圆的矩形框
RECT.Set x1, y1, x2, y2
With frm.Map1
'创建椭圆
Set CreatedEllipse = .FeatureFactory. _
CreateEllipticalRegion(RECT, , 500, .DefaultStyle)
'确定哪一层是可编辑层,椭圆只能画在可编辑层上
For I=1 to .map1.layers.count
If .map1.layers(I).editable=true then
Editlayer=I
Exit for
Endif
Next I
'将椭圆添加到所画的图层上
.Layers.Item(EditLayer).AddFeature CreatedEllipse
End With
End Sub
此时,画椭圆工具具备了画椭圆的功能,运用定制的这个工具由第三步实现。
2.3调用定制工具
'设置当前工具为定制的画椭圆工具
Map1.CurrentTool=miAddEllipse
或 Map1.currenttool=1
3. 结束语
本例画椭圆时,从鼠标按下,一直到鼠标最后弹起时才可以看到椭圆出现在地图上,这就是说在鼠标移动(MouseMove事件)时,从鼠标按下,到鼠标弹起的中间过程是看不到中间过程的椭圆出现的。为了实现在鼠标移动时,也可以看到椭圆,那么需要在MouseMove事件中画椭圆,并且,每次画椭圆时删除掉前一次画的椭圆。这样的运行结果就是看到,从鼠标按下,到鼠标弹起的过程中,随鼠标的移动而有了绘椭圆的变化过程。
另外,本文是以VB5为例,进行的编程,但对于其它语言,如VC++,Delphi等,编程思路和关键方法都是相同的。
3S基础知识:VB中利用MapX创建用户定制工具相关推荐
- 3S基础知识:VC6.0+MapX编程总结
一.MapX的帮助 MapX的官方帮助文档是<MapX在线帮助>. 个人认为,这套文档过于简单,系统性偏差,与ArcEngine的帮助文档不可比.很多MapX的开发技巧在<MapX在 ...
- VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB.net小技巧--VB中利用TreeView控件和Box控件做知识备忘 这里不涉及代码的展示,主要是为了阐述一种做笔记的思想. 为 ...
- iptables的基础知识-iptables中的状态检测
2019独角兽企业重金招聘Python工程师标准>>> iptables的基础知识-iptables中的状态检测:iptabels被认为是Linux中实现包过滤功能的第四代应用程序. ...
- geoip php 获取城市,Laravel 中利用 GeoIP 获取用户地理位置信息
这篇文章主要介绍了关于Laravel 中利用 GeoIP 获取用户地理位置信息,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 我最近需要一个用户地域检测来设置用户的默认区域和货币.由 ...
- 在Linux系统的命令行中为MySQL创建用户的方法
这篇文章主要介绍了在Linux系统的命令行中为MySQL创建用户的方法,包括对所建用户的权限管理,需要的朋友可以参考下 要访问一个MySQL服务器,你需要使用一个用户帐号登录其中方可进行.每个MySQ ...
- 计算机专业基础知识(中)
大纲 分专题讲解 4. 操作系统的基本概念.功能.组成及分类 概念理解 主要功能 组成和分类 主流的操作系统 推荐书籍和课程 5. Windows 操作系统的基本概念和常用术语,文件.文件夹.库等 W ...
- 安徽高二计算机vb基础知识,vb计算机考试_安徽文师良心产品
vb计算机考试,安徽文师良心产品,关于举办第78期国际注册对外汉语教师*****班的通知:有关大.中.小学在职教师及大学生:为响应**中央***报告中关于"推进国际传播能力建设,讲好中国故事 ...
- IOS基础学习日志(七)利用dispatch_once创建单例及使用
自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行. ...
- java添加窗体中_java中利用JFrame创建窗体 【转】
Java代码 publicclassTest(){ publicstaticvoidmain(String[] args){ JFrame frame = newJFrame(); JPanel pa ...
- 损耗的基础知识(中)
书接前文,讲了损耗的基础知识,还有相关损耗方面的知识需要补充. 1.衰减 当信号沿传输线传播时,损耗对信号的主要影响就是使信号幅度衰减. 关于衰减,记住下面的公式 若功率加倍,则分贝值变化为10log ...
最新文章
- HDD工作原理 导图
- 黑裙安装linux环境,Linux学习笔记(一) ---- 安装Linux系统
- Python执行pyinstaller打包生成的exe文件实战
- 【Python】import pandas时,报错 pandas Missing required dependencies ['numpy'] 原因分析
- Windows Server 笔记之网络负载平衡(NLB)和服务质量(QoS)简介
- mysql查询连续3个月以上_MySQL查询显示连续的结果
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
- 打破双亲委派机制有什么用_被打破的双亲委托机制
- MHA环境搭建【4】manager相关依赖的解决
- 星河经纬加入会员可靠吗_星河湾外墙防水补漏 星河湾外墙防水补漏公司 星河湾外墙防水补漏师傅 星河湾外墙防水补漏施工队电话...
- mysql 设置密码
- 大数据平台技术可以提供哪些服务
- Apollo中Eureka,metaService,configService关系
- 易语言查询Windows API之网络函数消息函数
- 周边pd是什么意思_pd是什么意思 饭圈pd是什么意思
- Hybrid Astar 算法剖析和实现(五)
- Vue 做调查问卷简单实例
- UDP重传,似牛非马。。。
- netty 引用计数对象(reference counted objects)
- 可以买到 Linux 电脑的 10 个地方