摘  要:大地測(cè)量數(shù)據(jù)處理已向自動(dòng)化處理方向發(fā)展,要求數(shù)據(jù)處理人員具有軟件設(shè)計(jì)綜合能力,各種軟件設(shè)計(jì)新技術(shù)的出現(xiàn),使開(kāi)發(fā)人員應(yīng)接不暇。從軟件開(kāi)發(fā)方法、軟件重用、數(shù)據(jù)庫(kù)應(yīng)用和算法設(shè)計(jì)基本原則等方面對(duì)大地測(cè)量軟件設(shè)計(jì)方法進(jìn)行了研究,并初步給出了相關(guān)問(wèn)題的解決策略,介紹了這些方法在高精度重力網(wǎng)數(shù)據(jù)處理中的應(yīng)用實(shí)例.

     關(guān)鍵字:軟件開(kāi)發(fā)  數(shù)據(jù)庫(kù)  軟件重用  算法設(shè)計(jì)  大地測(cè)量數(shù)據(jù)處理
 
1 引言
     隨著現(xiàn)代測(cè)繪技術(shù)的發(fā)展,需要大地測(cè)量數(shù)據(jù)處理軟件具有強(qiáng)大的功能和方便的操作,計(jì)算機(jī)硬件的發(fā)展已經(jīng)能夠滿足系統(tǒng)快速開(kāi)發(fā)的要求,各種開(kāi)發(fā)工具的不斷涌現(xiàn),使測(cè)量軟件開(kāi)發(fā)人員應(yīng)接不暇。但每種工具都有其開(kāi)發(fā)的強(qiáng)項(xiàng),如MAPINFO 適合開(kāi)發(fā)桌面地理信息系統(tǒng)[1],POWER BUILDER(PB)適合開(kāi)發(fā)數(shù)據(jù)庫(kù)管理[2],VISUAL C++適合開(kāi)發(fā)WINDOWS應(yīng)用,F(xiàn)ORTRAN適合開(kāi)發(fā)科學(xué)計(jì)算,各種數(shù)據(jù)庫(kù)為數(shù)據(jù)管理提供了強(qiáng)有力的工具。開(kāi)發(fā)大地測(cè)量數(shù)據(jù)處理軟件的人員一般是測(cè)量專業(yè)人員,對(duì)數(shù)據(jù)結(jié)構(gòu)、計(jì)算方法及計(jì)算機(jī)等專業(yè)知識(shí)的培訓(xùn)較少,設(shè)計(jì)的數(shù)據(jù)處理算法往往憑數(shù)學(xué)公式來(lái)設(shè)計(jì),算法穩(wěn)定性差,計(jì)算誤差比較大。另一方面,前人采用各種開(kāi)發(fā)工具,完成了許多成熟的專業(yè)軟件。怎樣使測(cè)繪專業(yè)人員在最短的時(shí)間內(nèi)充分整合好這些開(kāi)發(fā)工具的優(yōu)勢(shì),利用寶貴的現(xiàn)有軟件,開(kāi)發(fā)出功能強(qiáng)大、系統(tǒng)穩(wěn)定性強(qiáng)的軟件,在工作實(shí)踐中,我們進(jìn)行了一些探索。本文從軟件開(kāi)發(fā)方法、軟件新技術(shù)和算法設(shè)計(jì)原則等方面討論了大地測(cè)量數(shù)據(jù)處理軟件設(shè)計(jì)的方法,介紹了這些方法在高精度重力網(wǎng)數(shù)據(jù)處理中的應(yīng)用實(shí)例。
 
