




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河道比降计算程序mapinfo= 项目:河道比降计算 作者:崔军明 版本:2.2 日期:2009-12-23 使用说明: 1、新建图层,绘制主河道(也可以复制水系,然后整理出主河道)。 2、确定高程的单位(米/分米)。如果与主河道相交的等高线的高程单位不统一,则将其修改一致。 3、运行此程序,打开需要的表,设置计算选项,计算河道比降。 4、如果遇到错误,根据提示将河道上的节点吸附在等高线上, 并保存河道表(Stream)。 关闭全部表(不必保存),重新运行程序。 5、程序运行结束后,保存计算结果,然后浏览比降计算表(Gradient)。 (1) 复查高程列(Elev)的单位是否统一,确认设置计算选项时所作的选择是正确的。 6、注意,计算某个流域的河道比降时,只需打开对应部分的等高线图层。 如果等高线图层太大,会大大影响计算速度。= -MapBasic的调试方法: (1) 在出错或需要的地方,使用Note(或Print)语句将变量的值显示出来。 (2) 在MapInfo中,打开MapBasic窗口,回车就会执行当前语句。MapBasic中SQL的特性: (1) Delete 语句,执行的是无条件删除,即删除表中的全部记录。它不像SQL Server的SQL语句,可以加Where限制从句。 它的Where Rowid = ? 子句用处不大! (2) Update 语句,执行的也是无条件更新,默认情况下,它会更新全部记录。但是,Update语句可以通过视图更新,这就 等价于使用了Where子句。如:Select * From Table Where column = ? , Update Selection Set Column = Value, 参考MapBasic帮助。-Include MAPBASIC.DEFDeclare Sub MainDeclare Sub OpenTableDeclare Sub InitDeclare Sub SetupCalcOptionDeclare Sub WriteElev2GradientDeclare Sub AddCrossingOnStreamDeclare Sub GetReachLenDeclare Sub WriteLen2GradientDeclare Function IsDownStream As LogicalDeclare Function LocateCrossing(L As Object, Li As Object, ByVal C As Integer) As IntegerDeclare Function CalcGradient As FloatDeclare Sub SaveGradient(ByVal J As Float)Global EV As Integer 等高线的高程,用来查询当前正在处理的等高线,便于找到没有吸附的等高线Global ELEV_UNITS As Integer 高程单位选项值-计算河道比降-Sub MainDim J As Float 河道比降Call OpenTable 打开相关表Call Init 初始化Call SetupCalcOption 设置计算选项Call WriteElev2Gradient 查询和河道相交的等高线并将其写入比降计算表Call AddCrossingOnStream 在河道上添加交点节点Call GetReachLen 获取河段长度,并将其存入河段长度临时表Call WriteLen2Gradient 将河段长度导入比降计算表中J = CalcGradient() 计算河道比降Call SaveGradient(J) 保存计算结果End Sub-打开河道、等高线和比降计算表-Sub OpenTableDim StreamFileName As StringDim ContourFileName As StringDim GradientFileName As String弹出对话框,打开相关表StreamFileName = FileOpenDlg(, , TAB, 打开主河道)ContourFileName = FileOpenDlg(, , TAB, 打开等高线)GradientFileName = FileOpenDlg(, , TAB, 打开比降计算表)Open Table StreamFileName As StreamOpen Table ContourFileName As ContourOpen Table GradientFileName As GradientEnd Sub-初始化-Sub InitDim MapWinId As Integer 地图窗口IDDim MapCoordSys As String 地图坐标系(投影)设置坐标系(投影)Map From StreamMapWinId = FrontWindow()MapCoordSys = MapperInfo(MapWinId, MAPPER_INFO_COORDSYS_CLAUSE)Set CoordSys Earth Projection MapCoordSysClose Window MapWinId设置长度单位为米Set Distance Units m创建河段长度临时表Create Table ReachLen (Length Float)Open Table ReachLenEnd Sub-设置计算选项-Sub SetupCalcOption定义了河道起点和高程单位两个选项Dialog Title 计算选项 Control StaticText Title 高程单位: Control RadioGroup Title 米;分米 Into ELEV_UNITS Control OKButton Title 确定 Control CancelButton Title 取消如果取消设置或关闭了设置窗口,则退出程序If Not CommandInfo(CMD_INFO_DLG_OK) Then Drop Table ReachLen Close Table Stream Close Table Contour Close Table Gradient End ProgramEnd IfEnd Sub-查询和河道相交的等高线并将其插入比降计算表中-Sub WriteElev2GradientDim E As Integer 高程Dim oLine As Object 等高线对象清空河段表中的记录Delete From Gradient查询和主河道相交的等高线Select contour.Elev, contour.Obj From contour, Stream Where contour.Obj Intersects Stream.Obj Order By contour.Elev DESC Into Intersection将高程值和等高线对象都写入比降计算表中Fetch First From IntersectionDo While Not EOT(Intersection) E = Intersection.Elev oLine = Intersection.Obj Insert Into Gradient (Elev, Obj) Values (E, oLine) Fetch Next From IntersectionLoop保存比降计算表Commit Table GradientEnd Sub-在河道上添加和等高线的交点节点 OverlayNodes() 函数返回添加了交点的折线对象(但是该函数有误差,有时添加的节点不能完全吸附)-Sub AddCrossingOnStreamDim S As Object 河道折线对象Dim C As Object 与河道相交的等高线对象Dim E As Integer 高程值,作为更新等高线的条件在河道和等高线上添加相交节点Fetch First From GradientDo While Not EOT(Gradient) 在河道上添加相交节点 S = OverlayNodes(Stream.Obj, Gradient.Obj) Update Stream Set Obj = S 在等高线上也添加一个相交节点 C = OverlayNodes(Gradient.Obj, Stream.Obj) E = Gradient.Elev Select * From Gradient Where Elev = E Update Selection Set Obj = C Fetch Next From GradientLoopEnd Sub-获取河段长度,并将其存入河段长度临时表中关于ExtractNodes()函数的说明:begin_node 要小于 end_node-Sub GetReachLenDim S As Object 河道Dim N As Integer 河道上的节点数Dim I, C As Integer 循环控制变量Dim Line1 As Object 等高线1Dim Line2 As Object 等高线2Dim B, E As Integer 河段的首尾节点序号Dim R As Object 河段对象Dim L As Float 河段长度清空河段长度表Delete From ReachLen获取河道对象及其节点数Fetch First From StreamS = Stream.ObjN = ObjectInfo(S, OBJ_INFO_NPNTS)统计等高线条数,控制循环Select Count(*) From GradientC = Selection.Col1河道起点位置不同,计算河段长度时的起止顺序就不同Dim IsDown As Logical 是否顺流而下IsDown = IsDownStream()If IsDown Then 如果河道起点从源头开始 计算河段长度并将其插入河段长度表 Fetch First From Gradient EV = Gradient.Elev 用来寻找没有吸附的等高线 Line1 = Gradient.Obj 第一条等高线对象 E = LocateCrossing(S, Line1, N) 河道与第一条等高线的交点位置 For I = 1 To C - 1 B = E 首节点序号 Fetch Next From Gradient EV = Gradient.Elev 用来寻找没有吸附的等高线 Line2 = Gradient.Obj 下一条等高线 E = LocateCrossing(S, Line2, N) 尾节点序号,河道与下一条等高线的交点位置 R = ExtractNodes(S, 1, B, E, FALSE) 抽取河段,按 B - E L = ObjectLen(R, m) 获取河段长度 Insert Into ReachLen (Length) Values (L) 将河段长保存在河段长度临时表中 NextElse 如果河道起点从断面处开始 计算河段长度并将其插入河段长度表 Fetch First From Gradient EV = Gradient.Elev 用来寻找没有吸附的等高线 Line1 = Gradient.Obj 第一条等高线对象 E = LocateCrossing(S, Line1, N) 河道与第一条等高线的交点位置 For I = 1 To C - 1 B = E 首节点序号 Fetch Next From Gradient EV = Gradient.Elev 用来寻找没有吸附的等高线 Line2 = Gradient.Obj 下一条等高线 E = LocateCrossing(S, Line2, N) 尾节点序号,河道与下一条等高线的交点位置 R = ExtractNodes(S, 1, E, B, FALSE) 抽取河段,按 E - B L = ObjectLen(R, m) 获取河段长度 Insert Into ReachLen (Length) Values (L) 将河段长保存在河段长度临时表中 NextEnd IfEnd Sub-判断河道的起点是否在源头-Function IsDownStream As LogicalDim S As Object 河道Dim N As Integer 河道上的节点数Dim Line1 As Object 等高线1Dim Line2 As Object 等高线2Dim B, E As Integer 河段的首尾节点序号获取河道对象及其节点数Fetch First From StreamS = Stream.ObjN = ObjectInfo(S, OBJ_INFO_NPNTS)获取河道与第一条等高线的交点的序号Fetch First From GradientEV = Gradient.Elev 用来寻找没有吸附的等高线Line1 = Gradient.Obj 第一条等高线对象B = LocateCrossing(S, Line1, N) 河道与第一条等高线的交点位置获取河道与第二条等高线的交点的序号Fetch Next From GradientEV = Gradient.Elev 用来寻找没有吸附的等高线Line2 = Gradient.Obj 下一条等高线E = LocateCrossing(S, Line2, N) 尾节点序号,河道与下一条等高线的交点位置 IsDownStream = B EEnd Function-功能:寻找交点的位置(节点序号)参数: L 河道对象 Li 等高线对象 C 河道的节点数 关于IntersectNodes()函数的说明: 对于第三个参数points_to_include,INCL_COMMON 表示相交于节点;INCL_CROSSINGS 表示相交于线段;INCL_ALL 表示两种情况-Function LocateCrossing(L As Object, Li As Object, ByVal C As Integer) As IntegerDim P As Object 两条线的交点Dim Px, Py As Float 交点坐标Dim I As IntegerDim Lx, Ly As Float 河道线上的节点坐标OnError Goto OnExceptionDo 如果河道与等高线没有吸附,则抛出异常获取两条折线的交点p = IntersectNodes(L, Li, INCL_COMMON) 得到交点的坐标Px = ObjectNodeX(P, 1, 1)Py = ObjectNodeY(P, 1, 1)寻找交点的位置(在河道的第几个节点上,折线节点的编号按创建顺序递增)For I = 1 To C Lx = ObjectNodeX(L, 1, I) Ly = ObjectNodeY(L, 1, I) If (Lx = Px) Then If (Ly = Py) Then Exit For End If End IfNextLocateCrossing = IEndException: 异常处理Exit FunctionOnExceptionDo:Drop Table ReachLen 销毁河段长度临时表Map From Contour 打开等高线图层Add Map Layer Stream 添加河道图层set map redraw off Set Map Layer Stream Editable On 使河道图层可编辑set map redraw onSelect * From Contour Where Elev = EVNote 请把河道吸附在图中所示等高线上,并保存Stream表。Resume EndException 0 0,指的是尝试重新执行刚才出错的语句。因找不到中断的办法,只好放弃。End Function-将河段长度再导入比降计算表中-Sub WriteLen2GradientDim E As IntegerDim L As Float将河段长度一一写入比降计算表中Fetch First From Gradient 游标指向比降计算表的第一条记录Fetch First From ReachLen 游标指向河段长度表的第一条记录Do While Not EOT(ReachLen) E = Gradient.Elev L = ReachLen.Length Select * From Gradient Where Elev = E Update Selection Set Len = L Fetch Next From Gradient Fetch Next From ReachLenLoop销毁河段长度临时表Drop Table ReachLen保存比降计算表Commit Table GradientEnd Sub-功能:计算河道比降算法:统计河道总长,计算河道比降-Function CalcGradient As FloatDim L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肉类罐头加工过程中的食品安全隐患与预防考核试卷
- 稀土金属冶炼与战略新兴产业考核试卷
- 玻璃纤维射击靶考核试卷
- 篷布企业供应链风险管理考核试卷
- 精神障碍的康复教育介入考核试卷
- 四川大学《移动应用开发(Andoid)》2023-2024学年第一学期期末试卷
- 上海市长宁区高级中学2025年初三下期中生物试题试卷含解析
- 南平市建瓯市2025年重点中学小升初数学入学考试卷含解析
- 山东华宇工学院《中外文化交流(Ⅰ)》2023-2024学年第一学期期末试卷
- 辽宁省普兰店市2025年高考语文试题疯狂小题抢高分含解析
- 铲车装载机知识培训课件
- 2025年辽宁省葫芦岛市绥中县中考一模语文试题含答案
- 家政经理培训课件
- 2024-2025学年高一下学期期中考试化学试卷
- 四川省南充市高级中学2024-2025学年高二下学期期中考试 化学(含答案)
- 科学管理之父:弗雷德里克·温斯洛·泰勒
- 国际教育规划合同8篇
- 浙江国企招聘2025宁波镇海区国资系统招聘33人笔试参考题库附带答案详解
- 自动化竞聘试题及答案
- 2025至2030年中国军用仿真(软件)行业发展战略规划及投资方向研究报告
- 整装定制合同协议
评论
0/150
提交评论