xudanfu
路人甲
路人甲
  • 注册日期2004-05-30
  • 发帖数48
  • QQ
  • 铜币303枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1546回复:1

[转帖]MapBasic

楼主#
更多 发布于:2004-08-21 20:13
 
<P><v:shapetype><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path connecttype="rect" gradientshapeok="t" extrusionok="f"></v:path><lock aspectratio="t" v:ext="edit"></lock></v:shapetype><v:shape><v:imagedata></v:imagedata></v:shape><p> </p></P>
<P><p> </p></P><BR clear=all >
<H1><B >MapBasic<p></p></B></H1>
<P align=center class=MsoNormal style="TEXT-ALIGN: center">----常见问题解答</P>
<P><p> </p></P>
<P >1.  MapBasic的程序在Professional下调试完成,如何移植到Runtimes上?</P>
<P >l        利用 mapbasic 开发的 Professional 环境下的应用程序,要运行在runtime 环境下,应当在你的程序中增加 Menu Bar Show 命令,以使你的应用程序的菜单显示出来。在利用其它语言如,Visual Basic,Visual C++,Delphi等以Ole Automation方式开发应用程序时,Mapinfo Professional 环境下的程序要运行在Mapinfo Runtime 环境下,应当将创建Mapinfo 对象的语句重写,以Visual Basic 为例,在Mapinfo Professional环境下:<p></p></P>
<P >Dim Mapinfo as object<p></p></P>
<P >Set Mapinfo = Createobject("Mapinfo.Application")<p></p></P>
<P >    在Mapinfo Runtime环境下:<p></p></P>
<P >       Dim Mapinfo as object<p></p></P>
<P >Set Mapinfo = Createobject("Mapinfo.Runtime").<p></p></P>
<P><p> </p></P>
<P>2.为什么我在MapBasic程序中利用Commandinfo(CMD_INFO_X)和Commandinfo(CMD_INFO_Y)获得的点击处的经纬度坐标值,其小数点后总是4位,如何才能提高其精度?</P>
<P >l        你可以利用 Format$(CommandInfo(CMD_INFO_X), ",#.######") <p></p></P>
<P >    Format$(CommandInfo(CMD_INFO_Y), ",#.######") <p></p></P>
<P >将坐标精度提高到小数点后6位。<p></p></P>
<P><p> </p></P>
<P >3.  如何创建字体?</P>
<P >l        创建字体的语句如下:<p></p></P>
<P >    Create Text into Window Frontwindow() "Hello!" (10,10)(20,20) <p></p></P>
<P >       Font MakeFont("Helvetica", 1, 12, BLACK, WHITE)<p></p></P>
<P >上句中,12指所要创建的字体的大小,(x,y)指定字符串的左下及右上角位置。将来显示出来的字符的实际大小只由(x,y)来控制。<p></p></P>
<P ><p> </p></P>
<P >4.        如何改变地图单位?</P>
<P >l        commandinfo()和objectgeography()都可用来获取当前地图窗口中的特定点的坐标,但是对于非地球投影的地图应当注意一个问题:如果当前地图为地球投影则两个函数获取的为经纬度坐标,其与status bar上显示的坐标一致。但当前地图为非地球投影时,则应当利用:<p></p></P>
<P >    set coordsys nonearth units "m" bounds(0,0)(10,10)<p></p></P>
<P >来设置当前地图的投影,否则利用上述的两个函数时会得出不正确的坐标信息。<p></p></P>
<P >另外,还要注意的另一个问题是:commandinfo()只能用在用户自己定义的过程中,不能用在Mapinfo的系统过程中(例如,Selchangedhandler()),否则得到的并不是坐标信息,而是该对象在数据库中的记录号。但objectgeography() 却没有此问题。</P>
<P ><p> </p></P>
<P >5.如何设置窗口投影与坐标体系?</P>
<P >l        仅以无大地坐标为例:在程序中必须使用下面的语句:<p></p></P>
<P >Set CoordSys NonEarth Units "m" Bounds (0,0)(1000,120)<p></p></P>
<P >它是设置MapBasic编程的坐标系的。<p></p></P>
<P ><p> </p></P>
<P >6.       如何利用几个点来绘制折线?<p></p></P>
<P >l         利用 Create Pline statement 是可以解决您的问题的。例句如下。<p></p></P>
<P >    Create Pline into window frontwindow() 5 (10,20)(20,10)(20,30)(40,60)(50,70)</P>
<P ><p> </p></P>
<P >7.       如何利用Mapbasic实现选择多个区域?<p></p></P>
<P >l        这个问题我想很简单,选择区域和选择点、线等地物对象是一样的。只要有多个区域同时满足相同的条件,则一条选择语句自然会将所有满足该条件的区域都选中。<p></p></P>
<P >   例如,Select * from China where Total_Pop_Proj >= 30000000 <p></p></P>
<P >会将所有人口数大于等于30000000的城市全部先选中。<p></p></P>
<P ><p> </p></P>
<P >8.       如何利用Mapbasic实现动态改变数组的大小?<p></p></P>
<P >    dim a(10) as integer<p></p></P>
<P >    for i=1 to 10<p></p></P>
<P >        a(i)=i<p></p></P>
<P >    next<p></p></P>
<P >    redim a(20)<p></p></P>
<P >    for i=11 to 20<p></p></P>
<P >        a(i)=i<p></p></P>
<P >next<p></p></P>
<P ><p> </p></P>
<P >9.如何实现选择区域内的所有对象的选择?<p></p></P>
<P >l        Select * from table where obj within (select obj from table)<p></p></P>
<P >说明: table 是所要选择的地物对象所在的表,table 是新创建的选择工具所在的表。<p></p></P>
<P ><p> </p></P>
<P >10.    如何让数据库在找到一条记录后,停止搜索?<p></p></P>
<P >用户自己建立了一个Mapinfo 表,其中存储了一万多个常用汉字的编码(按照汉语拼音的顺序进行编码)。想利用 select 语句来对给定的任意汉字搜索其编码,但当要搜索的汉字很多时,用户发现其速度很慢。能否有什么办法让Mapinfo 在找到某个汉字的编码之后,即停止对数据库的遍历。<p></p></P>
<P >l        这个问题的解答:<p></p></P>
<P >1.利用 MapBasic 的 Select 语句是无法控制对数据库的遍历的。每执行一次Select,即遍历一次数据库。<p></p></P>
<P >2.改进办法:<p></p></P>
<P >利用While......Wend 可以让Mapinfo 在找到一条记录后,即可让数据库指针指向数据库的最后一条记录(Fetch last from...)。<p></p></P>
<P >但是利用While...Wend循环分支其速度,可能比Select 要慢,而且当所要查找的记录处于数据库的最后一条记录时,同样要对数据库遍历一次。<p></p></P>
<P >唯一的办法就是,对汉字的编码进行预先设计。比如,可以在对汉字进行编码时,将其拼音的第一个字母也考虑进去,这样在搜索时,可以根据第一个拼音字母对数据库指针的位置预先进行设置,这样可以让Mapinfo少搜索很多记录。在找到一条记录后,再利用Fetch last from...让数据库指针指向数据库的最后一条记录。这样对数据库的搜索速度会快得多。<p></p></P>
<P ><p> </p></P>
<P >11.    如何选择cosmetic layer中的对象?<p></p></P>
<P >我们在使用Select * From Cosmetic1时报错:    文件#0没有配准,无法访问,是何道理?<p></p></P>
<P >l        在Mapbasic窗口中执行Select * from cosmetic1 会出现此提示对话框,但当用户在MapBasic程序中执行此语句时(或Select * from windowinfo(frontwindow(),win_info_table)),是不会出现此提示的。<p></p></P>
<P ><p> </p></P>
<P >12.    Mapbasic和连接表的问题<p></p></P>
<P >发生如下错误, 是什么原因?<p></p></P>
<P >MapBasic部分:<p></p></P>
<P >763]<p></p></P>
<P >764] '删除临时表<p></p></P>
<P >765] Delete From lorgan_tmp<p></p></P>
<P >766] Commit Table lorgan_tmp Interactive<p></p></P>
<P >767]<p></p></P>
<P >768] '保存Selection到临时表<p></p></P>
<P >769] Insert Into lorgan_tmp  Select * From Selection<p></p></P>
<P >770] Commit Table lorgan_tmp Interactive<p></p></P>
<P >771]<p></p></P>
<P >说明:    lorgan_tmp为链接表<p></p></P>
<P >补充:    当Selection中记录的个数少时, 无此错误出现.<p></p></P>
<P >l        此问题的解答:<p></p></P>
<P >Include "c:\program files\mapinfo\mapbasic\mapbasic.def"<p></p></P>
<P >Include "c:\program files\mapinfo\mapbasic\menu.def"<p></p></P>
<P >dim i,j,k as integer<p></p></P>
<P >close all interactive<p></p></P>
<P >'Server Link Table "Select * from Authors" Using "DSN=db;DBQ=C:\temp\db1.mdb" Into "Authors1" File "C:\temp\Authors1.TAB"<p></p></P>
<P >Open Table "C:\temp\Authors1.TAB" Interactive<p></p></P>
<P >Browse * From Authors1<p></p></P>
<P >Open Table "C:\temp\Authors.TAB" Interactive<p></p></P>
<P >Browse * From Authors<p></p></P>
<P >delete from Authors1<p></p></P>
<P >commit table Authors1 interactive<p></p></P>
<P >insert into Authors1 select * from Authors<p></p></P>
<P >commit table Authors1 interactive<p></p></P>
<P ><p>  </P>
<P><v:shapetype><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path connecttype="rect" gradientshapeok="t" extrusionok="f"></v:path><lock aspectratio="t" v:ext="edit"></lock></v:shapetype><v:shape><v:imagedata></v:imagedata></v:shape><p> </p></P>
<P><p> </p></P>
<P ><BR clear=all ></P>
<H1><B >MapBasic<p></p></B></H1>
<P align=center class=MsoNormal style="TEXT-ALIGN: center">----常见问题解答</P>
<P><p> </p></P>
<P >1.  MapBasic的程序在Professional下调试完成,如何移植到Runtimes上?</P>
<P >l        利用 mapbasic 开发的 Professional 环境下的应用程序,要运行在runtime 环境下,应当在你的程序中增加 Menu Bar Show 命令,以使你的应用程序的菜单显示出来。在利用其它语言如,Visual Basic,Visual C++,Delphi等以Ole Automation方式开发应用程序时,Mapinfo Professional 环境下的程序要运行在Mapinfo Runtime 环境下,应当将创建Mapinfo 对象的语句重写,以Visual Basic 为例,在Mapinfo Professional环境下:<p></p></P>
<P >Dim Mapinfo as object<p></p></P>
<P >Set Mapinfo = Createobject("Mapinfo.Application")<p></p></P>
<P >    在Mapinfo Runtime环境下:<p></p></P>
<P >       Dim Mapinfo as object<p></p></P>
<P >Set Mapinfo = Createobject("Mapinfo.Runtime").<p></p></P>
<P><p> </p></P>
<P>2.为什么我在MapBasic程序中利用Commandinfo(CMD_INFO_X)和Commandinfo(CMD_INFO_Y)获得的点击处的经纬度坐标值,其小数点后总是4位,如何才能提高其精度?</P>
<P >l        你可以利用 Format$(CommandInfo(CMD_INFO_X), ",#.######") <p></p></P>
<P >    Format$(CommandInfo(CMD_INFO_Y), ",#.######") <p></p></P>
<P >将坐标精度提高到小数点后6位。<p></p></P>
<P><p> </p></P>
<P >3.  如何创建字体?</P>
<P >l        创建字体的语句如下:<p></p></P>
<P >    Create Text into Window Frontwindow() "Hello!" (10,10)(20,20) <p></p></P>
<P >       Font MakeFont("Helvetica", 1, 12, BLACK, WHITE)<p></p></P>
<P >上句中,12指所要创建的字体的大小,(x,y)指定字符串的左下及右上角位置。将来显示出来的字符的实际大小只由(x,y)来控制。<p></p></P>
<P ><p> </p></P>
<P >4.        如何改变地图单位?</P>
<P >l        commandinfo()和objectgeography()都可用来获取当前地图窗口中的特定点的坐标,但是对于非地球投影的地图应当注意一个问题:如果当前地图为地球投影则两个函数获取的为经纬度坐标,其与status bar上显示的坐标一致。但当前地图为非地球投影时,则应当利用:<p></p></P>
<P >    set coordsys nonearth units "m" bounds(0,0)(10,10)<p></p></P>
<P >来设置当前地图的投影,否则利用上述的两个函数时会得出不正确的坐标信息。<p></p></P>
<P >另外,还要注意的另一个问题是:commandinfo()只能用在用户自己定义的过程中,不能用在Mapinfo的系统过程中(例如,Selchangedhandler()),否则得到的并不是坐标信息,而是该对象在数据库中的记录号。但objectgeography() 却没有此问题。</P>
<P ><p> </p></P>
<P >5.如何设置窗口投影与坐标体系?</P>
<P >l        仅以无大地坐标为例:在程序中必须使用下面的语句:<p></p></P>
<P >Set CoordSys NonEarth Units "m" Bounds (0,0)(1000,120)<p></p></P>
<P >它是设置MapBasic编程的坐标系的。<p></p></P>
<P ><p> </p></P>
<P >6.       如何利用几个点来绘制折线?<p></p></P>
<P >l         利用 Create Pline statement 是可以解决您的问题的。例句如下。<p></p></P>
<P >    Create Pline into window frontwindow() 5 (10,20)(20,10)(20,30)(40,60)(50,70)</P>
<P ><p> </p></P>
<P >7.       如何利用Mapbasic实现选择多个区域?<p></p></P>
<P >l        这个问题我想很简单,选择区域和选择点、线等地物对象是一样的。只要有多个区域同时满足相同的条件,则一条选择语句自然会将所有满足该条件的区域都选中。<p></p></P>
<P >   例如,Select * from China where Total_Pop_Proj >= 30000000 <p></p></P>
<P >会将所有人口数大于等于30000000的城市全部先选中。<p></p></P>
<P ><p> </p></P>
<P >8.       如何利用Mapbasic实现动态改变数组的大小?<p></p></P>
<P >    dim a(10) as integer<p></p></P>
<P >    for i=1 to 10<p></p></P>
<P >        a(i)=i<p></p></P>
<P >    next<p></p></P>
<P >    redim a(20)<p></p></P>
<P >    for i=11 to 20<p></p></P>
<P >        a(i)=i<p></p></P>
<P >next<p></p></P>
<P ><p> </p></P>
<P >9.如何实现选择区域内的所有对象的选择?<p></p></P>
<P >l        Select * from table where obj within (select obj from table)<p></p></P>
<P >说明: table 是所要选择的地物对象所在的表,table 是新创建的选择工具所在的表。<p></p></P>
<P ><p> </p></P>
<P >10.    如何让数据库在找到一条记录后,停止搜索?<p></p></P>
<P >用户自己建立了一个Mapinfo 表,其中存储了一万多个常用汉字的编码(按照汉语拼音的顺序进行编码)。想利用 select 语句来对给定的任意汉字搜索其编码,但当要搜索的汉字很多时,用户发现其速度很慢。能否有什么办法让Mapinfo 在找到某个汉字的编码之后,即停止对数据库的遍历。<p></p></P>
<P >l        这个问题的解答:<p></p></P>
<P >1.利用 MapBasic 的 Select 语句是无法控制对数据库的遍历的。每执行一次Select,即遍历一次数据库。<p></p></P>
<P >2.改进办法:<p></p></P>
<P >利用While......Wend 可以让Mapinfo 在找到一条记录后,即可让数据库指针指向数据库的最后一条记录(Fetch last from...)。<p></p></P>
<P >但是利用While...Wend循环分支其速度,可能比Select 要慢,而且当所要查找的记录处于数据库的最后一条记录时,同样要对数据库遍历一次。<p></p></P>
<P >唯一的办法就是,对汉字的编码进行预先设计。比如,可以在对汉字进行编码时,将其拼音的第一个字母也考虑进去,这样在搜索时,可以根据第一个拼音字母对数据库指针的位置预先进行设置,这样可以让Mapinfo少搜索很多记录。在找到一条记录后,再利用Fetch last from...让数据库指针指向数据库的最后一条记录。这样对数据库的搜索速度会快得多。<p></p></P>
<P ><p> </p></P>
<P >11.    如何选择cosmetic layer中的对象?<p></p></P>
<P >我们在使用Select * From Cosmetic1时报错:    文件#0没有配准,无法访问,是何道理?<p></p></P>
<P >l        在Mapbasic窗口中执行Select * from cosmetic1 会出现此提示对话框,但当用户在MapBasic程序中执行此语句时(或Select * from windowinfo(frontwindow(),win_info_table)),是不会出现此提示的。<p></p></P>
<P ><p> </p></P>
<P >12.    Mapbasic和连接表的问题<p></p></P>
<P >发生如下错误, 是什么原因?<p></p></P>
<P >MapBasic部分:<p></p></P>
<P >763]<p></p></P>
<P >764] '删除临时表<p></p></P>
<P >765] Delete From lorgan_tmp<p></p></P>
<P >766] Commit Table lorgan_tmp Interactive<p></p></P>
<P >767]<p></p></P>
<P >768] '保存Selection到临时表<p></p></P>
<P >769] Insert Into lorgan_tmp  Select * From Selection<p></p></P>
<P >770] Commit Table lorgan_tmp Interactive<p></p></P>
<P >771]<p></p></P>
<P >说明:    lorgan_tmp为链接表<p></p></P>
<P >补充:    当Selection中记录的个数少时, 无此错误出现.<p></p></P>
<P >l        此问题的解答:<p></p></P>
<P >Include "c:\program files\mapinfo\mapbasic\mapbasic.def"<p></p></P>
<P >Include "c:\program files\mapinfo\mapbasic\menu.def"<p></p></P>
<P >dim i,j,k as integer<p></p></P>
<P >close all interactive<p></p></P>
<P >'Server Link Table "Select * from Authors" Using "DSN=db;DBQ=C:\temp\db1.mdb" Into "Authors1" File "C:\temp\Authors1.TAB"<p></p></P>
<P >Open Table "C:\temp\Authors1.TAB" Interactive<p></p></P>
<P >Browse * From Authors1<p></p></P>
<P >Open Table "C:\temp\Authors.TAB" Interactive<p></p></P>
<P >Browse * From Authors<p></p></P>
<P >delete from Authors1<p></p></P>
<P >commit table Authors1 interactive<p></p></P>
<P >insert into Authors1 select * from Authors<p></p></P>
<P >commit table Authors1 interactive<p></p></P>
<P ><p> </p></P>
<P ><p> </p></P>
<P ><p> </p></P>
<P ><p> </p></P>
<P ><p> </p></P></p>
<P ><p> </p></P>
<P ><p> </p></P>
<P ><p> </p></P>
<P ><p> </p></P>
喜欢0 评分0
jonawan
路人甲
路人甲
  • 注册日期2004-03-09
  • 发帖数854
  • QQ
  • 铜币22枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-09-02 16:47
<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em04.gif" />
啊,恋爱,漂浮的爱情 我被失恋灼烧的躯体 就象搁浅动弹不得的流木 直到如雷电般的你 出现并击中我 我这快流木才又再度 落入爱的急流
举报 回复(0) 喜欢(0)     评分
游客

返回顶部