2 軟件開(kāi)發(fā)方法
     2.1 結(jié)構(gòu)化開(kāi)發(fā)方法
     結(jié)構(gòu)化開(kāi)發(fā)方法是一種傳統(tǒng)的方法,是為廣大系統(tǒng)開(kāi)發(fā)人員所熟悉的基本方法。它采用自上而下、逐步求精的思想,將系統(tǒng)功能按層次進(jìn)行分解。
     在系統(tǒng)分析階段,強(qiáng)調(diào)系統(tǒng)能夠“做什么”;在系統(tǒng)設(shè)計(jì)階段,強(qiáng)調(diào)系統(tǒng)“如何做”,界面清晰,易于理解,采用圖示工具附加語(yǔ)義說(shuō)明的方法闡述系統(tǒng)結(jié)構(gòu)和功能,便于系統(tǒng)開(kāi)發(fā)人員和用戶的相互交流,對(duì)系統(tǒng)的一致性理解。采用的主要方法有:數(shù)據(jù)流圖法(DFD)、結(jié)構(gòu)化分析/結(jié)構(gòu)化設(shè)計(jì)方法(SA/SD)、IDEF法、Jachson法等[3]。該方法的核心在于將系統(tǒng)中的功能與數(shù)據(jù)分割開(kāi)來(lái)。為開(kāi)發(fā)大地測(cè)量數(shù)據(jù)處理軟件,在開(kāi)發(fā)之前必須詳細(xì)了解大地測(cè)量數(shù)據(jù)處理的全過(guò)程和細(xì)節(jié),并且認(rèn)真分析,了解測(cè)量各專業(yè)的發(fā)展方向。
     2.2 面向?qū)ο蟮拈_(kāi)發(fā)方法
     面向?qū)ο蟮拈_(kāi)發(fā)方法是著重解決系統(tǒng)需求變化和維護(hù)困難等問(wèn)題發(fā)展起來(lái)的一種新的軟件開(kāi)發(fā)方法,基本要點(diǎn)是:
     在系統(tǒng)分析階段,用問(wèn)題空間中實(shí)體及其相互關(guān)系建立系統(tǒng)邏輯模型,以一種更加自然的方式描述系統(tǒng)需求和體系結(jié)構(gòu)。由于空間問(wèn)題中的對(duì)象是相對(duì)穩(wěn)定的,即使有變化,通常只影響系統(tǒng)局部或系統(tǒng)需求變化的局部化,從而使系統(tǒng)具有一個(gè)相對(duì)穩(wěn)定的結(jié)構(gòu)。
     系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)是對(duì)分析階段達(dá)到的邏輯模型的細(xì)化和實(shí)例化[3]。以重力點(diǎn)為例,定義測(cè)點(diǎn)有經(jīng)度、緯度、高程等屬性,有坐標(biāo)轉(zhuǎn)換等操作;以測(cè)點(diǎn)為父類,重力點(diǎn)繼承他的屬性,增加專有屬性重力值,增加重力異常、高程異常、垂線偏差計(jì)算等操作,最終以代碼的形式出現(xiàn)在設(shè)計(jì)與實(shí)現(xiàn)模型中,使得分析與設(shè)計(jì)具有無(wú)縫連接,如坐標(biāo)轉(zhuǎn)換有問(wèn)題,僅在測(cè)點(diǎn)類中修改,而不在重力點(diǎn)對(duì)象中修改,系統(tǒng)易于測(cè)試和維護(hù)。
     系統(tǒng)開(kāi)發(fā)過(guò)程是系統(tǒng)需求、分析、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試等一系列模型的細(xì)化過(guò)程,可以有效解決系統(tǒng)復(fù)雜性問(wèn)題。同時(shí),構(gòu)成系統(tǒng)基本單元——對(duì)應(yīng),有利于被設(shè)計(jì)成具有標(biāo)準(zhǔn)界面的軟件構(gòu)件,即把對(duì)象和操作封裝在一起,對(duì)重力點(diǎn)對(duì)象來(lái)說(shuō),就把重力點(diǎn)和它的計(jì)算——重力異常、高程異常、垂線偏差等計(jì)算的程序封裝在一起,以后要計(jì)算重力異常、高程異常、垂線偏差等,只要調(diào)用這個(gè)對(duì)象就行,使之具有一定程度的可重用性,為軟件開(kāi)發(fā)的規(guī)模化奠定基礎(chǔ)。
 
