李志國,王庶懋,劉 欽
(1.中國電力工程顧問集團華東電力設計院有限公司,200063,上海;2.中國地震臺網中心,100036,北京)
鉆探是各類勘察工程的主要手段之一[1]。各種類型的工程勘察柱狀圖是日??辈旃ぷ髦挟a出的最基本,也是使用數量最多的鉆探成果圖件。應用于工程勘察的柱狀圖包括單孔鉆孔柱狀圖、動力觸探試驗成果圖、靜力觸探試驗成果圖等多種類型的圖件。這類圖件如采用傳統的手工繪制方式,往往效率低,容易出錯而且不易修改,不能滿足實際工作的需要。隨著計算機技術的應用,國內外開發了一系列專業軟件實現鉆孔柱狀圖的繪制,但是這些軟件往往是半自動成圖,修改起來也不方便,而且不能根據專業特點添加填充圖樣[2]。為了能夠更好地完成鉆孔柱狀圖的繪制,現代繪制技術主要分為兩類:一類采用AutoCAD、CorelDRAW等計算機輔助制圖軟件進行鉆孔柱狀圖的自動或半自動生成;另一類采用ArcGIS、MapInfo等組件式GIS平臺進行二次開發生成鉆孔柱狀圖[3]。這2種方式往往均存在通用性、靈活性和擴展性不強等問題,無法對產出模板進行靈活的定義。
針對以上問題,本文提出基于Jinja2模板引擎,通過Excel排版實現鉆孔柱狀圖模板格式配置的靈活定義和表達。基于ArcGIS平臺,利用空間數據和屬性數據管理功能,實現鉆孔數據在模板引擎上的渲染,以及鉆孔柱狀圖的自動繪制和輸出功能。
從各類圖件的表現形式中可以看出,鉆孔柱狀圖是一種表格式的圖件。表格中地層厚度、試驗曲線、取樣位置等單元格比較特殊,其高度需要按比例符合實際的精確度,而地層描述等單元格則需要根據描述內容文字的高度,通過緩沖線標識相對位置,以便達到整體美觀、協調的目的。
鉆孔柱狀圖的繪制內容由文字、花紋、符號和曲線等要素構成。文字為表格中的各種數據和描述文字,花紋為柱狀圖中表示地層巖性的各種填充花紋,符號為柱狀圖中標識地下水位、標貫點和取樣類型等位置的點狀符號,曲線為靜力觸探、動力觸探等各類物理性質試驗曲線。所有內容的繪制和表達均需要符合國家、部門或行業的標準。
鉆孔數據由工程信息、鉆孔信息、地層信息、取樣信息、標貫信息、靜探信息、動探信息等一系列的表組成,每個與鉆孔相關的信息通過鉆孔編號相關聯。這些信息的錄入可以通過Excel導入的功能,按對應的項目導入到系統的數據庫中,也可直接讀取Excel中的數據進行柱狀圖的繪制。
根據不同行業的工程情況,可以將工程信息表、勘探點信息表、勘探點地層表、鉆孔取樣信息表、標貫試驗成果表、靜探試驗成果表、動探試驗成果表等信息建立數據模型。通過數據的導入,將成果信息轉換為JSON格式便于后續處理。

圖2 數據模型ER圖
本文提出的自動成圖工具利用ArcToolbox的開發接口,使用ArcPy實現用戶自定義工具,從而便捷快速地進行鉆孔柱狀圖的處理和產出。
ArcGIS Desktop軟件是ESRI公司開發的專業地理信息處理軟件,軟件的ArcToolbox工具箱提供了一套處理地理數據任務的工具集。ArcToolbox包含了ArcGIS地理處理的大部分分析工具和數據管理工具[4],這些工具可以單獨使用,也可以通過ModelBuilder工具把它們的處理流程連接起來,建立空間分析工作流模型,還可以通過代碼把這些工具引用到定制腳本中來創建自己的工具和工具箱,用來擴展ArcGIS的功能。本文采用ArcPy定制一系列的工具箱和工具的方式,來實現靈活的鉆孔柱狀圖產出功能。
自定義工具的整體結構包括定義參數、驗證參數和處理工作流3個部分。分別定義輸入的參數,驗證參數合法性和執行產出處理過程。
輸入數據可以選擇存放工程信息的數據庫或Excel文件,定義了數據輸出所需要的各類信息,默認輸出工程內的所有鉆孔信息,也可以通過可選參數,指定要輸出的鉆孔編號,來限定產出范圍。

