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按钮时程序处理文本编辑框内用户所输入的数据。编辑框内的数据由于是字符串型,所以必须转换为表示坐标点的实数值。转换方法有两种:其一,用分解字符串法。因为编辑框的内容是存入一个字符串变量中,所以分离出XY坐标是一个必要工序。其二,建立一个临时文件作为交换区,把EditBox中的内容写入磁盘,然后再读出。本例用此方法,此法比较简单,程序代码简小,通俗易懂。


程序流程图

  3.3 数据格式和输入方法
  数据格式要求,X坐标和Y坐标间用逗号分隔。直接输入法如需要换行时用Ctrl+Enter换行。如:
  4568.5985698.365
  4575.6575645.698
  4598.2475605.257
  ......
  只要数据格式相同,数据源可以接受来自电子手簿或其他应用软件。最好用其他文字编辑器按格式输入坐标点后,拷贝到程序文本编辑框即可,避免直接输入失手。
  3.4 本程序的优点
  本程序代码简小,通俗易懂,不需要读者具有深厚的编程基础。程序界面友好,操作简单明了。输入坐标点数是动态确定的,地图元素生成速度快。能使
MapinfoAutoCAD一样,实现了精确坐标输入对象的方法。比较适合于地图的局部修测与更新维护等。
  3.5 本程序的缺点
  本程序虽然较方便地实现了动态输入线对象。但还是存在不足。用户界面是用
MapBasic语言生成,比较单调,不能跟其它可视化高级语言相比。能输入的坐标点数有限制性。以上曾提到过,用户是把坐标输入编辑框的,而编辑框数据是存入一个String型变量中,然而变量和EditBox控件容量是有限的。MapBasic中一个EditBox的最大容量为32767个字符一个String变量最大长度等于32767个字节假设一个坐标点最长字符串为24个字符算(XY坐标值字节数加一逗号加回车换行符),则32767 / 241300个坐标点。即用户一次输入点数不应大于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

地址:广西南宁市建政路5号  邮编:530023  Tel:0771-5606397  Email:webmaster@digitalgx.com
广西基础地理信息中心版权所有 2005-2010 广西基础地理信息中心制作