mapbasic程序有详细的解释_第1页
mapbasic程序有详细的解释_第2页
mapbasic程序有详细的解释_第3页
mapbasic程序有详细的解释_第4页
mapbasic程序有详细的解释_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档河道比降计算程序map info项目:河道比降计算作者:崔军明版本:2.2日期:2009-12-23'使用说明:'1、新建图层,绘制主河道(也可以复制水系,然后整理出主河道)。'2、确定高程的单位(米/分米)。如果与主河道相交的等高线的高程单位不统一,则将其修改一致。'3、运行此程序,打开需要的表,设置计算选项,计算河道比降。'4、如果遇到错误,根据提示将河道上的节点吸附在等高线上,并保存河道表(Stream)。'关闭全部表(不必保存),重新运行程序。'5、程序运行结束后,保存计算结果,然后浏览比降计算表(Gradient)。&#

2、39;(1)复查高程列(Elev)的单位是否统一,确认设置计算选项时所作的选择是正确的。'6、注意,计算某个流域的河道比降时,只需打开对应部分的等高线图层。如果等高线图层太大,会大大影响计算速度。'MapBasic的调试方法:'(1) 在出错或需要的地方,使用 Note (或Print )语句将变量的值显示出来。'(2) 在Map I nfo中,打开MapBasic窗口,回车就会执行当前语句。I'MapBasic 中 SQL的特性:'(1) Delete语句,执行的是无条件删除,即删除表中的全部记录。它不像 SQL Server的SQL语句,可以

3、加 Where限制从句。'它的 Where Rowid = ? 子句用处不大!'(2) Update语句,执行的也是无条件更新,默认情况下,它会更新全部记录。 但是,Update语句可以通过视图更新,这就'等价于使用了 Where子句。如:Select * From Table Where column=? , Update Selectio n Set Colum n = Value,'参考Map Basic帮助。In clude "MAPBASIC.DEF"Declare Sub MainDeclare Sub Open TableDec

4、lare Sub InitDeclare Sub SetupCalcOptio nDeclare Sub WriteElev2Gradie ntDeclare Sub AddCrossi ngOn StreamDeclare Sub GetReachLe nDeclare Sub WriteLe n2Gradie ntDeclare Fun cti on IsDow nStream As LogicalDeclare Function LocateCrossing(L As Object, Li As Object, ByVal C AsIn teger) As In tegerDeclare

5、 Fun cti on CalcGradie nt As FloatDeclare Sub SaveGradie nt(ByVal J As Float)Global EVAs Integer'等高线的高程,用来查询当前正在处理的等高线,便于找到没有吸附的等高线Global ELEV_UNITS As In teger '高程单位选项值计算河道比降Sub Mai nDim J As Float'河道比降Call OpenTable'打开相关表Call Init'初始化Call SetupCalcOption'设置计算选项Call WriteEle

6、v2Gradie nt '查询和河道相交的等高线并将其写入比降计算表Call AddCrossi ngOn Stream ' 在河道上添加交点节点Call GetReachLen'获取河段长度,并将其存入河段长度临时表Call WriteLen2Gradient'将河段长度导入比降计算表中J = CalcGradient()'计算河道比降Call SaveGradient(J)'保存计算结果End Sub打开河道、等高线和比降计算表Sub Open TableDim StreamFileName As Stri ngDim Con tourFil