3 軟件開(kāi)發(fā)新技術(shù)
     一種開(kāi)發(fā)工具理論上能開(kāi)發(fā)功能較多的應(yīng)用程序,同時(shí)不同的開(kāi)發(fā)工具理論上能開(kāi)發(fā)功能相同的應(yīng)用程序。如VC和匯編語(yǔ)言理論上都能開(kāi)發(fā)完成一種應(yīng)用程序,但開(kāi)發(fā)難度和工作量會(huì)大大不同。在進(jìn)行軟件開(kāi)發(fā)時(shí),通常采用不同的開(kāi)發(fā)工具,充分利用各工具的開(kāi)發(fā)優(yōu)勢(shì),既快又好地開(kāi)發(fā)出一個(gè)功能強(qiáng)大的應(yīng)用程序。
     3.1 數(shù)據(jù)庫(kù)技術(shù)
     在一般的應(yīng)用程序設(shè)計(jì)中,由應(yīng)用程序自己管理數(shù)據(jù),數(shù)據(jù)不共享,數(shù)據(jù)不具有獨(dú)立性,當(dāng)數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)發(fā)生變化時(shí),必須對(duì)應(yīng)用程序做相應(yīng)的修改,這樣,造成軟件的適應(yīng)范圍差。在實(shí)際應(yīng)用中需要信息資源的共享,關(guān)鍵是要有好的數(shù)據(jù)接口技術(shù)與接口標(biāo)準(zhǔn)[4-6]。
     采用數(shù)據(jù)庫(kù)系統(tǒng)來(lái)管理數(shù)據(jù),數(shù)據(jù)具有很強(qiáng)的結(jié)構(gòu)性,存取數(shù)據(jù)的方式非常靈活,可以存取數(shù)據(jù)的一個(gè)數(shù)據(jù)項(xiàng)、一組數(shù)據(jù)項(xiàng)、一條記錄等。數(shù)據(jù)共享性好,冗余度低,能夠避免數(shù)據(jù)之間的不相容性和不一致性。數(shù)據(jù)庫(kù)系統(tǒng)具有數(shù)據(jù)總體邏輯結(jié)構(gòu)與局部邏輯結(jié)構(gòu)的對(duì)應(yīng)轉(zhuǎn)換功能,當(dāng)系統(tǒng)的邏輯結(jié)構(gòu)改變時(shí)可以保證數(shù)據(jù)局部結(jié)構(gòu)不變,應(yīng)用程序就不用修改;另外,數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)與邏輯結(jié)構(gòu)具有映射功能,當(dāng)數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)發(fā)生改變時(shí),不影響數(shù)據(jù)邏輯結(jié)構(gòu)。由于數(shù)據(jù)與程序間存在獨(dú)立性,簡(jiǎn)化了程序的編制、維護(hù)和修改。此外,數(shù)據(jù)庫(kù)系統(tǒng)具有數(shù)據(jù)完整性、安全性等控制,能充分保證數(shù)據(jù)的安全、恢復(fù)以及多用戶同時(shí)使用等。
     建立數(shù)據(jù)庫(kù)系統(tǒng)信息模型方法主要有ER法和IDEF1X方法,用范式1NF——5NF對(duì)信息模型進(jìn)行轉(zhuǎn)換為特定的數(shù)據(jù)結(jié)構(gòu)模型,依據(jù)數(shù)據(jù)局部邏輯結(jié)構(gòu)進(jìn)行程序設(shè)計(jì)[7]。在計(jì)算機(jī)輔助設(shè)計(jì)CAD和桌面地理信息系統(tǒng)MAPINFO中就采用了數(shù)據(jù)庫(kù)技術(shù),才使該系統(tǒng)具有強(qiáng)大的實(shí)用功能。
     3.2 軟件重用技術(shù)
     3.2.1  DLL模式
     動(dòng)態(tài)鏈接庫(kù)DLL(dynamic link library),像靜態(tài)鏈接庫(kù)一樣,是函數(shù)的集合。當(dāng)一個(gè)應(yīng)用程序使用動(dòng)態(tài)鏈接庫(kù)的函數(shù)時(shí),該函數(shù)不包含在可執(zhí)行程序中,只有當(dāng)應(yīng)用程序用到庫(kù)中的函數(shù)時(shí)才將其調(diào)入內(nèi)存中。這種鏈接方式稱為動(dòng)態(tài)鏈接。
     采用這種方式具有如下優(yōu)點(diǎn):節(jié)省時(shí)間和空間、無(wú)需要再鏈接、共享代碼和數(shù)據(jù)、維護(hù)獨(dú)立、功能擴(kuò)展,提高了程序開(kāi)發(fā)的效率。
     DLL的位置:DLL應(yīng)放在執(zhí)行文件目錄、當(dāng)前目錄、Windows目錄、Windowssystem目錄和在path中指定的路徑目錄下,查找順序由前到后。注意:不要在以上目錄保存多個(gè)版本的DLL,否則可能引起混亂。
     目前大多數(shù)應(yīng)用程序和開(kāi)發(fā)工具能提供DLL編譯能力,提供__fastcall、__pascal、__stdcall、__cdecl等參數(shù)調(diào)用約定,能實(shí)現(xiàn)多種語(yǔ)言的混合編程。在測(cè)繪各專業(yè)中,有許多用FORTRAN77編寫(xiě)的經(jīng)典程序,對(duì)他們進(jìn)行適當(dāng)?shù)男薷,就能被其它語(yǔ)言調(diào)用,這樣就有效的保護(hù)和利用已有的成果。
     3.2.2  Active X 、OCX模式
     動(dòng)態(tài)數(shù)據(jù)交換DDE(dynamic data exchange )是使用基于消息機(jī)制來(lái)實(shí)現(xiàn)兩個(gè)不同Windows應(yīng)用程序之間數(shù)據(jù)交換的工具。通過(guò)使用API可調(diào)用DDE動(dòng)態(tài)庫(kù)DDEML,這樣使DDE服務(wù)過(guò)程簡(jiǎn)單化,通過(guò)DDE技術(shù),有利于應(yīng)用程序間發(fā)送和接收數(shù)據(jù)和命令。通過(guò)這種方法,使應(yīng)用程序之間進(jìn)行數(shù)據(jù)共享、遠(yuǎn)程執(zhí)行命令或檢查錯(cuò)誤等。在DDE中,一個(gè)應(yīng)用作為客戶端,另一個(gè)應(yīng)用作為服務(wù)器,他們通過(guò)事務(wù)進(jìn)行通信。一個(gè)客戶端應(yīng)用向支持DDE的另一方(服務(wù)器)發(fā)出請(qǐng)求,請(qǐng)求可以是數(shù)據(jù)也可以是命令(如:打開(kāi)、關(guān)閉、保存等)。一個(gè)服務(wù)方應(yīng)用是相對(duì)于客戶端的另一方,它響應(yīng)客戶端的請(qǐng)求,依據(jù)客戶端請(qǐng)求,向它提供數(shù)據(jù)和服務(wù)(可以是命令)。
     OCX、ActiveX 是建立在對(duì)象連接和嵌入OLE(object linking and embedding)基礎(chǔ)上的,得到廣泛支持的面向?qū)ο蟮能浖杉夹g(shù),用戶像用磚塊蓋房子一樣來(lái)組合軟件和應(yīng)用程序。
     在許多開(kāi)發(fā)工具中都提供了ActiveX能力和調(diào)用ActiveX、OCX的能力,如visual c++、visual basic、dephi等。許多專業(yè)公司提供了眾多的ActiveX、OCX控件,如MAPINFO 、ERSI 的MapObjects和MICRSOFT 的COMMON.OCX等眾多的控件可以被調(diào)用。
     3.3 基于網(wǎng)絡(luò)的分布式系統(tǒng)設(shè)計(jì)方法
     分布式系統(tǒng)突出的特點(diǎn)在于構(gòu)成系統(tǒng)的各部分在地域上的分散性、自治性及各部分之間相互聯(lián)系與制約所表現(xiàn)出來(lái)的功能與性能的綜合性。系統(tǒng)具有數(shù)據(jù)的分布性和功能分布性等特點(diǎn)。比較適合的計(jì)算模型有兩種,一種是客戶—服務(wù)器模式(client/sever,C/S);另一種是客戶—代理—服務(wù)器模式(client/broker/server,C/B/S)[8]。
     C/S模式通過(guò)遠(yuǎn)程過(guò)程調(diào)用機(jī)制(RPC)和網(wǎng)絡(luò)應(yīng)用編程接口(API)實(shí)現(xiàn)。優(yōu)點(diǎn)是處理能力強(qiáng)、方便的資源共享、可以預(yù)測(cè)響應(yīng)時(shí)間。缺點(diǎn)是系統(tǒng)維護(hù)困難。
     C/B/S模式是指在客戶與服務(wù)器間加入代理(broker),是客戶與服務(wù)器之間具有動(dòng)態(tài)的可變的關(guān)系,支持同步與異步通信?蓴U(kuò)展性、可維護(hù)性、可重用性強(qiáng)。
     充分利用好軟件發(fā)展中各種成熟的新技術(shù),不僅能有效利用和保護(hù)早期的成果,關(guān)鍵是能有效提高開(kāi)發(fā)速度,使應(yīng)用程序具有良好的可維護(hù)性,對(duì)系統(tǒng)的部分修改,不影響系統(tǒng)的正常使用。

