版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精品文檔河道比降計(jì)算程序mapinfo=' 項(xiàng)目:河道比降計(jì)算' 作者:崔軍明' 版本: 2.2' 日期: 2009-12-23'' 使用說(shuō)明:' 1 、新建圖層,繪制主河道(也可以復(fù)制水系,然后整理出主河道)。' 2 、確定高程的單位(米 / 分米)。如果與主河道相交的等高線(xiàn)的高程單位不統(tǒng)一,則將其修改一致。' 3 、運(yùn)行此程序,打開(kāi)需要的表,設(shè)置計(jì)算選項(xiàng),計(jì)算河道比降。' 4 、如果遇到錯(cuò)誤, 根據(jù)提示將河道上的節(jié)點(diǎn)吸附在等高線(xiàn)上, 并保存河道表 (Stream) 。'關(guān)閉全部表(不必保存),重新運(yùn)行程
2、序。'5 、程序運(yùn)行結(jié)束后,保存計(jì)算結(jié)果,然后瀏覽比降計(jì)算表(Gradient)。'(1)復(fù)查高程列 (Elev) 的單位是否統(tǒng)一,確認(rèn)設(shè)置計(jì)算選項(xiàng)時(shí)所作的選擇是正確的。' 6 、注意,計(jì)算某個(gè)流域的河道比降時(shí), 只需打開(kāi)對(duì)應(yīng)部分的等高線(xiàn)圖層。如果等高線(xiàn)圖層太大,會(huì)大大影響計(jì)算速度。'='-'MapBasic 的調(diào)試方法:' (1)在出錯(cuò)或需要的地方,使用Note(或 Print )語(yǔ)句將變量的值顯示出來(lái)。' (2) 在 MapInfo 中,打開(kāi) MapBasic 窗口,回車(chē)就會(huì)執(zhí)行當(dāng)前語(yǔ)句。''MapBasic
3、中 SQL的特性:' (1) Delete 語(yǔ)句,執(zhí)行的是無(wú)條件刪除,即刪除表中的全部記錄。它不像SQLServer 的 SQL語(yǔ)句,可以加Where限制從句。'它的 Where Rowid = ?子句用處不大!' (2) Update 語(yǔ)句,執(zhí)行的也是無(wú)條件更新,默認(rèn)情況下,它會(huì)更新全部記錄。但是, Update 語(yǔ)句可以通過(guò)視圖更新,這就'等價(jià)于使用了 Where子句。如: Select * From Table Where column= ? , Update Selection Set Column = Value,'參考 MapBasic 幫助
4、。'-Include "MAPBASIC.DEF"Declare Sub MainDeclare Sub OpenTable.精品文檔Declare Sub InitDeclare Sub SetupCalcOptionDeclare Sub WriteElev2GradientDeclare Sub AddCrossingOnStreamDeclare Sub GetReachLenDeclare Sub WriteLen2GradientDeclare Function IsDownStream As LogicalDeclare Function Locate
5、Crossing(L As Object, Li As Object, ByVal C AsInteger) As IntegerDeclare Function CalcGradient As FloatDeclare Sub SaveGradient(ByVal J As Float)Global EVAs Integer'等高線(xiàn)的高程, 用來(lái)查詢(xún)當(dāng)前正在處理的等高線(xiàn),便于找到?jīng)]有吸附的等高線(xiàn)Global ELEV_UNITS As Integer '高程單位選項(xiàng)值'-' 計(jì)算河道比降'-Sub MainDim J As Float'河道比降
6、Call OpenTable'打開(kāi)相關(guān)表Call Init' 初始化Call SetupCalcOption'設(shè)置計(jì)算選項(xiàng)Call WriteElev2Gradient '查詢(xún)和河道相交的等高線(xiàn)并將其寫(xiě)入比降計(jì)算表Call AddCrossingOnStream '在河道上添加交點(diǎn)節(jié)點(diǎn)Call GetReachLen' 獲取河段長(zhǎng)度,并將其存入河段長(zhǎng)度臨時(shí)表Call WriteLen2Gradient'將河段長(zhǎng)度導(dǎo)入比降計(jì)算表中J = CalcGradient()'計(jì)算河道比降Call SaveGradient(J)'保存
7、計(jì)算結(jié)果End Sub'-' 打開(kāi)河道、等高線(xiàn)和比降計(jì)算表'-Sub OpenTableDim StreamFileName As StringDim ContourFileName As StringDim GradientFileName As String' 彈出對(duì)話(huà)框,打開(kāi)相關(guān)表StreamFileName = FileOpenDlg("", "", "TAB", "打開(kāi)主河道 ")ContourFileName = FileOpenDlg("", &qu
8、ot;", "TAB", "打開(kāi)等高線(xiàn) ")GradientFileName = FileOpenDlg("", "", "TAB", "打開(kāi)比降計(jì)算表 ")Open Table StreamFileName As Stream.精品文檔Open Table ContourFileName As ContourOpen Table GradientFileName As GradientEnd Sub'-' 初始化'-Sub Init'
9、;Dim MapWinId As Integer' 地圖窗口 ID'Dim MapCoordSys As String' 地圖坐標(biāo)系(投影)' 設(shè)置坐標(biāo)系(投影)'Map From Stream 'MapWinId = FrontWindow()'MapCoordSys = MapperInfo(MapWinId, MAPPER_INFO_COORDSYS_CLAUSE) 'Set CoordSys Earth' Projection MapCoordSys'Close Window MapWinId' 設(shè)
10、置長(zhǎng)度單位為米Set Distance Units "m"' 創(chuàng)建河段長(zhǎng)度臨時(shí)表Create Table ReachLen (Length Float)Open Table ReachLenEnd Sub'-' 設(shè)置計(jì)算選項(xiàng)'-Sub SetupCalcOption' 定義了河道起點(diǎn)和高程單位兩個(gè)選項(xiàng)DialogTitle "計(jì)算選項(xiàng) "Control StaticTextTitle "高程單位: "Control RadioGroupTitle "米; 分米 "Into E
11、LEV_UNITSControl OKButtonTitle "確定 "Control CancelButtonTitle "取消 "' 如果取消設(shè)置或關(guān)閉了設(shè)置窗口,則退出程序If Not CommandInfo(CMD_INFO_DLG_OK) Then.精品文檔Drop Table ReachLenClose Table StreamClose Table ContourClose Table GradientEnd ProgramEnd IfEnd Sub'-' 查詢(xún)和河道相交的等高線(xiàn)并將其插入比降計(jì)算表中'-Su
12、b WriteElev2GradientDim E As Integer' 高程Dim oLine As Object '等高線(xiàn)對(duì)象' 清空河段表中的記錄Delete From Gradient' 查詢(xún)和主河道相交的等高線(xiàn)Select contour.Elev, contour.Obj From contour, StreamWhere contour.Obj Intersects Stream.ObjOrder By contour.Elev DESCInto Intersection' 將高程值和等高線(xiàn)對(duì)象都寫(xiě)入比降計(jì)算表中Fetch First F
13、rom Intersection Do While Not EOT(Intersection)E = Intersection.Elev oLine = Intersection.ObjInsert Into Gradient (Elev, Obj) Values (E, oLine) Fetch Next From IntersectionLoop' 保存比降計(jì)算表Commit Table GradientEnd Sub'-' 在河道上添加和等高線(xiàn)的交點(diǎn)節(jié)點(diǎn)' OverlayNodes() 函數(shù)返回添加了交點(diǎn)的折線(xiàn)對(duì)象(但是該函數(shù)有誤差,有時(shí)添加的節(jié)點(diǎn)不能完全
14、吸附)'-Sub AddCrossingOnStreamDim S As Object '河道折線(xiàn)對(duì)象Dim C As Object '與河道相交的等高線(xiàn)對(duì)象Dim E As Integer '高程值,作為更新等高線(xiàn)的條件.精品文檔' 在河道和等高線(xiàn)上添加相交節(jié)點(diǎn)Fetch First From GradientDo While Not EOT(Gradient)' 在河道上添加相交節(jié)點(diǎn)S = OverlayNodes(Stream.Obj, Gradient.Obj) 'Update Stream Set Obj = S' 在等
15、高線(xiàn)上也添加一個(gè)相交節(jié)點(diǎn)C = OverlayNodes(Gradient.Obj, Stream.Obj)E = Gradient.ElevSelect * From Gradient Where Elev = EUpdate Selection Set Obj = CFetch Next From GradientLoopEnd Sub'-' 獲取河段長(zhǎng)度,并將其存入河段長(zhǎng)度臨時(shí)表中' 關(guān)于 ExtractNodes() 函數(shù)的說(shuō)明: begin_node 要小于 end_node '-Sub GetReachLenDim S As Object'
16、河道Dim N As Integer' 河道上的節(jié)點(diǎn)數(shù)Dim I, C As Integer '循環(huán)控制變量Dim Line1 As Object '等高線(xiàn) 1Dim Line2 As Object '等高線(xiàn) 2Dim B, E As Integer '河段的首尾節(jié)點(diǎn)序號(hào)Dim R As Object' 河段對(duì)象Dim L As Float' 河段長(zhǎng)度' 清空河段長(zhǎng)度表Delete From ReachLen' 獲取河道對(duì)象及其節(jié)點(diǎn)數(shù)Fetch First From Stream S = Stream.ObjN = Obj
17、ectInfo(S, OBJ_INFO_NPNTS)' 統(tǒng)計(jì)等高線(xiàn)條數(shù),控制循環(huán)Select Count(*) From GradientC = Selection.Col1' 河道起點(diǎn)位置不同,計(jì)算河段長(zhǎng)度時(shí)的起止順序就不同Dim IsDown As Logical' 是否順流而下IsDown = IsDownStream()If IsDown Then' 如果河道起點(diǎn)從源頭開(kāi)始' 計(jì)算河段長(zhǎng)度并將其插入河段長(zhǎng)度表Fetch First From Gradient.精品文檔EV = Gradient.Elev' 用來(lái)尋找沒(méi)有吸附的等高線(xiàn)Line
18、1 = Gradient.Obj' 第一條等高線(xiàn)對(duì)象E = LocateCrossing(S, Line1, N)' 河道與第一條等高線(xiàn)的交點(diǎn)位置For I = 1 To C - 1B=E' 首節(jié)點(diǎn)序號(hào)Fetch Next From GradientEV = Gradient.Elev' 用來(lái)尋找沒(méi)有吸附的等高線(xiàn)Line2 = Gradient.Obj' 下一條等高線(xiàn)E = LocateCrossing(S, Line2, N)' 尾節(jié)點(diǎn)序號(hào),河道與下一條等高線(xiàn)的交點(diǎn)位置R = ExtractNodes(S, 1, B, E, FALSE)
19、9; 抽取河段,按 B -> EL = ObjectLen(R, "m")' 獲取河段長(zhǎng)度Insert Into ReachLen (Length) Values (L) '將河段長(zhǎng)保存在河段長(zhǎng)度臨時(shí)表中NextElse' 如果河道起點(diǎn)從斷面處開(kāi)始' 計(jì)算河段長(zhǎng)度并將其插入河段長(zhǎng)度表Fetch First From GradientEV = Gradient.Elev' 用來(lái)尋找沒(méi)有吸附的等高線(xiàn)Line1 = Gradient.Obj' 第一條等高線(xiàn)對(duì)象E = LocateCrossing(S, Line1, N)
20、9; 河道與第一條等高線(xiàn)的交點(diǎn)位置For I = 1 To C - 1B=E' 首節(jié)點(diǎn)序號(hào)Fetch Next From GradientEV = Gradient.Elev' 用來(lái)尋找沒(méi)有吸附的等高線(xiàn)Line2 = Gradient.Obj' 下一條等高線(xiàn)E = LocateCrossing(S, Line2, N)' 尾節(jié)點(diǎn)序號(hào),河道與下一條等高線(xiàn)的交點(diǎn)位置R = ExtractNodes(S, 1, E, B, FALSE)' 抽取河段,按 E -> BL = ObjectLen(R, "m")' 獲取河段長(zhǎng)度In
21、sert Into ReachLen (Length) Values (L) '將河段長(zhǎng)保存在河段長(zhǎng)度臨時(shí)表中NextEnd IfEnd Sub'-' 判斷河道的起點(diǎn)是否在源頭'-Function IsDownStream As LogicalDim S As Object' 河道Dim N As Integer' 河道上的節(jié)點(diǎn)數(shù).精品文檔Dim Line1 As Object '等高線(xiàn) 1Dim Line2 As Object '等高線(xiàn) 2Dim B, E As Integer '河段的首尾節(jié)點(diǎn)序號(hào)' 獲取河道對(duì)
22、象及其節(jié)點(diǎn)數(shù)Fetch First From StreamS = Stream.ObjN = ObjectInfo(S, OBJ_INFO_NPNTS)' 獲取河道與第一條等高線(xiàn)的交點(diǎn)的序號(hào)Fetch First From GradientEV = Gradient.Elev' 用來(lái)尋找沒(méi)有吸附的等高線(xiàn)Line1 = Gradient.Obj' 第一條等高線(xiàn)對(duì)象B = LocateCrossing(S, Line1, N)' 河道與第一條等高線(xiàn)的交點(diǎn)位置' 獲取河道與第二條等高線(xiàn)的交點(diǎn)的序號(hào)Fetch Next From GradientEV = Gra
23、dient.Elev' 用來(lái)尋找沒(méi)有吸附的等高線(xiàn)Line2 = Gradient.Obj' 下一條等高線(xiàn)E = LocateCrossing(S, Line2, N)' 尾節(jié)點(diǎn)序號(hào),河道與下一條等高線(xiàn)的交點(diǎn)位置IsDownStream = B < EEnd Function'-' 功能:尋找交點(diǎn)的位置(節(jié)點(diǎn)序號(hào))' 參數(shù): L 河道對(duì)象' Li 等高線(xiàn)對(duì)象' C 河道的節(jié)點(diǎn)數(shù)' 關(guān)于 IntersectNodes()函數(shù)的說(shuō)明:' 對(duì)于第三個(gè)參數(shù) points_to_include , INCL_COMMON
24、表示相交于節(jié)點(diǎn);INCL_CROSSINGS表示相交于線(xiàn)段; INCL_ALL 表示兩種情況 '-Function LocateCrossing(L As Object, Li As Object, ByVal C As Integer)As IntegerDim P As Object' 兩條線(xiàn)的交點(diǎn)Dim Px, Py As Float' 交點(diǎn)坐標(biāo)Dim I As IntegerDim Lx, Ly As Float' 河道線(xiàn)上的節(jié)點(diǎn)坐標(biāo)OnError Goto OnExceptionDo' 如果河道與等高線(xiàn)沒(méi)有吸附,則拋出異常' 獲取兩條折
25、線(xiàn)的交點(diǎn)p = IntersectNodes(L, Li, INCL_COMMON)' 得到交點(diǎn)的坐標(biāo)Px = ObjectNodeX(P, 1, 1).精品文檔Py = ObjectNodeY(P, 1, 1)' 尋找交點(diǎn)的位置(在河道的第幾個(gè)節(jié)點(diǎn)上,折線(xiàn)節(jié)點(diǎn)的編號(hào)按創(chuàng)建順序遞增)For I = 1 To CLx = ObjectNodeX(L, 1, I)Ly = ObjectNodeY(L, 1, I)If (Lx = Px) ThenIf (Ly = Py) Then Exit For End IfEnd IfNextLocateCrossing = IEndExcep
26、tion:' 異常處理Exit FunctionOnExceptionDo:Drop Table ReachLen' 銷(xiāo)毀河段長(zhǎng)度臨時(shí)表Map From Contour' 打開(kāi)等高線(xiàn)圖層Add Map Layer Stream' 添加河道圖層set map redraw offSet Map Layer "Stream" Editable On '使河道圖層可編輯set map redraw onSelect * From Contour Where Elev = EVNote " 請(qǐng)把河道吸附在圖中所示等高線(xiàn)上,并保存St
27、ream 表。 "Resume EndException '0'0 ,指的是嘗試重新執(zhí)行剛才出錯(cuò)的語(yǔ)句。因找不到中斷的辦法,只好放棄。End Function'-' 將河段長(zhǎng)度再導(dǎo)入比降計(jì)算表中'-Sub WriteLen2GradientDim E As IntegerDim L As Float' 將河段長(zhǎng)度一一寫(xiě)入比降計(jì)算表中Fetch First From Gradient' 游標(biāo)指向比降計(jì)算表的第一條記錄Fetch First From ReachLen' 游標(biāo)指向河段長(zhǎng)度表的第一條記錄Do While Not
28、 EOT(ReachLen)E = Gradient.ElevL = ReachLen.LengthSelect * From Gradient Where Elev = EUpdate Selection Set Len = LFetch Next From GradientFetch Next From ReachLenLoop.精品文檔' 銷(xiāo)毀河段長(zhǎng)度臨時(shí)表Drop Table ReachLen' 保存比降計(jì)算表Commit Table Gradient End Sub'-' 功能:計(jì)算河道比降' 算法:統(tǒng)計(jì)河道總長(zhǎng),計(jì)算河道比降'-Function CalcGradient As FloatDim L As
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版摩托車(chē)二手交易評(píng)估與鑒定服務(wù)合同4篇
- 2025非全日制勞務(wù)派遣合同樣本:二零二五年度用工協(xié)議3篇
- 二零二五版廠(chǎng)房租賃合同標(biāo)準(zhǔn):租賃廠(chǎng)房周邊環(huán)境維護(hù)責(zé)任3篇
- 2025年度環(huán)保監(jiān)測(cè)軟件服務(wù)升級(jí)及數(shù)據(jù)統(tǒng)計(jì)分析合同3篇
- 2025年度補(bǔ)充耕地指標(biāo)出讓與農(nóng)業(yè)科技推廣合同3篇
- 二零二五年度古董藝術(shù)品售后服務(wù)與維權(quán)合同3篇
- 2025年度配音行業(yè)人才培養(yǎng)與輸送合同4篇
- 2025年度旅游紀(jì)念品采購(gòu)合同書(shū)下載3篇
- 2025年度高速公路養(yǎng)護(hù)勞務(wù)分包合同范本
- 2025年度個(gè)人二手房交易合同樣本7篇
- 勞務(wù)協(xié)議范本模板
- 2024年全國(guó)職業(yè)院校技能大賽高職組(生產(chǎn)事故應(yīng)急救援賽項(xiàng))考試題庫(kù)(含答案)
- 2025大巴車(chē)租車(chē)合同范文
- 老年上消化道出血急診診療專(zhuān)家共識(shí)2024
- 人教版(2024)數(shù)學(xué)七年級(jí)上冊(cè)期末測(cè)試卷(含答案)
- 2024年國(guó)家保密培訓(xùn)
- 2024年公務(wù)員職務(wù)任命書(shū)3篇
- CFM56-3發(fā)動(dòng)機(jī)構(gòu)造課件
- 會(huì)議讀書(shū)交流分享匯報(bào)課件-《殺死一只知更鳥(niǎo)》
- 2025屆撫州市高一上數(shù)學(xué)期末綜合測(cè)試試題含解析
- 公司印章管理登記使用臺(tái)賬表
評(píng)論
0/150
提交評(píng)論