7、eName As Stri ngDim Gradie ntFileName As Stri ng打开主河道")打开等高线")打开比降计算表")'弹出对话框,打开相关表StreamFileName = FileOpe nDlg("", "", "TAB"," Con tourFileName = FileOpe nDlg("", "", "TAB"," Gradie ntFileName = FileOpe nDlg(&

8、quot;", "", "TAB"," Open Table StreamFileName As StreamOpen Table Con tourFileName As Con tour Open Table Gradie ntFileName As Gradie nt End Sub初始化Sub Init'Dim MapWinld As Integer'地图窗口 ID'Dim MapCoordSys As String'地图坐标系(投影)'设置坐标系(投影)'Map From Str

9、eam'MapWi nld = FrontWin dow()'MapCoordSys = Map perI nfo(MapWi nld, MAPPER_INFO_COORDSYS_CLAUSE)'Set CoordSys Earth'Projection Map CoordSys'Close Win dow MapWi nld'设置长度单位为米Set Dista nee Units "m"'创建河段长度临时表Create Table ReaehLe n (Le ngth Float)Open Table ReaehLe

10、 nEnd Sub设置计算选项Sub SetupCaleOpti on'定义了河道起点和高程单位两个选项DialogTitle " 计算选项"Con trol StatieTextTitle "高程单位:"Con trol RadioGroupTitle "米;分米"Into ELEV_UNITSControl OKButt onTitle "确定"Con trol Ca ncelButtonTitle "取消"'如果取消设置或关闭了设置窗口,则退出程序If Not Comma

11、ndl nfo(CMD_INFO_DLG_OK) The nDrop Table ReachLe nClose Table StreamClose Table Con tourClose Table Gradie ntEnd ProgramEnd IfEnd Sub查询和河道相交的等高线并将其插入比降计算表中Sub WriteElev2Gradie ntDim E As Integer'高程Dim oLi ne As Object '等高线对象'清空河段表中的记录Delete From Gradie nt'查询和主河道相交的等高线Select con tour.

12、Elev, con tour.Obj From con tour, StreamWhere con tour.Obj In tersects Stream.Obj Order By con tour.Elev DESCInto In tersect ion'将高程值和等高线对象都写入比降计算表中Fetch First From In tersectio nDo While Not EOT(I ntersectio n)E = In tersectio n.ElevoLine = In tersectio n.ObjIn sert Into Gradie nt (Elev, Obj) V

13、alues (E, oLine) Fetch Next From In tersect ionLoop'保存比降计算表Commit Table Gradie ntEnd Sub'在河道上添加和等高线的交点节点'OverlayNodes()函数返回添加了交点的折线对象(但是该函数有误差,有时添加的节点不能完全吸附)Sub AddCross ingOn StreamDim S As Object ' 河道折线对象Dim C As Object ' 与河道相交的等高线对象Dim E As In teger '高程值,作为更新等高线的条件'在河道

14、和等高线上添加相交节点Fetch First From Gradie ntDo While Not EOT(Gradie nt)'在河道上添加相交节点S = OverlayNodes(Stream.Obj, Gradie nt.Obj) Update Stream Set Obj = S'在等高线上也添加一个相交节点C = OverlayNodes(Gradie nt.Obj, Stream.Obj)E = Gradie nt.ElevSelect * From Gradie nt Where Elev = EUpdate Selectio n Set Obj = CFetch

15、 Next From Gradie ntLoopEnd Sub获取河段长度,并将其存入河段长度临时表中关于 ExtractNodes()函数的说明:begin_node 要小于 end_nodeSub GetReachLe n Dim S As ObjectDim N As In tegerDim I, C As In teger 'Dim Li ne1 As ObjectDim Li ne2 As Object Dim B, E As In teger 'Dim R As ObjectDim L As Float河道'河道上的节点数循环控制变量等高线1等高线2河段的首

16、尾节点序号河段对象河段长度'清空河段长度表Delete From ReachLe n'获取河道对象及其节点数Fetch First From StreamS = Stream.ObjN = ObjectI nfo(S, OBJ_INFO_NPNTS)'统计等高线条数,控制循环Select Cou nt(*) From Gradie ntC = Selectio n.Coll '河道起点位置不同,计算河段长度时的起止顺序就不同Dim IsDown As Logical'是否顺流而下IsDow n = IsDow nStream()If IsDown The

17、n'如果河道起点从源头开始'计算河段长度并将其插入河段长度表Fetch First From Gradie ntEV = Gradient.Elev'用来寻找没有吸附的等高线Line1 = Gradient.Obj'第一条等高线对象E = LocateCross in g(S, Li nel, N)'河道与第一条等高线的交点位置For I = 1 To C - 1B = E'首节点序号Fetch Next From Gradie ntEV = Gradient.Elev'用来寻找没有吸附的等高线Line2 = Gradient.Obj&#

18、39;下一条等高线E = LocateCrossing(S, Line2, N)'尾节点序号,河道与下一条等高线的交点位置R = ExtractNodes(S, 1, B, E, FALSE)'抽取河段,按 B -> EL = ObjectLen(R, "m")'获取河段长度In sert Into ReachLen (Le ngth) Values (L)'将河段长保存在河段长度临时表中NextElse'如果河道起点从断面处开始'计算河段长度并将其插入河段长度表Fetch First From Gradie ntEV

19、= Gradient.Elev'用来寻找没有吸附的等高线Line1 = Gradient.Obj'第一条等高线对象E = LocateCross in g(S, Li ne1, N)'河道与第一条等高线的交点位置For I = 1 To C - 1B = E'首节点序号Fetch Next From Gradie ntEV = Gradient.Elev'用来寻找没有吸附的等高线Line2 = Gradient.Obj'下一条等高线E = LocateCrossing(S, Line2, N)'尾节点序号,河道与下一条等高线的交点位置R

20、= ExtractNodes(S, 1, E, B, FALSE)'抽取河段,按 E -> BL = ObjectLen(R, "m")'获取河段长度In sert Into ReachLen (Le ngth) Values (L)'将河段长保存在河段长度临时表中NextEnd IfEnd Sub判断河道的起点是否在源头Fun cti on IsDow nStream As LogicalDim S As Object '河道Dim N As Integer'河道上的节点数Dim Li ne1 As ObjectDim Li

21、ne2 As ObjectDim B, E As In teger '等高线1等高线2河段的首尾节点序号'获取河道对象及其节点数Fetch First From StreamS = Stream.ObjN = ObjectI nfo(S, OBJ_INFO_NPNTS)'获取河道与第一条等高线的交点的序号Fetch First From Gradie ntEV = Gradient.Elev'用来寻找没有吸附的等高线Line1 = Gradient.Obj'第一条等高线对象B = LocateCrossi ng(S, Li ne1, N)'河道与

22、第一条等高线的交点位置'获取河道与第二条等高线的交点的序号Fetch Next From Gradie ntEV = Gradient.Elev'用来寻找没有吸附的等高线Line2 = Gradient.Obj'下一条等高线E = LocateCrossing(S, Line2, N)'尾节点序号,河道与下一条等高线的交点位置IsDow nStream = B < EEnd Fun cti on'功能:寻找交点的位置(节点序号)'参数:L河道对象'Li等高线对象'C河道的节点数'关于IntersectNodes()

23、函数的说明:'对于第三个参数points_to_include,INCL_COMMO表示相交于节点;INCL_CROSSING表示相交于线段;INCL_ALL N示两种情况Fun cti on LocateCross in g(L As Object, Li As Object, ByVal C As In teger)As In tegerDim P As ObjectDim Px, Py As FloatDim I As In tegerDim Lx, Ly As Float'两条线的交点'交点坐标'河道线上的节点坐标On Error Goto On Exc

24、eptio nDo'如果河道与等高线没有吸附,则抛出异常 '获取两条折线的交点p = In tersectNodes(L, Li, INCL_COMMON)'得到交点的坐标Px = ObjectNodeX(P, 1, 1)Py = ObjectNodeY(P, 1, 1)'寻找交点的位置(在河道的第几个节点上,折线节点的编号按创建顺序递增)For I = 1 To CLx = ObjectNodeX(L, 1,1)Ly = ObjectNodeY(L, 1,1)If (Lx = Px) The nIf (Ly = Py) Then Exit For End If

25、End IfNextLocateCross ing = IEn dExcepti on:Exit Fun cti onOn Exception Do:Drop Table ReachLe nMap From Con tourAdd Map Layer Streamset map redraw off'异常处理'销毁河段长度临时表'打开等高线图层'添加河道图层Set Map Layer "Stream" Editable On '使河道图层可编辑set map redraw onStream 表。",指的是尝试重新执行刚才出错

26、的语句。因Select * From Co ntour Where Elev = EVNote "请把河道吸附在图中所示等高线上,并保存'0Resume En dExcepti on '0找不到中断的办法,只好放弃。End Fun cti on将河段长度再导入比降计算表中Sub WriteLe n2Gradie ntDim E As In tegerDim L As Float '将河段长度一一写入比降计算表中Fetch First From Gradient'游标指向比降计算表的第一条记录Fetch First From ReachLen'游

27、标指向河段长度表的第一条记录Do While Not EOT(ReachLe n)E = Gradie nt.ElevL = ReachLe n.Le ngthSelect * From Gradie nt Where Elev = EUpdate Selecti on Set Len = LFetch Next From Gradie ntFetch Next From ReachLe nLoop'销毁河段长度临时表Drop Table ReachLe n'保存比降计算表Commit Table Gradie ntEnd Sub功能:计算河道比降算法:统计河道总长,计算河道比降Fun cti on CalcGradie nt As Float Dim L As Float '

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论