圖3 自定義工具界面
為了實現鉆孔柱狀圖的靈活定義,出圖模板由兩部分組成,一個是基于Excel文件的鉆孔柱狀圖表格結構的數據模板,定義了鉆孔柱狀圖表格結構、變量位置等柱狀圖結構信息;一個是基于ArcGIS文件頁面布局的版面模板,定義了符號表達、標注位置、頁面布局等渲染出圖信息。
通過模板定義的表達信息實現出圖的表格結構和頁面框架,使用實際工程數據,將模板中的動態內容進行渲染,即可產出一套完整的鉆孔柱狀圖圖冊。
Jinja2是一個基于Python語言的模板引擎(Template Engine)。它定義了一套簡單易用的模板語言(Template Language),可以用來引用Json形式的數據對象,實現內容的動態產出。當Jinja2應用于動態內容產出的場景時,負責產出產品頁面的設計人員可以和負責數據產出的程序開發人員在約定好數據的結構后,就可以分別獨立同步進行各自的工作,程序開發人員可以只關注業務邏輯代碼的編寫,頁面設計人員可以只關注頁面的表現形式,并可以根據業務情況隨時靈活地修改頁面的結構信息,而不需要重新編寫代碼。利用模板引擎技術將數據資源從頁面表現中分離出來,為軟件的長期維護提供了便利。
采用Jinja2模板引擎技術,將數據與表格結構分離,構建了基于模板引擎技術的表格內容結構定義系統,利用Excel表格定義結構信息,實現了表格結構和展示內容的靈活智能化定義。利用模板引擎,可以將變量使用雙花括號“{{變量名稱}}”標記,當Jinja2解釋器讀取到該內容后,會自動將該變量替換為真正的指,從而實現基于數據的模板渲染。也可使用類似“{%...%}”格式的條件語句,針對不同的條件進行判斷和有針對性地輸出相關內容。
文本擴展該項技術,將應用范圍擴大到Excel表格結構中。首先,將Excel的表格格式轉為Json格式;然后,利用Jinja2模板引擎渲染替換動態內容,形成針對工程的表格Json數據;最后,利用ArcGIS將該數據定義轉換為點、線、面和標記形式的數據,在并擴展定義“{| S...| S}”形式的矢量標注標簽,從而將數據輸出到ArcGIS格式。
利用ArcGIS的StyleManager構建各類巖性花紋是一種解決方案[5],但是有2個問題,一是不同版本ArcGIS符號庫的兼容性問題會導致系統在不同的版本之間無法遷移,無法滿足靈活性的需要;二是無法進行復合花紋樣式的表達,由于地質的復雜性,當遇到某一巖層出現多種巖性的情況時,需要將每種巖性對應的花紋樣式進行復合填充到同一區域。因此,本文使用AutoDESK公司的填充圖案為規則,將不同巖性的圖案通過算法寫入矢量文件中進行表達。
填充圖案在一個或多個文件擴展名為.pat的定義文件中定義。由標題行和描述行組成,下面是文件的基本格式。
*pattern-name[, description]
angle, x-origin,y-origin, delta-x,delta-y,dash-1,dash-2, …
第1行是標題行,以星號開頭;pattern-name定義了圖案名稱,方括號為可選的說明內容。
第2行是圖案的描述行,可以有一行或多行;每條陣列線都被視為直線族的第1個成員,通過在2個方向上應用增量偏移來生成無限的平行線族而創建直線族,符號代表的含義如下。
angle代表繪制直線的角度;
x-origin,y-origin代表填充直線族中第一條直線所經過點的X、Y軸坐標;
delta-x代表直線族成員之間在直線方向上的位移,它僅用于表達虛線;
delta-y代表直線族成員之間的間距,也就是多個直線間的垂直距離;
dash-n代表一條直線的長度,可取正、負值或為零,取正值表示該長度為實線,取負值表示該線段留空,取零則畫點。若不含dash-n,則為實線。
根據該算法,即可將多條線段組合成為需要的巖性填充符號,并填充在指定的區域內。
對于復合巖性花紋,系統則自動識別其中的多個巖性,并在巖性花紋庫中進行查找比對,將多個巖性花紋在同一區域內繪制,從而實現復合巖性花紋的表達。
在模板文件中,使用“{| SHTC={{hatch_name}}| S}”標簽動態定義要表達的巖性花紋符號,在系統渲染后,進行矢量內容輸出時,會根據該標簽,在填充圖案庫中查找對應的填充圖案,對于符合地層,將識別該地層包含的所有巖性符號并疊加繪制。
當鉆孔柱狀圖的某一個地層巖性描述文字較多,而地層劃分又比較薄,其所在巖性高度無法容納下全部的巖性文字時,需要通過繪制緩沖線的方式,向上面的地層或下面的地層借出一定的空間,從而達到巖性描述文字能夠美觀地顯示出來的目的。在進行繪制緩沖線時,往往會遇到一些比較復雜的情況,需要設計合理的算法計算來繪制出比較合適的線。本文采用動態修正技術實現緩沖線的繪制。在繪制巖性描述線時,該矢量線由起點、緩沖點、終點組成,默認情況下這幾個點是一條直線,即不向上層或下層借位。
當文字占用高度高于巖層厚度時,則需要最低限度原則,向上層和下層借出需要的最小繪制高度,具體過程如下。
1)當繪制一個地層時,如果該層的巖性描述文字所占總高度大于該層厚度,首先修改上一層的巖性描述線,提高上一層緩沖點和終點的位置,根據上一層的巖性描述文字高度和剩余空間的計算,向上一層借出所需的最大高度。
2)如果該層的巖性描述文字所占總高度不大于該層厚度(包括向上層借出的高度),則以巖層底部繪制巖性描述線。
3)如果向上一層借出高度仍然不夠,則繪制該巖層緩沖線時,將緩沖點和終點的位置下調,向下層預借出所需的高度。
經過上面的步驟,即可完成巖性描述緩沖線的繪制,同時巖性描述文字關聯到線的屬性中,后續只需在ArcGIS配圖文件中,設置文字標注顯示在線上即可實現巖性描述的貼線顯示。
在模板定義時,使用“{| Svm| S}{| SELR=line-width| S}”定義緩沖線區域,其中“{| Svm| S}”標簽表示對于多條記錄,進行單元格的合并。line-width定義巖性描述文字每行的字數,在實現時,會識別中文和英文的寬度,使得每行內容長度保持一致。
首先,根據Excel形式的模板定義要生成面狀的表格框架及內容,每個單元格對應一個面狀要素。針對單元格內容填充動態的矢量內容。
針對數據屬性,進行動態矢量內容的生成。動態矢量內容包括文字標注、點符號、線符號3種類型。
文字標注:直接將面要素的文字內容以點要素的形式生成到單元格框架內的合適位置。
點符號:包括巖性填充花紋中標記取樣類型、穩定水位、標貫點等位置的符號。
線符號:包括巖性填充花紋、緩沖線、穩定水位、標貫點位置、數據曲線及標頭等內容。
在模板定義時,使用以下特殊的符號定義矢量內容:
{| Svm| S}:垂直合并單元格,將多個地層的單元格合并作為整體進行渲染。
{| Srh={{layer.thickness}}| S}:定義地層單元格的高度,在渲染時,會根據比例尺及實際地層厚度,計算每個單元格的高度。
{| SHTC={{layer.name}}| S}:定義巖性花紋的填充,如果渲染內容有取樣數據、標貫數據和水位數據,會在巖性花紋對應深度標注這些數據的位置和符號。
{| SELR=line-width | S}:定義巖性描述的緩沖線及每行文字的寬度。
{| SSLT| S}:定義取樣數據的位置,并標注取樣編號和深度。
{| SSPT| S}:定義標貫數據的位置,并標注標貫擊數和深度。
{| SDW| S}:定義水位數據的位置,并標注深度和測量日期。
{| SCPT.head.res| S}:定義靜探數據錐尖阻力和側壁摩阻力的表頭內容,包括比例尺、圖例。
{| SCPT.res| S}:定義靜探數據錐尖阻力和側壁摩阻力的數據曲線。
{| SCPT.head.frr| S}:定義靜探數據摩阻比的表頭內容,包括比例尺及標題。
{| SCPT.frr| S}:定義靜探數據摩阻比的數據曲線。
通過數據驅動制圖,可基于單個地圖文檔創建統一的幅面與排版布局,將同一個工程下的多個鉆孔的內容輸出到一個PDF文件中,從而形成圖冊資料進行歸檔,實現鉆孔柱狀圖的批量生產。
要使用數據驅動制圖,通過設定的幅面大小,預先生成鉆孔柱狀圖的索引要素,系統根據索引要素的大小,按比例根據模板布局自動渲染繪制鉆孔柱狀圖。在輸出時,基于索引要素將數據分割為多個部分,并為每個索引要素生成一個相應的頁面。每一個頁面對應著一個鉆孔柱狀圖數據,同時可關聯顯示頁面名稱和頁碼等動態文本內容。從而實現圖庫一體的自動化制圖技術。
具體實現為,系統首先根據要輸出的鉆孔編號,輸出頁面范圍,然后利用模板引擎技術,為每個頁面生成矢量內容,最后,利用數據驅動制度,將每一頁的數據內容,按照預定義的模板標注格式,渲染成一本pdf形式的圖冊產出。
由于每個單位都有自己的柱狀圖格式,而且各個格式也不盡相同,為了很好地解決這個問題,采用模板引擎技術,實現利用Excel表格直觀的設計模板的格式。
可按照期望的格式和內容,在Excel中填充各類信息。其中“{{…}}”定義了動態變量信息,“{%...%}”定義了條件語句和循環語句,可用來循環輸出地層信息,“{| S...| S}”定義了矢量內容信息,可在渲染時,根據該內容輸出相應的矢量數據。

