李志國,王庶懋,劉 欽
(1.中國電力工程顧問集團華東電力設計院有限公司,200063,上海;2.中國地震臺網(wǎng)中心,100036,北京)
鉆探是各類勘察工程的主要手段之一[1]。各種類型的工程勘察柱狀圖是日??辈旃ぷ髦挟a(chǎn)出的最基本,也是使用數(shù)量最多的鉆探成果圖件。應用于工程勘察的柱狀圖包括單孔鉆孔柱狀圖、動力觸探試驗成果圖、靜力觸探試驗成果圖等多種類型的圖件。這類圖件如采用傳統(tǒng)的手工繪制方式,往往效率低,容易出錯而且不易修改,不能滿足實際工作的需要。隨著計算機技術的應用,國內(nèi)外開發(fā)了一系列專業(yè)軟件實現(xiàn)鉆孔柱狀圖的繪制,但是這些軟件往往是半自動成圖,修改起來也不方便,而且不能根據(jù)專業(yè)特點添加填充圖樣[2]。為了能夠更好地完成鉆孔柱狀圖的繪制,現(xiàn)代繪制技術主要分為兩類:一類采用AutoCAD、CorelDRAW等計算機輔助制圖軟件進行鉆孔柱狀圖的自動或半自動生成;另一類采用ArcGIS、MapInfo等組件式GIS平臺進行二次開發(fā)生成鉆孔柱狀圖[3]。這2種方式往往均存在通用性、靈活性和擴展性不強等問題,無法對產(chǎn)出模板進行靈活的定義。
針對以上問題,本文提出基于Jinja2模板引擎,通過Excel排版實現(xiàn)鉆孔柱狀圖模板格式配置的靈活定義和表達?;贏rcGIS平臺,利用空間數(shù)據(jù)和屬性數(shù)據(jù)管理功能,實現(xiàn)鉆孔數(shù)據(jù)在模板引擎上的渲染,以及鉆孔柱狀圖的自動繪制和輸出功能。
從各類圖件的表現(xiàn)形式中可以看出,鉆孔柱狀圖是一種表格式的圖件。表格中地層厚度、試驗曲線、取樣位置等單元格比較特殊,其高度需要按比例符合實際的精確度,而地層描述等單元格則需要根據(jù)描述內(nèi)容文字的高度,通過緩沖線標識相對位置,以便達到整體美觀、協(xié)調(diào)的目的。
鉆孔柱狀圖的繪制內(nèi)容由文字、花紋、符號和曲線等要素構成。文字為表格中的各種數(shù)據(jù)和描述文字,花紋為柱狀圖中表示地層巖性的各種填充花紋,符號為柱狀圖中標識地下水位、標貫點和取樣類型等位置的點狀符號,曲線為靜力觸探、動力觸探等各類物理性質(zhì)試驗曲線。所有內(nèi)容的繪制和表達均需要符合國家、部門或行業(yè)的標準。
鉆孔數(shù)據(jù)由工程信息、鉆孔信息、地層信息、取樣信息、標貫信息、靜探信息、動探信息等一系列的表組成,每個與鉆孔相關的信息通過鉆孔編號相關聯(lián)。這些信息的錄入可以通過Excel導入的功能,按對應的項目導入到系統(tǒng)的數(shù)據(jù)庫中,也可直接讀取Excel中的數(shù)據(jù)進行柱狀圖的繪制。
根據(jù)不同行業(yè)的工程情況,可以將工程信息表、勘探點信息表、勘探點地層表、鉆孔取樣信息表、標貫試驗成果表、靜探試驗成果表、動探試驗成果表等信息建立數(shù)據(jù)模型。通過數(shù)據(jù)的導入,將成果信息轉(zhuǎn)換為JSON格式便于后續(xù)處理。
圖2 數(shù)據(jù)模型ER圖
本文提出的自動成圖工具利用ArcToolbox的開發(fā)接口,使用ArcPy實現(xiàn)用戶自定義工具,從而便捷快速地進行鉆孔柱狀圖的處理和產(chǎn)出。
ArcGIS Desktop軟件是ESRI公司開發(fā)的專業(yè)地理信息處理軟件,軟件的ArcToolbox工具箱提供了一套處理地理數(shù)據(jù)任務的工具集。ArcToolbox包含了ArcGIS地理處理的大部分分析工具和數(shù)據(jù)管理工具[4],這些工具可以單獨使用,也可以通過ModelBuilder工具把它們的處理流程連接起來,建立空間分析工作流模型,還可以通過代碼把這些工具引用到定制腳本中來創(chuàng)建自己的工具和工具箱,用來擴展ArcGIS的功能。本文采用ArcPy定制一系列的工具箱和工具的方式,來實現(xiàn)靈活的鉆孔柱狀圖產(chǎn)出功能。
自定義工具的整體結構包括定義參數(shù)、驗證參數(shù)和處理工作流3個部分。分別定義輸入的參數(shù),驗證參數(shù)合法性和執(zhí)行產(chǎn)出處理過程。
輸入數(shù)據(jù)可以選擇存放工程信息的數(shù)據(jù)庫或Excel文件,定義了數(shù)據(jù)輸出所需要的各類信息,默認輸出工程內(nèi)的所有鉆孔信息,也可以通過可選參數(shù),指定要輸出的鉆孔編號,來限定產(chǎn)出范圍。
圖3 自定義工具界面
為了實現(xiàn)鉆孔柱狀圖的靈活定義,出圖模板由兩部分組成,一個是基于Excel文件的鉆孔柱狀圖表格結構的數(shù)據(jù)模板,定義了鉆孔柱狀圖表格結構、變量位置等柱狀圖結構信息;一個是基于ArcGIS文件頁面布局的版面模板,定義了符號表達、標注位置、頁面布局等渲染出圖信息。
通過模板定義的表達信息實現(xiàn)出圖的表格結構和頁面框架,使用實際工程數(shù)據(jù),將模板中的動態(tài)內(nèi)容進行渲染,即可產(chǎn)出一套完整的鉆孔柱狀圖圖冊。
Jinja2是一個基于Python語言的模板引擎(Template Engine)。它定義了一套簡單易用的模板語言(Template Language),可以用來引用Json形式的數(shù)據(jù)對象,實現(xiàn)內(nèi)容的動態(tài)產(chǎn)出。當Jinja2應用于動態(tài)內(nèi)容產(chǎn)出的場景時,負責產(chǎn)出產(chǎn)品頁面的設計人員可以和負責數(shù)據(jù)產(chǎn)出的程序開發(fā)人員在約定好數(shù)據(jù)的結構后,就可以分別獨立同步進行各自的工作,程序開發(fā)人員可以只關注業(yè)務邏輯代碼的編寫,頁面設計人員可以只關注頁面的表現(xiàn)形式,并可以根據(jù)業(yè)務情況隨時靈活地修改頁面的結構信息,而不需要重新編寫代碼。利用模板引擎技術將數(shù)據(jù)資源從頁面表現(xiàn)中分離出來,為軟件的長期維護提供了便利。
采用Jinja2模板引擎技術,將數(shù)據(jù)與表格結構分離,構建了基于模板引擎技術的表格內(nèi)容結構定義系統(tǒng),利用Excel表格定義結構信息,實現(xiàn)了表格結構和展示內(nèi)容的靈活智能化定義。利用模板引擎,可以將變量使用雙花括號“{{變量名稱}}”標記,當Jinja2解釋器讀取到該內(nèi)容后,會自動將該變量替換為真正的指,從而實現(xiàn)基于數(shù)據(jù)的模板渲染。也可使用類似“{%...%}”格式的條件語句,針對不同的條件進行判斷和有針對性地輸出相關內(nèi)容。
文本擴展該項技術,將應用范圍擴大到Excel表格結構中。首先,將Excel的表格格式轉(zhuǎn)為Json格式;然后,利用Jinja2模板引擎渲染替換動態(tài)內(nèi)容,形成針對工程的表格Json數(shù)據(jù);最后,利用ArcGIS將該數(shù)據(jù)定義轉(zhuǎn)換為點、線、面和標記形式的數(shù)據(jù),在并擴展定義“{| S...| S}”形式的矢量標注標簽,從而將數(shù)據(jù)輸出到ArcGIS格式。
利用ArcGIS的StyleManager構建各類巖性花紋是一種解決方案[5],但是有2個問題,一是不同版本ArcGIS符號庫的兼容性問題會導致系統(tǒng)在不同的版本之間無法遷移,無法滿足靈活性的需要;二是無法進行復合花紋樣式的表達,由于地質(zhì)的復雜性,當遇到某一巖層出現(xiàn)多種巖性的情況時,需要將每種巖性對應的花紋樣式進行復合填充到同一區(qū)域。因此,本文使用AutoDESK公司的填充圖案為規(guī)則,將不同巖性的圖案通過算法寫入矢量文件中進行表達。
填充圖案在一個或多個文件擴展名為.pat的定義文件中定義。由標題行和描述行組成,下面是文件的基本格式。
*pattern-name[, description]
angle, x-origin,y-origin, delta-x,delta-y,dash-1,dash-2, …
第1行是標題行,以星號開頭;pattern-name定義了圖案名稱,方括號為可選的說明內(nèi)容。
第2行是圖案的描述行,可以有一行或多行;每條陣列線都被視為直線族的第1個成員,通過在2個方向上應用增量偏移來生成無限的平行線族而創(chuàng)建直線族,符號代表的含義如下。
angle代表繪制直線的角度;
x-origin,y-origin代表填充直線族中第一條直線所經(jīng)過點的X、Y軸坐標;
delta-x代表直線族成員之間在直線方向上的位移,它僅用于表達虛線;
delta-y代表直線族成員之間的間距,也就是多個直線間的垂直距離;
dash-n代表一條直線的長度,可取正、負值或為零,取正值表示該長度為實線,取負值表示該線段留空,取零則畫點。若不含dash-n,則為實線。
根據(jù)該算法,即可將多條線段組合成為需要的巖性填充符號,并填充在指定的區(qū)域內(nèi)。
對于復合巖性花紋,系統(tǒng)則自動識別其中的多個巖性,并在巖性花紋庫中進行查找比對,將多個巖性花紋在同一區(qū)域內(nèi)繪制,從而實現(xiàn)復合巖性花紋的表達。
在模板文件中,使用“{| SHTC={{hatch_name}}| S}”標簽動態(tài)定義要表達的巖性花紋符號,在系統(tǒng)渲染后,進行矢量內(nèi)容輸出時,會根據(jù)該標簽,在填充圖案庫中查找對應的填充圖案,對于符合地層,將識別該地層包含的所有巖性符號并疊加繪制。
當鉆孔柱狀圖的某一個地層巖性描述文字較多,而地層劃分又比較薄,其所在巖性高度無法容納下全部的巖性文字時,需要通過繪制緩沖線的方式,向上面的地層或下面的地層借出一定的空間,從而達到巖性描述文字能夠美觀地顯示出來的目的。在進行繪制緩沖線時,往往會遇到一些比較復雜的情況,需要設計合理的算法計算來繪制出比較合適的線。本文采用動態(tài)修正技術實現(xiàn)緩沖線的繪制。在繪制巖性描述線時,該矢量線由起點、緩沖點、終點組成,默認情況下這幾個點是一條直線,即不向上層或下層借位。
當文字占用高度高于巖層厚度時,則需要最低限度原則,向上層和下層借出需要的最小繪制高度,具體過程如下。
1)當繪制一個地層時,如果該層的巖性描述文字所占總高度大于該層厚度,首先修改上一層的巖性描述線,提高上一層緩沖點和終點的位置,根據(jù)上一層的巖性描述文字高度和剩余空間的計算,向上一層借出所需的最大高度。
2)如果該層的巖性描述文字所占總高度不大于該層厚度(包括向上層借出的高度),則以巖層底部繪制巖性描述線。
3)如果向上一層借出高度仍然不夠,則繪制該巖層緩沖線時,將緩沖點和終點的位置下調(diào),向下層預借出所需的高度。
經(jīng)過上面的步驟,即可完成巖性描述緩沖線的繪制,同時巖性描述文字關聯(lián)到線的屬性中,后續(xù)只需在ArcGIS配圖文件中,設置文字標注顯示在線上即可實現(xiàn)巖性描述的貼線顯示。
在模板定義時,使用“{| Svm| S}{| SELR=line-width| S}”定義緩沖線區(qū)域,其中“{| Svm| S}”標簽表示對于多條記錄,進行單元格的合并。line-width定義巖性描述文字每行的字數(shù),在實現(xiàn)時,會識別中文和英文的寬度,使得每行內(nèi)容長度保持一致。
首先,根據(jù)Excel形式的模板定義要生成面狀的表格框架及內(nèi)容,每個單元格對應一個面狀要素。針對單元格內(nèi)容填充動態(tài)的矢量內(nèi)容。
針對數(shù)據(jù)屬性,進行動態(tài)矢量內(nèi)容的生成。動態(tài)矢量內(nèi)容包括文字標注、點符號、線符號3種類型。
文字標注:直接將面要素的文字內(nèi)容以點要素的形式生成到單元格框架內(nèi)的合適位置。
點符號:包括巖性填充花紋中標記取樣類型、穩(wěn)定水位、標貫點等位置的符號。
線符號:包括巖性填充花紋、緩沖線、穩(wěn)定水位、標貫點位置、數(shù)據(jù)曲線及標頭等內(nèi)容。
在模板定義時,使用以下特殊的符號定義矢量內(nèi)容:
{| Svm| S}:垂直合并單元格,將多個地層的單元格合并作為整體進行渲染。
{| Srh={{layer.thickness}}| S}:定義地層單元格的高度,在渲染時,會根據(jù)比例尺及實際地層厚度,計算每個單元格的高度。
{| SHTC={{layer.name}}| S}:定義巖性花紋的填充,如果渲染內(nèi)容有取樣數(shù)據(jù)、標貫數(shù)據(jù)和水位數(shù)據(jù),會在巖性花紋對應深度標注這些數(shù)據(jù)的位置和符號。
{| SELR=line-width | S}:定義巖性描述的緩沖線及每行文字的寬度。
{| SSLT| S}:定義取樣數(shù)據(jù)的位置,并標注取樣編號和深度。
{| SSPT| S}:定義標貫數(shù)據(jù)的位置,并標注標貫擊數(shù)和深度。
{| SDW| S}:定義水位數(shù)據(jù)的位置,并標注深度和測量日期。
{| SCPT.head.res| S}:定義靜探數(shù)據(jù)錐尖阻力和側(cè)壁摩阻力的表頭內(nèi)容,包括比例尺、圖例。
{| SCPT.res| S}:定義靜探數(shù)據(jù)錐尖阻力和側(cè)壁摩阻力的數(shù)據(jù)曲線。
{| SCPT.head.frr| S}:定義靜探數(shù)據(jù)摩阻比的表頭內(nèi)容,包括比例尺及標題。
{| SCPT.frr| S}:定義靜探數(shù)據(jù)摩阻比的數(shù)據(jù)曲線。
通過數(shù)據(jù)驅(qū)動制圖,可基于單個地圖文檔創(chuàng)建統(tǒng)一的幅面與排版布局,將同一個工程下的多個鉆孔的內(nèi)容輸出到一個PDF文件中,從而形成圖冊資料進行歸檔,實現(xiàn)鉆孔柱狀圖的批量生產(chǎn)。
要使用數(shù)據(jù)驅(qū)動制圖,通過設定的幅面大小,預先生成鉆孔柱狀圖的索引要素,系統(tǒng)根據(jù)索引要素的大小,按比例根據(jù)模板布局自動渲染繪制鉆孔柱狀圖。在輸出時,基于索引要素將數(shù)據(jù)分割為多個部分,并為每個索引要素生成一個相應的頁面。每一個頁面對應著一個鉆孔柱狀圖數(shù)據(jù),同時可關聯(lián)顯示頁面名稱和頁碼等動態(tài)文本內(nèi)容。從而實現(xiàn)圖庫一體的自動化制圖技術。
具體實現(xiàn)為,系統(tǒng)首先根據(jù)要輸出的鉆孔編號,輸出頁面范圍,然后利用模板引擎技術,為每個頁面生成矢量內(nèi)容,最后,利用數(shù)據(jù)驅(qū)動制度,將每一頁的數(shù)據(jù)內(nèi)容,按照預定義的模板標注格式,渲染成一本pdf形式的圖冊產(chǎn)出。
由于每個單位都有自己的柱狀圖格式,而且各個格式也不盡相同,為了很好地解決這個問題,采用模板引擎技術,實現(xiàn)利用Excel表格直觀的設計模板的格式。
可按照期望的格式和內(nèi)容,在Excel中填充各類信息。其中“{{…}}”定義了動態(tài)變量信息,“{%...%}”定義了條件語句和循環(huán)語句,可用來循環(huán)輸出地層信息,“{| S...| S}”定義了矢量內(nèi)容信息,可在渲染時,根據(jù)該內(nèi)容輸出相應的矢量數(shù)據(jù)。
圖4 柱狀圖模板結構定義
利用ArcGIS將最終的成果渲染呈現(xiàn),可在軟件中定義各標注位置與符號、顏色等表達方式,以及圖名、圖簽等內(nèi)容,其中圖簽包括編錄、制圖、審核、制圖日期、圖號、順序號等內(nèi)容。
利用文中的動態(tài)渲染技術,可將輸出的點、線、面等數(shù)據(jù)根據(jù)內(nèi)容和格式進行靈活地定義,使用符號和標注將內(nèi)容進行合理展示,并添加標題、頁碼、頁簽等動態(tài)內(nèi)容和頁面整飾內(nèi)容,從而使得輸出的圖件符合實際工程需求。
圖5 版面內(nèi)容定義
圖6 柱狀圖的圖冊批量輸出
利用ArcGIS的數(shù)據(jù)驅(qū)動制圖頁面將整個工程的所有圖件導出為多頁面的PDF文檔。PDF格式的特點為兼容性很好,并且轉(zhuǎn)碼后排版不變,可以在不同的平臺查看和打印,并保證格式始終如一。是分發(fā)文檔和建立檔案的理想格式。通過ArcMap產(chǎn)出的PDF文件是矢量格式輸出,可以在多種圖形應用程序中編輯,同時會保留 ArcMap 內(nèi)容列表中的標注、注記和屬性數(shù)據(jù)等內(nèi)容。由于PDF文件支持嵌入字體,因此即使文檔分發(fā)的對象未安裝 ArcGIS中使用的字體,也可以正確地打開并顯示符號。
經(jīng)過系統(tǒng)化的分析,介紹了基于ArcGIS的通用鉆孔柱狀圖的自動繪制方法,并在實際工作中發(fā)揮了重要作用,具有靈活的適應性和廣闊的應用前景。
通過使用模板引擎技術來擴展定義柱狀圖布局模板,使得調(diào)整柱狀圖的表現(xiàn)方式變得非常簡單,只需要簡單地修改Excel模板中的表格布局和變量位置,即可靈活地定制鉆孔柱狀圖的結構。通過修改ArcGIS模板的頁面布局,可以為數(shù)據(jù)輸出增加很多適合實際生產(chǎn)需求動態(tài)內(nèi)容。對于不同專業(yè)的柱狀圖,除了鉆孔深度,采樣間隔等技術不同以外,對同種地層或巖性的表達方式也可能不同。對于本系統(tǒng)的設計,只需要將其他專業(yè)的巖性符號文件進行簡單替換即可,從而真正實現(xiàn)多專業(yè)通用繪制,使得本系統(tǒng)有著良好的移植性和擴展性。