MapX 与MapInfo 二次开发的重点
2020-01-20 · 技术研发知识服务融合发展。
( 1) 图层控制
1) 图层显示。对图层控制功能主要是图层显示、空间图层即 map1. layers. item ( i)对象,是图元空间数据的集合,具有以下几个重要属性:
· Visible,设置图层是否可见;
·Selectable,设置图层上的图元是否可选择;
·Editable,设置是否可编辑;
·AutoLabel,设置是否自动标注出图元的名称。
每个属性的值都为布尔型,即 True 或者 False。图层的 Selectable 属性设置为 False时,通过选择工具将不能选择该图层上的图元,在进行图层编辑时,可以将欲编辑的图层设置为 Selectable = True,Editable = True,然后将其他的图层设置为 Selectable = False,Ed-itable = False,以起到数据保护的作用 ( 王瑞珍,2004) 。图层控制界面如图 7. 6 所示。
图 7. 6 图层控制界面
2) 向空间数据库中动态添加数据。在 MapX 中,通过代码,可在地图上指定坐标点,添加自定义图形数据,如此一来,数据的精度可以得到很好的保证,可以在图中实现图中图功能。如下代码可以实现:
Dim ftr As MapXLib. Feature
Dim ftrs As MapXLib. Features
Dim rctMap As MapXLib. Rectangle
Dim pnts As New MapXLib. Points
Dim pnt1 As New MapXLib. Point
Dim pnt2 As New MapXLib. Point
Dim pnt3 As New MapXLib. Point
Dim pnt4 As New MapXLib. Point
Set rctMap = frmmain. Map1. Bounds
pnt1. Set rctMap. XMin,rctMap. YMax
pnt2. Set rctMap. XMax,rctMap. YMax
pnt3. Set rctMap. XMax,rctMap. YMin
pnt4. Set rctMap. XMin,rctMap. YMin
pnts. Add pnt1
pnts. Add pnt2
pnts. Add pnt3
pnts. Add pnt4
pnts. Add pnt1
Set ftr = Map1. FeatureFactory. CreateLine( pnts,styLine)
Set Map1. Layers. InsertionLayer = Map1. Layers. Item( " eagle" )
Map1. Layers. Item( " eagle" ) . AddFeature ftr
Map1. Refresh
3) 更新属性库。首先,需要根据图元 ( 空间数据) 来找到属性库中对应的记录,并在窗体中列出,与用户交互,具体代码实现如下:
Dim ftr As MapXLib. Feature
Set ftr = Map1. Layers( i) . Selection. Item( 1)
Dim mydata As MapXLib. Dataset
Set mydata = Map1. DataSets. Add( miDataSetLayer,lyr)
For j = 1 To mydata. Fields. Count
If VarType( mydata. RowValues( ftr. FeatureID) . Item( j) . value) < > vbNull Then
Grid1. TextMatrix( j + 1,1) = mydata. RowValues( ftr. FeatureID) . Item( j) . value
End If
Next j
当对属性值做了修改,需要更新到属性库时,则可通过如下代码实现:
ftr. Layer. KeyField = Grid1. TextMatrix( i + 1,0)
ftr. KeyValue = Grid1. TextMatrix( i + 1,1)
ftr. Update
4) 实现对空间数据的复制粘贴。空间对象不同于普通的文本或文件等数据,所以复制粘贴也有其特殊性,通过选择工具选择了一个或多个图元后,将其复制到粘贴板上时,需要通过中间对象暂时存储,实现代码如下:
将空间对象存储在 oExchangeFtrs 中,当需要粘贴时,则将 oExchangeFtrs 中的对象添加到空间库和属性库中,实现代码如下:
If m_oExchangeFtrs Is Nothing Then Exit Sub
For Each oFtr In m_oExchangeFtrs
iFtrCount = iFtrCount + 1
Next oFtr
If iFtrCount = 0 Then Exit Sub
For Each oFtr In m_oExchangeFtrs
oLayer. Selection. Add oLayer. AddFeature( oFtr)
Next oFtr
oLayer. Refresh
Set m_oExchangeFtrs = oLayer. Selection
( 2) 基本功能
本系统中实现的功能有选择、漫游、放大、缩小、标注、直尺、链接、框选、编辑地图、打印地图、报表、存为图片等。这些功能将通过 MapX 自带的工具来完成。本系统用到了如下工具: miAddLineTool: 新增值线图元; miAddPointTool: 新增点图元; miAddRe-gionTool: 新增面图元; miArrowTool: 箭头,将鼠标形状设置为 default; miLabelTool: 为鼠标下方图元添加标注; miPanTool: 在地图上漫游; miPolygonSelectTool: 通过多边形在地图上选择图元; miRadiusSelectTool: 通过椭圆在地图上选择图元; miRectSelectTool: 通过矩形框在地图上选择图元; miSelectTool: 通过点击在地图上选择图元; miSymbolTool:在地图上添加符号注释; miTextTool: 在地图上添加文字注释; miZoomInTool: 放大;miZoomOutTool: 缩小。
对于没有提供工具的直尺测量功能,可以通过以下方式建立接口来实现测量功能:
Sub CreateCustomTool ( ToolNumber As Integer,Type As Tool Type Constants,Cursor,[ShiftCursor],[CtrlCursor],[bInfoTips]) Member of MapXLib. Map Map1. CreateCustomTool CUSTOM_ TOOL_ RULE,miToolTypeLine,miCrossCursor,然后再记录鼠标的移动距离,在地图的 map1_ MouseMove 事件中通过 Map1. Distance 方法将屏幕坐标转换为地理坐标即可实现测量功能。
热链接功能实现可以使用这种方式: 在地图的 MouseMove 事件中通过 Map1. Layers.Item ( 1) . SearchWithinDistance 方法来不断地搜索,查看地物的属性库中是否链接了文件,如果查找到,则鼠标变形提示。图 7. 7 显示的是地图中所用到的功能及对应的图标。
( 3) 地图颜色显示
为了实现评价结果直观可视化,各作业场所的评价结果将依据风险分级原则进行颜色显示。在 MapInfo 中颜色显示是调用 mbapplications 来实现的,图7. 8 是颜色方案及颜色显示示意图。以下代码运用 mbapplications 的 do 方法,实现改变当前选中地图对象的颜色:
图 7. 7 地图处理基本功能及对应图标
图 7 -8 风险可视化示意图
/ / 要求将当前指定地图对象的颜色改为蓝色
mbappoleobject. do( " blue" )
mapinfo 将自动调用 remotemsghandler( ) 过程:
sub remotemsghandler( )
dim myobject as object
”获取并分析 do 方法的参数
cmdinfostr = commandinfo( cmd_info_msg)
”改变地图对象的颜色
if cmdstr = " blue" then
myobject = selection. obj
alter object myobject info 2,makecustomsymbol ( " towe1 - 32. bmp" ,rgb( 0,0,255) ,18,2)
update selection set obj = myobject where rowid = 1
end if
end sub
mbapplications 的 eval 方法的调用与 do 方法的类似, 只不过 mapinfo 将自动调用remotequeryhandler ( ) 过程,并要求返回一个结果。