簡介
批處理(Batch),也稱為批處理腳本。批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它套用於DOS和Windows系統中。自動批處理即不需程式設計師操縱而主動直接操作的批處理過程,主要套用於批量處理大量數據、檔案。
研究背景
當數據量巨大且所需操作繁瑣時,採用逐個檔案人工處理,從技術層面看不成問題,但由於數據量龐大,數據組織目錄層次深,採用人工處理,不僅工作量大,而且容易漏轉換或檔案被再次誤轉換,存在質量隱患,因此必須採用自動批處理。
關鍵技術
項目的關鍵問題是要解決數據處理的唯一性問題,即既不漏處理,也不重複處理。由於數據源龐大,難以採用人工的方法進行分析,歸納、歸類處理,而且最怕的是漏轉換,多次轉換。因此,需要採用一種有效的方法對所關心的問題,給定規則或條件,進行數據探測。數據探測就是對數據對象進行遍列,實質是對數據源的目錄與檔案進行遍列。對於有限深度的數據源或深度已知的數據源,可以採用for(),do{}while()等常規編程手段,給定探測深度,對數據源進行挖掘。但本項目由於數據的龐大和複雜性,顯然常規手段難以達到目的。根據數據源的特點,考慮採用遞歸技術,使轉換程式具備自動批量功能。
在程式設計中,遞歸在算法的描述中被經常採用,很多問題可以用遞歸算法求解。例如,有些問題的定義形式本身就是遞歸的,如階乘函式;有些數據結構,如二叉樹、廣義表等,由於結構本身固有的遞歸特性,所以對它們的操作可以遞歸進行;還有一類,雖然問題本身沒有明顯的遞歸結構,但用遞歸技術求解比其他方法更容易,如最經典的漢諾塔問題和八皇后問題等。另外,由於遞歸算法省略了程式設計中的許多細節操作,簡化了程式設計過程,使得在求解許多複雜問題時,採用遞歸算法比不用遞歸算法要簡單得多,並且程式結構清晰、易讀,正確性容易驗證,這給用戶編製程序和調試程式帶來很大方便。
所謂遞歸,就是指用自身的結構來描述自身,以實現層次數據結構的查詢和訪問。遞歸算法常用於遞歸調用方面,即子過程或函式自己調用自己。
遞歸調用必須是有限的,有限才有意義。所以必須設定相關的控制條件,使其成為有限。這可以通過條件語句(If語句)來實現,即只有在設定的條件成立時遞歸才繼續,否則終止遞歸。可見,構成遞歸必須滿足以下條件:
(1)有明確的結束遞歸的邊界條件(又稱終止條件)以及結束時的邊界值;
(2)過程的描述中包含其本身,即能用遞歸形式表示,且遞歸向終止條件發展。遞歸算法求解問題的基本思想是:對於較為複雜的問題,把原問題分解成若干個相對簡單且類同的子問題,這樣原問題就可遞推得到求解。
當一個問題存在上述構成遞歸的條件時,該問題便可以利用遞歸算法進行處理。具體是:
當所求解問題難於直接求解時,首先,把問題分解成若干個難度較小、較容易求解的子問題,子問題與原問題具有類同的結構。如果子問題能夠直接求解,則解之;如果子問題仍不能直接求解,將每個子問題再分解成若干個更簡單的子問題,直到分解出的子問題能夠很容易地求解或解為已知,這是實現遞歸的模板。然後,設計遞歸出口(即結束遞歸的邊界條件),在滿足出口條件時,遞歸函式不能再調用自己,必須返回一個確定的值。將這兩個方面的問題分析好之後,就可以在子程式體中定義遞歸調用了。
在通常情況下,遞歸調用都是要受到條件控制的,而且在被調用的過程中,會對調用條件進行有規律的修改,直到滿足邊界條件,返回邊界值,結束遞歸;然後按照原來的路徑逐層返回,求出原問題的解。由此可知,遞歸算法設計的關鍵在於遞歸描述和遞歸終止條件。
遞歸算法的執行過程是不斷地自調用,直到到達遞歸出口才結束。然後,遞歸算法開始按最後調用的過程最先返回的次序逐層返回,返回到最外層的調用語句時遞歸算法執行過程結束。可見,遞歸的實現過程包含了“調用”和“返回”兩個階段。
主要技術問題
要實現項目數據的自動批處理,除基於遞歸技術編程開發外,尚需解決以下主要技術問題。
轉換對象坐標取位不一致
對於測繪數據而言,在不含帶號的情況下,X為6個整數位,Y為7個整數位。由於種種原因,數據源中的坐標數據取位相當凌亂,既有在統一坐標系的前提下的不同取位數據,也有獨立坐標系坐標的數據,個別的是經過坐標旋轉過的數據。如果按自身檔案的坐標值直接插入拼接處理,顯然不合適。
解決方法:
(1)首先利用已有的基礎地理信息數據,諸如1:1萬地圖數據和水利、地名數據等,建立簡易且有效的地理信息框架檢核資料庫。
(2)採用遞歸技術遍列數據源,對於坐標取值不足位(X為6個整數位,Y為7個整數位)的數據,先補足其整數位,判斷補位後的坐標取值範圍是否合理,若不合理,重新補位直至合理。然後利用“地理信息框架檢核資料庫”的數據對諸如公路、地名、水系等框架數據進行比較檢核。若檢核獲通過,將數據檔案的相關信息記入“數據處理日誌資料庫”,信息包括:原檔案的名稱、路徑、數據坐標的取位情況,坐標補位數值,從原檔案中獲取的坐標系統信息,測圖時間、測圖單位等,同時獲取並記錄該數據檔案的所覆蓋範圍的坐標串。
(3)對於經上述步驟處理與檢核,不符合要求的檔案,暫時將其作為獨立坐標系,單獨人工處理:由熟悉本地地理情況的人員分析判斷個案處理,或查詢其他的文檔記載後分析處理。經驗證,除少量數據需要人工處理外,絕大部分檔案通過上述的前兩個步驟正確處理到位。
歷史數據與最新數據問題
採用遞歸技術遍列數據源,建立數據源的數據檔案信息資料庫,通過拓撲分析:
(1)區域內只有唯一一套數據時,該數據被認為是當前最新的測圖數據;
(2)當區域內有兩套或以上數據交集時,按測圖年份取最近測的地形圖作為當前的測圖數據,其他數據作為歷史數據,建立到歷史資料庫中。
坐標轉換
原理是:首先獲取描述實體位置信息的定位點坐標,然後根據嚴密的坐標轉換公式計算出轉換後的坐標值;最後通過修改實體定位點的坐標為轉換後的坐標值。每一類實體均要單獨處理,常見地形圖中包含的實體主要有:點(Point)、文本(Text)、直線(Line)、多線(MLine)、多段線(Polyline)、樣條曲線(Spline)、弧(Arc)、圓(Circle)、橢圓或橢圓弧(Ellipse)、塊(Block)、圖案填充(Hatch)等。之所以每一類實體要單獨處理,是因為每類實體有不同的位置定義,例如文本是由位置點(position)定位的;弧是由弧心點(center)、半徑(radius)、起始角(startAngle)、終止角(endAngle)定位的等。
布局及視口的處理
對於某些規劃圖,圖面信息記錄在布局中,因此需要對布局進行轉換。對於這種情況,程式處理過程是:首先獲取模型空間圖元坐標信息進行轉換,然後獲取所有布局空間圖元坐標信息進行轉換,由於布局空間圖元是與視口(Viewport)關聯的,因此只需對視口進行坐標轉換即可,對於視口來說,有兩個中心坐標,一個是視口的中心點(視口在布局中的中心點坐標),另一個是當前視口中視圖的中心點(視口中視圖在模型空間的中心點),當模型空間圖元坐標轉換後,布局空間視口中的視圖中心點坐標也應該相應做轉換,所以轉換此坐標即可轉換該視口。
基於ObjectARX坐標轉換程式開發
由於ObjectARX使用了C++方法,並以動態程式庫的形式被調用,因此執行速度快,安全性好。與其他幾種開發工具相比,其獨有的對AutoCAD內部數據結構的直接使用和擴展,使它的功能得到了極大的增強,而且ObjectARX庫包含了各種工具,用戶可以利用這些工具來使用AutoCAD的開放結構,並且可以直接訪問AutoCAD資料庫、圖形系統和用戶自定義命令。
自動批處理檔案
自動批處理檔案(AUTOCJTEXE.BAT)與系統配置檔案(COIFG.)是存在於系統SSY盤根目錄下的兩個檔案。在O啟動過程DOS中,系統要在根目錄尋找CONIFG.SYS並執行它,DOS啟動後,緊接著也要在根目錄下尋找AUTOEXEC.BAI,並執行。
為了防止他人進入系統查看或更改自動批處理檔案和系統配置檔案,可將這兩個檔案改名。通常,微機上的這兩個檔案是在根目錄下才起作用,通過工具PC5(PC.Tools5.0)可將其改名。