4 大地測(cè)量數(shù)據(jù)處理軟件算法設(shè)計(jì)原則
     4.1 大地測(cè)量數(shù)據(jù)處理的工作模式
     用計(jì)算機(jī)來(lái)處理大地測(cè)量的各種信息,就是對(duì)獲得的觀測(cè)信息網(wǎng)絡(luò)的分析、處理、對(duì)多種成果的綜合應(yīng)用等問(wèn)題進(jìn)行程序設(shè)計(jì),最后得到需要的計(jì)算結(jié)果(如概算值、平差值和其它產(chǎn)品等)。其具體的工作方式如下:
     4.2 大地測(cè)量數(shù)據(jù)處理誤差來(lái)源
     任何一個(gè)用計(jì)算機(jī)來(lái)處理的測(cè)量問(wèn)題都必須經(jīng)過(guò)上述五步,缺一不可。數(shù)值計(jì)算方法和程序設(shè)計(jì)是由掌握計(jì)算機(jī)知識(shí)較多的人員進(jìn)行,這兩步往往合為一步。因此誤差來(lái)源主要由觀測(cè)誤差、模型誤差和計(jì)算誤差組成[9-11]。
     觀測(cè)誤差是由于實(shí)際問(wèn)題的各種觀測(cè)方法、觀測(cè)儀器和環(huán)境等造成的,其限差都有相應(yīng)的規(guī)范。模型誤差是對(duì)實(shí)際問(wèn)題的數(shù)學(xué)抽象而產(chǎn)生的誤差。實(shí)際測(cè)量問(wèn)題和相應(yīng)的數(shù)學(xué)處理方案是幾代測(cè)繪專家多年的研究成果,其誤差有專門(mén)的研究,現(xiàn)有的誤差肯定已經(jīng)減小到最小。它們?cè)诖蟮販y(cè)量數(shù)據(jù)處理軟件開(kāi)發(fā)中可以不必考慮。
     計(jì)算誤差是對(duì)數(shù)學(xué)處理方案的理解和對(duì)方案進(jìn)行程序設(shè)計(jì)而引起的誤差,它包括截?cái)嗾`差和舍入誤差。當(dāng)數(shù)學(xué)模型得不到精確解時(shí),要用數(shù)值計(jì)算方法求出它得近似解,由此產(chǎn)生的誤差叫截?cái)嗾`差或方法誤差。由于任何計(jì)算機(jī)的字長(zhǎng)都是用有限的,原始數(shù)據(jù)的輸入和浮點(diǎn)運(yùn)算過(guò)程中都可能產(chǎn)生誤差,只能用有限的數(shù)來(lái)代替無(wú)窮小的數(shù),這樣產(chǎn)生的誤差叫舍入誤差。成千上億次計(jì)算,對(duì)精度可能有較大的影響。所以在數(shù)值計(jì)算中對(duì)截?cái)嗾`差和舍入誤差應(yīng)給予足夠的重視,我們可以通過(guò)對(duì)算法的設(shè)計(jì)和改進(jìn)來(lái)進(jìn)行控制。
     4.3 大地測(cè)量數(shù)據(jù)處理算法設(shè)計(jì)原則
     算法是對(duì)一些數(shù)據(jù)按某種規(guī)定的順序進(jìn)行運(yùn)算的序列。一個(gè)算法,如果計(jì)算結(jié)果受誤差的影響小,就稱這個(gè)算法具有較好的數(shù)值穩(wěn)定性。如果受誤差的影響較大,則稱這個(gè)算法的數(shù)值穩(wěn)定性差。在大地測(cè)量數(shù)據(jù)處理軟件設(shè)計(jì)中,要設(shè)計(jì)具有數(shù)值穩(wěn)定性好的算法,必須遵守如下基本原則:
     a、充分利用原始觀測(cè)數(shù)據(jù),減少程序舍入誤差。
     b、避免數(shù)值相近的兩個(gè)數(shù)相減。
     c、注意調(diào)整變量計(jì)算順序,保護(hù)重要數(shù)據(jù),防止數(shù)值較大的數(shù)“吃掉”較小的數(shù)。
     例如:6378140 + 0.000001 + 0.000002 +0.000004 + 0.000003,如直接計(jì)算,計(jì)算機(jī)操作系統(tǒng)通過(guò)對(duì)階,就可能丟掉后面的小數(shù),而應(yīng)通過(guò)改變計(jì)算次序,變?yōu)?378140 + (0.000001 + 0.000002 +0.000004 + 0.000003)。
     d、注意簡(jiǎn)化計(jì)算步驟,減少運(yùn)算次數(shù),利用好的算法,避免誤差積累。
     在大地測(cè)量數(shù)據(jù)處理中, 這類計(jì)算是較多的,如直接計(jì)算,要進(jìn)行n(n+1)/2次加乘法和n次加法。如改變計(jì)算次序,則 ,則只進(jìn)行n次加法和n次乘法。如在程序循環(huán)中,則能顯著提高計(jì)算速度并減少誤差積累。
     e、算法設(shè)計(jì)中,注意避免絕對(duì)值較小的數(shù)作除數(shù)。
     f、在比較兩數(shù)是否相等時(shí),不要用浮點(diǎn)數(shù),而采用整型數(shù)或比較兩數(shù)的差值小于一個(gè)更小量級(jí)微小數(shù)的方法。
 
5 開(kāi)發(fā)實(shí)例
     在“高精度重力網(wǎng)數(shù)據(jù)處理” 系統(tǒng)的軟件設(shè)計(jì)中,充分采用了結(jié)構(gòu)化、面向?qū)ο箝_(kāi)發(fā)方法和數(shù)據(jù)庫(kù)技術(shù)、DLL、Active X和網(wǎng)絡(luò)分布技術(shù)等新技術(shù)。采用Sybase數(shù)據(jù)庫(kù)系統(tǒng)來(lái)管理高精度重力網(wǎng)數(shù)據(jù)處理軟件中所需要的數(shù)據(jù),使數(shù)據(jù)相對(duì)獨(dú)立和安全;用FORTRAN來(lái)開(kāi)發(fā)系統(tǒng)預(yù)處理和平差程序,編譯成DLL供PB調(diào)用,解決PB計(jì)算能力相對(duì)較差的問(wèn)題;用PB來(lái)開(kāi)發(fā)應(yīng)用程序主框架,采用了面向?qū)ο蟮拈_(kāi)發(fā)方法,利用C/S模式對(duì)后臺(tái)數(shù)據(jù)進(jìn)行管理,并從數(shù)據(jù)庫(kù)提取計(jì)算處理所需要的數(shù)據(jù),再用處理后的結(jié)果更新數(shù)據(jù)庫(kù);在用PB來(lái)開(kāi)發(fā)應(yīng)用程序中插入Active X地理信息系統(tǒng)圖形控件MapX,進(jìn)行地理圖形功能開(kāi)發(fā),使整個(gè)系統(tǒng)具有簡(jiǎn)單的GIS功能。通過(guò)應(yīng)用2000國(guó)家重力基本網(wǎng)數(shù)據(jù)處理的實(shí)踐,充分說(shuō)明了系統(tǒng)具有功能齊全,穩(wěn)定性強(qiáng),計(jì)算精度高等特點(diǎn)。