Mapinfo中精确输入点、线、面的方法
林国技
(广西基础地理信息中心)
【摘 要】 本文旨在说明在Mapinfo能够实现精确输入点、线、面的方法。
【关键词】 MapBasic 对象 方法
1、引言
目前,地理信息产品软件种类繁多,其中Mapinfo越来越受到国人的青睐,它不仅广泛应用于测绘、土地、水利、城建规划等部门,还广泛应用于商业部门。以其卓越的功能及较小的体积受广大用户使用。但美中之不足就是没有现成的精确输入图形对象的方法。有很多用户感到遗憾。我经过一段时间的摸索,找到了这种方法。现以Mapinfo编程工具MapBasic,简单制作了在Mapinfo中精确输入图形元素的方法,以供对Mapinfo感兴趣的读者。
2、建立界面准备
MapBasic语言中能够用坐标输入地理对象的种类和方法见下表一。
对象 |
方法 |
文本 |
Create Text, CreateText |
点符号 |
CreatePoint, Create Point |
直线 |
CreateLine, Create Line |
圆 |
CreateCircle, |
矩形 |
Create Rect |
圆角矩形 |
Create RoundRect |
弧 |
Create Arc |
椭圆 |
Create Ellipse |
多折线 |
Create Pline |
面域 |
Create Region |
表一

图一
椭圆和矩形的方法分别能生成圆和正方形,因为圆和正方形分别是椭圆和矩形的一个特例。
MapBasic编程工具,麻雀虽小却五脏具全。MapBasic能够生成很好的用户界面,一般常用的控件均有相应的语句生成,表二是能够生成的控件。
控件名称 |
用 途 |
Button/OKButton/CancelButton |
按扭;确定按钮;取消按钮 |
CheckBox |
复式选择 |
EditBox |
编辑文本 |
GroupBox |
分类框架 |
ListBox,MultiListBox |
从列表框中单项选择或多项选择 |
PenPicker/BrushPicker/SymbolPicker/FontPicker |
选择线;填充;点;文本风格 |
RodioGroup |
单选按钮 |
StaticText |
标签文本 |
PopupMenu |
下拉式列表选择 |
表二
虽然MapBasic提供了诸多种控件生成语句,但生成的界面还是不够理想,不尽人意,创建比较麻烦、费时。要想获得更友好的界面,建议用其它可视化高级语言生成对话框界面作为.dll(动态连接库),在Mapbasic中调用。
3、建立程序过程
3.1 对话框的建立
用Dialog语句建立一个用户对话框,Control从句建立一个静态文本,一个文本编辑框,两个命令按钮。详细见程序清单及图一。
3.2 工作原理分析
当用户单击OK按钮时程序处理文本编辑框内用户所输入的数据。编辑框内的数据由于是字符串型,所以必须转换为表示坐标点的实数值。转换方法有两种:其一,用分解字符串法。因为编辑框的内容是存入一个字符串变量中,所以分离出X,Y坐标是一个必要工序。其二,建立一个临时文件作为交换区,把EditBox中的内容写入磁盘,然后再读出。本例用此方法,此法比较简单,程序代码简小,通俗易懂。

程序流程图
3.3 数据格式和输入方法
数据格式要求,X坐标和Y坐标间用逗号分隔。直接输入法如需要换行时用Ctrl+Enter换行。如:
4568.598,5698.365
4575.657,5645.698
4598.247,5605.257
......
只要数据格式相同,数据源可以接受来自电子手簿或其他应用软件。最好用其他文字编辑器按格式输入坐标点后,拷贝到程序文本编辑框即可,避免直接输入失手。
3.4 本程序的优点
本程序代码简小,通俗易懂,不需要读者具有深厚的编程基础。程序界面友好,操作简单明了。输入坐标点数是动态确定的,地图元素生成速度快。能使Mapinfo象AutoCAD一样,实现了精确坐标输入对象的方法。比较适合于地图的局部修测与更新维护等。
3.5 本程序的缺点
本程序虽然较方便地实现了动态输入线对象。但还是存在不足。用户界面是用MapBasic语言生成,比较单调,不能跟其它可视化高级语言相比。能输入的坐标点数有限制性。以上曾提到过,用户是把坐标输入编辑框的,而编辑框数据是存入一个String型变量中,然而变量和EditBox控件容量是有限的。MapBasic中一个EditBox的最大容量为32767个字符,一个String变量最大长度等于32767个字节,假设一个坐标点最长字符串为24个字符算(XY坐标值字节数加一逗号加回车换行符),则32767 / 24约1300个坐标点。即用户一次输入点数不应大于1300个点,一般情况下已满足需要。如果你输入的坐标值位数比较短小,只要到千位数,那么你将可以输入远多于1300个坐标点。为了程序的简明,本例不加入属性的输入和线型及填充图案等代码,同时也不设置错误陷阱。
4、结束语
利用MapBasic编程工具编写精确输入面域对象也很容易,只要把本程序中Create pline into variable myobj 改为Create Region into variable myobj 重新编译即可。对于输入点、圆等其它对象都比较简单,这里不赘述,感兴趣的读者自行编写。
附:程序清单。
Include "MAPBASIC.DEF" '包含mapbasic标准定义
Declare sub main
Sub main
dim val as string
dim dir as string
dim x as float, y as float
dim myobj as object
'生成对话框界面
dialog width 120 height 180 title "精确输入多折线"
control statictext '控件描述
position 16,6 width 90 height 8
ID 1
title "X , Y (Ctrl+Enter换行)"
control edittext
position 16,16 width 90 height 140
ID 2
value ""
into val
control okbutton
control cancelbutton
if commandinfo(CMD_INFO_DLG_OK) then '用户单击OK按钮
dir=TempFileName$( dir ) '返回一个临时文件
open file dir for output as #1 '以写入TEXT控件数据
print #1, val
close file #1
open file dir for input as #1
Set Map XY Units "m" Distance Units "m" Area Units "sq m"
CoordSys NonEarth Units "m" '设置坐标系统和距离单位
'用变量建立一个零个节点的Pline对象
Create pline Into Variable myobj 0
while not eof(1) '循环读入数据构造Pline数据
input #1,x,y
Alter Object myobj
Node Add (x,y)
wend
close file #1
kill dir '删除临时文件
Alter Object myobj '删除最后多余的一个点
Node remove position 1,1
Insert Into my(object) Values (myobj) '插入对象到表名为my的表中
End if
End sub
参考资料:
[1] 王晓武 陈宗敏 杜兴国 MapBasic 程序设计 电子工业出版社
[2] Mapinfo Corporation MapBasic Help Online
|