发表用户:guyanf
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=3&ID=1453
信息原始来源:不祥

文章标题:MapBasic-常见问题解答

1.MapBasic的程序在Professional下调试完成,如何移植到Runtimes上?

  • 利用 mapbasic 开发的 Professional 环境下的应用程序,要运行在runtime 环境下,应当在你的程序中增加 Menu Bar Show 命令,以使你的应用程序的菜单显示出来。在利用其它语言如,Visual Basic,Visual C++,Delphi等以Ole Automation方式开发应用程序时,Mapinfo Professional 环境下的程序要运行在Mapinfo Runtime 环境下,应当将创建Mapinfo 对象的语句重写,以Visual Basic 为例,在Mapinfo Professional环境下:

Dim Mapinfo as object

Set Mapinfo = Createobject("Mapinfo.Application")

在Mapinfo Runtime环境下:

Dim Mapinfo as object

Set Mapinfo = Createobject("Mapinfo.Runtime").

.

2.为什么我在MapBasic程序中利用Commandinfo(CMD_INFO_X)和Commandinfo(CMD_INFO_Y)获得的点击处的经纬度坐标值,其小数点后总是4位,如何才能提高其精度?

  • 你可以利用 Format$(CommandInfo(CMD_INFO_X), ",#.######")

Format$(CommandInfo(CMD_INFO_Y), ",#.######")

将坐标精度提高到小数点后6位。

.

3.如何创建字体?
  • 创建字体的语句如下:

Create Text into Window Frontwindow() "Hello!" (10,10)(20,20)

Font MakeFont("Helvetica", 1, 12, BLACK, WHITE)

上句中,12指所要创建的字体的大小,(x,y)指定字符串的左下及右上角位置。将来显示出来的字符的实际大小只由(x,y)来控制。

.

4.如何改变地图单位?
  • commandinfo()和objectgeography()都可用来获取当前地图窗口中的特定点的坐标,但是对于非地球投影的地图应当注意一个问题:如果当前地图为地球投影则两个函数获取的为经纬度坐标,其与status bar上显示的坐标一致。但当前地图为非地球投影时,则应当利用:

set coordsys nonearth units "m" bounds(0,0)(10,10)

来设置当前地图的投影,否则利用上述的两个函数时会得出不正确的坐标信息。

另外,还要注意的另一个问题是:commandinfo()只能用在用户自己定义的过程中,不能用在Mapinfo的系统过程中(例如,Selchangedhandler()),否则得到的并不是坐标信息,而是该对象在数据库中的记录号。但objectgeography() 却没有此问题。

.

5.如何设置窗口投影与坐标体系?

  • 仅以无大地坐标为例:在程序中必须使用下面的语句:

Set CoordSys NonEarth Units "m" Bounds (0,0)(1000,120)

它是设置MapBasic编程的坐标系的。

.

6.如何利用几个点来绘制折线?
  • 利用 Create Pline statement 是可以解决您的问题的。例句如下。

Create Pline into window frontwindow() 5 (10,20)(20,10)(20,30)(40,60)(50,70)

.

7.如何利用Mapbasic实现选择多个区域?
  • 这个问题我想很简单,选择区域和选择点、线等地物对象是一样的。只要有多个区域同时满足相同的条件,则一条选择语句自然会将所有满足该条件的区域都选中。

例如,Select * from China where Total_Pop_Proj >= 30000000

会将所有人口数大于等于30000000的城市全部先选中。

.

8.如何利用Mapbasic实现动态改变数组的大小?

dim a(10) as integer

for i=1 to 10

a(i)=i

next

redim a(20)

for i=11 to 20

a(i)=i

next

.

9.如何实现选择区域内的所有对象的选择?

  • Select * from table where obj within (select obj from table)

说明: table 是所要选择的地物对象所在的表,table 是新创建的选择工具所在的表。

.

10.如何让数据库在找到一条记录后,停止搜索?

用户自己建立了一个Mapinfo 表,其中存储了一万多个常用汉字的编码(按照汉语拼音的顺序进行编码)。想利用 select 语句来对给定的任意汉字搜索其编码,但当要搜索的汉字很多时,用户发现其速度很慢。能否有什么办法让Mapinfo 在找到某个汉字的编码之后,即停止对数据库的遍历。

  • 这个问题的解答:

1.利用 MapBasic 的 Select 语句是无法控制对数据库的遍历的。每执行一次Select,即遍历一次数据库。

2.改进办法:

利用While......Wend 可以让Mapinfo 在找到一条记录后,即可让数据库指针指向数据库的最后一条记录(Fetch last from...)。

但是利用While...Wend循环分支其速度,可能比Select 要慢,而且当所要查找的记录处于数据库的最后一条记录时,同样要对数据库遍历一次。

唯一的办法就是,对汉字的编码进行预先设计。比如,可以在对汉字进行编码时,将其拼音的第一个字母也考虑进去,这样在搜索时,可以根据第一个拼音字母对数据库指针的位置预先进行设置,这样可以让Mapinfo少搜索很多记录。在找到一条记录后,再利用Fetch last from...让数据库指针指向数据库的最后一条记录。这样对数据库的搜索速度会快得多。

.

11.如何选择cosmetic layer中的对象?

我们在使用Select * From Cosmetic1时报错:文件#0没有配准,无法访问,是何道理?

  • 在Mapbasic窗口中执行Select * from cosmetic1 会出现此提示对话框,但当用户在MapBasic程序中执行此语句时(或Select * from windowinfo(frontwindow(),win_info_table)),是不会出现此提示的。

.

  • Mapbasic和连接表的问题

发生如下错误, 是什么原因?

MapBasic部分:

763]

764] '删除临时表

765] Delete From lorgan_tmp

766] Commit Table lorgan_tmp Interactive

767]

768] '保存Selection到临时表

769] Insert Into lorgan_tmpSelect * From Selection

770] Commit Table lorgan_tmp Interactive

771]

说明:lorgan_tmp为链接表

补充:当Selection中记录的个数少时, 无此错误出现.

  • 此问题的解答:

Include "c:\program files\mapinfo\mapbasic\mapbasic.def"

Include "c:\program files\mapinfo\mapbasic\menu.def"

dim i,j,k as integer

close all interactive

'Server Link Table "Select * from Authors" Using "DSN=db;DBQ=C:\temp\db1.mdb" Into "Authors1" File "C:\temp\Authors1.TAB"

Open Table "C:\temp\Authors1.TAB" Interactive

Browse * From Authors1

Open Table "C:\temp\Authors.TAB" Interactive

Browse * From Authors

delete from Authors1

commit table Authors1 interactive

insert into Authors1 select * from Authors

commit table Authors1 interactive


.

.