您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > mapbasic程序有详细的解释
河道比降计算程序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语句,执行的是无条件删除,即删除表中的全部记录。它不像SQLServer的SQL语句,可以加Where限制从句。'它的WhereRowid=?子句用处不大!'(2)Update语句,执行的也是无条件更新,默认情况下,它会更新全部记录。但是,Update语句可以通过视图更新,这就'等价于使用了Where子句。如:Select*FromTableWherecolumn=?,UpdateSelectionSetColumn=Value,'参考MapBasic帮助。'---------------------------------------------------------------------------------IncludeMAPBASIC.DEFDeclareSubMainDeclareSubOpenTableDeclareSubInitDeclareSubSetupCalcOptionDeclareSubWriteElev2GradientDeclareSubAddCrossingOnStreamDeclareSubGetReachLenDeclareSubWriteLen2GradientDeclareFunctionIsDownStreamAsLogicalDeclareFunctionLocateCrossing(LAsObject,LiAsObject,ByValCAsInteger)AsIntegerDeclareFunctionCalcGradientAsFloatDeclareSubSaveGradient(ByValJAsFloat)GlobalEVAsInteger'等高线的高程,用来查询当前正在处理的等高线,便于找到没有吸附的等高线GlobalELEV_UNITSAsInteger'高程单位选项值'----------------------------------------'计算河道比降'----------------------------------------SubMainDimJAsFloat'河道比降CallOpenTable'打开相关表CallInit'初始化CallSetupCalcOption'设置计算选项CallWriteElev2Gradient'查询和河道相交的等高线并将其写入比降计算表CallAddCrossingOnStream'在河道上添加交点节点CallGetReachLen'获取河段长度,并将其存入河段长度临时表CallWriteLen2Gradient'将河段长度导入比降计算表中J=CalcGradient()'计算河道比降CallSaveGradient(J)'保存计算结果EndSub'----------------------------------------'打开河道、等高线和比降计算表'----------------------------------------SubOpenTableDimStreamFileNameAsStringDimContourFileNameAsStringDimGradientFileNameAsString'弹出对话框,打开相关表StreamFileName=FileOpenDlg(,,TAB,打开主河道)ContourFileName=FileOpenDlg(,,TAB,打开等高线)GradientFileName=FileOpenDlg(,,TAB,打开比降计算表)OpenTableStreamFileNameAsStreamOpenTableContourFileNameAsContourOpenTableGradientFileNameAsGradientEndSub'----------------------------------------'初始化'----------------------------------------SubInit'DimMapWinIdAsInteger'地图窗口ID'DimMapCoordSysAsString'地图坐标系(投影)'设置坐标系(投影)'MapFromStream'MapWinId=FrontWindow()'MapCoordSys=MapperInfo(MapWinId,MAPPER_INFO_COORDSYS_CLAUSE)'SetCoordSysEarth'ProjectionMapCoordSys'CloseWindowMapWinId'设置长度单位为米SetDistanceUnitsm'创建河段长度临时表CreateTableReachLen(LengthFloat)OpenTableReachLenEndSub'-----------------------------------------------'设置计算选项'-----------------------------------------------SubSetupCalcOption'定义了河道起点和高程单位两个选项DialogTitle计算选项ControlStaticTextTitle高程单位:ControlRadioGroupTitle米;分米IntoELEV_UNITSControlOKButtonTitle确定ControlCancelButtonTitle取消'如果取消设置或关闭了设置窗口,则退出程序IfNotCommandInfo(CMD_INFO_DLG_OK)ThenDropTableReachLenCloseTableStreamCloseTableContourCloseTableGradientEndProgramEndIfEndSub'--------------------------------------------------'查询和河道相交的等高线并将其插入比降计算表中'--------------------------------------------------SubWriteElev2GradientDimEAsInteger'高程DimoLineAsObject'等高线对象'清空河段表中的记录DeleteFromGradient'查询和主河道相交的等高线Selectcontour.Elev,contour.ObjFromcontour,StreamWherecontour.ObjIntersectsStream.ObjOrderBycontour.ElevDESCIntoIntersection'将高程值和等高线对象都写入比降计算表中FetchFirstFromIntersectionDoWhileNotEOT(Intersection)E=Intersection.ElevoLine=Intersection.ObjInsertIntoGradient(Elev,Obj)Values(E,oLine)FetchNextFromIntersectionLoop'保存比降计算表CommitTableGradientEndSub'-------------------------------------------------'在河道上添加和等高线的交点节点'OverlayNodes()函数返回添加了交点的折线对象(但是该函数有误差,有时添加的节点不能完全吸附)'-------------------------------------------------SubAddCrossingOnStreamDimSAsObject'河道折线对象DimCAsObject'与河道相交的等高线对象DimEAsInteger'高程值,作为更新等高线的条件'在河道和等高线上添加相交节点FetchFirstFromGradientDoWhileNotEOT(Gradient)'在河道上添加相交节点S=OverlayNodes(Stream.Obj,Gradient.Obj)'UpdateStreamSetObj=S'在等高线上也添加一个相交节点C=OverlayNodes(Gradient.Obj,Stream.Obj)E=Gradient.ElevSelect*FromGradientWhereElev=EUpdateSelectionSetObj=CFetchNextFromGradientLoopEndSub'--------------------------------------------------'获取河段长度,并将其存入河段长度临时表中'关于ExtractNodes()函数的说明:begin_node要小于end_node'--------------------------------------------------SubGetReachLenDimSAsObject'河道DimNAsInteger'河道上的节点数DimI,CAsInteger'循环控制变量DimLine1AsObject'等高线1DimLine2AsObject'等高线2DimB,EAsInteger'河段的首尾节点序号DimRAsObject'河段对象DimLAsFloat'河段长度'清空河段长度表DeleteFromReachLen'获取河道对象及其节点数FetchFirstFromStreamS=Stream.ObjN=ObjectInfo(S,OBJ_INFO_NPNTS)'统计等高线条数,控制循环SelectCount(*)FromGradientC=Selection.Col1'河道起点位置不同,计算河段长度时的起止顺序就不同DimIsDownAsLogical'是否顺流而下IsDown=IsDownStream()IfIsDownThen'如果河道起点从源头开始'计算河段长度并将其插入河段长度表FetchFirstFromGradientEV=Gradient.Elev'用来寻找没有吸附的等高线Line1=Gradient.Obj'第一条等高线对象E=LocateCrossing(S,Line1,N)'河道与第一条等高线的交点位置ForI=1ToC-1B=E'首节点序号FetchNextFromGradientEV=Gradient.El
本文标题:mapbasic程序有详细的解释
链接地址:https://www.777doc.com/doc-4235083 .html