圖4 柱狀圖模板結構定義
利用ArcGIS將最終的成果渲染呈現,可在軟件中定義各標注位置與符號、顏色等表達方式,以及圖名、圖簽等內容,其中圖簽包括編錄、制圖、審核、制圖日期、圖號、順序號等內容。
利用文中的動態渲染技術,可將輸出的點、線、面等數據根據內容和格式進行靈活地定義,使用符號和標注將內容進行合理展示,并添加標題、頁碼、頁簽等動態內容和頁面整飾內容,從而使得輸出的圖件符合實際工程需求。

圖5 版面內容定義

圖6 柱狀圖的圖冊批量輸出
利用ArcGIS的數據驅動制圖頁面將整個工程的所有圖件導出為多頁面的PDF文檔。PDF格式的特點為兼容性很好,并且轉碼后排版不變,可以在不同的平臺查看和打印,并保證格式始終如一。是分發文檔和建立檔案的理想格式。通過ArcMap產出的PDF文件是矢量格式輸出,可以在多種圖形應用程序中編輯,同時會保留 ArcMap 內容列表中的標注、注記和屬性數據等內容。由于PDF文件支持嵌入字體,因此即使文檔分發的對象未安裝 ArcGIS中使用的字體,也可以正確地打開并顯示符號。
經過系統化的分析,介紹了基于ArcGIS的通用鉆孔柱狀圖的自動繪制方法,并在實際工作中發揮了重要作用,具有靈活的適應性和廣闊的應用前景。
通過使用模板引擎技術來擴展定義柱狀圖布局模板,使得調整柱狀圖的表現方式變得非常簡單,只需要簡單地修改Excel模板中的表格布局和變量位置,即可靈活地定制鉆孔柱狀圖的結構。通過修改ArcGIS模板的頁面布局,可以為數據輸出增加很多適合實際生產需求動態內容。對于不同專業的柱狀圖,除了鉆孔深度,采樣間隔等技術不同以外,對同種地層或巖性的表達方式也可能不同。對于本系統的設計,只需要將其他專業的巖性符號文件進行簡單替換即可,從而真正實現多專業通用繪制,使得本系統有著良好的移植性和擴展性。