基于ARCGIS批量統計打印軟件的設計
摘要:本文討論了基于ARCGIS的批量統計打印軟件的設計目標和原則,進行系統的結構設計、關鍵技術的運用、軟件功能模塊設計以及系統的運行環境,并在項目的建設中得到了實現。
關鍵字:ARCGIS 批量統計 AO類接口
1.引言
1.1背景
2005年12月至2006年4月間,為配合北京市第三次交通調查即土地使用調查工作,進行了全市域1118個交通調查小區現狀用地、總體規劃用地數據調查與匯總統計工作。該項工作由于缺乏成熟的批量切割和統計軟件,工作較為繁瑣,且周期較長。此外,類似的批量用地統計的工作也日益增多,切實地需要定制一套針對規劃數據的批量統計軟件.由此為了提高工作效率,提出設計開發出基于ARCGIS的批量統計軟件,實現對現狀用地數據進行批量切割、批量統計及批量打印等功能。
1.2設計原則
1.2.1實用性
在盡量滿足統計功能需求的前提下,應做到簡單、實用、準確的原則。
1.2.2高效性
在軟件設計、開發和應用時,應從統計需求、技術措施、軟硬件平臺、技術服務和維護響應能力等方面綜合考慮,確保軟件較高的性能。
1.2.3整體性
由于軟件需要實現的功能包括三大部分:分區裁切、批量統計、批量打印,這就要求在把握全局性的基礎上, 充分考慮各模塊的需求, 使軟件成為一個有機的整體, 從而進一步提高統計的效率、質量和水平。
1.3設計要求
u 軟件開發需基于ARCGIS 9.0;
u 軟件需實現批量切割各類規劃數據;
u 軟件需實現可選擇的批量數據統計(參照統計范圍計算屬性中可計算的各種數據,含不同屬性項的推導計算);
u 出圖打印(統計數據自由排版并批量打印)。
2.技術路線
軟件開發模式采用Client/Server方式,采用組件式開發技術Arcobjects結合Visual Basic開發語言進行軟件的開發。
軟件采用面向對象技術,基于ARCGIS軟件平臺,在ArcObjects+VBA環境中使用VB語言實現功能。其中ArcObjects是ArcGIS中應用程序ArcMap, ArcCatalog 和 ArcScene的開發平臺,是用于構造ArcGIS系列平臺的一個COM組件對象庫,可以用來定制、擴展和構建GIS應用程序。通過ArcObjects可以實現空間數據的顯示、查詢檢索、編輯和分析;創建各種專題圖和統計報表;高級的制圖和輸出功能;空間數據管理和維護,甚至更多功能。VBA是單一的通用的應用程序腳本語言和環境,是VB基本語言引擎,與VB的代碼大部分可以相互復制。
3.關鍵技術
3.1自定義結構體
在批量統計模塊中,由于迭代計算過程很繁雜,所以在程序開發中就使用到了用戶自定義結構體,用于傳遞中間計算值。在統計范圍計算屬性中的各種數據,含不同屬性項的推導計算時,自定義了一個結構體用于傳遞在統計中將要用到的數值。與其他處理迭代計算的方法相比,自定義結構體起到了簡化程序的作用,并且具有使程序更具有可讀性的優點。
3.2 ADO和ADOX
在批量切割用地數據時, 需要將用地屬性表導入ACCESS中,利用ACCESS的“窗體”透視表的制作功能進行批量統計;以及在批量統計時,必須將統計結果輸出到用戶設定的ACCESS中,同時生成用戶所需要的MDB數據表和EXCEL表。這就需要使用到ADO和ADOX技術處理EXCLE和ACCESS的數據文件。
為了在軟件中實現對EXCLE和ACCESS中數據的控制,使用到的ADOX的對象有:
1. Catalog:包含描述數據源模式目錄的集合;
2. Column :表示表、索引或關鍵字的列;
3. Table:表示數據庫表,包括列、索引和關鍵字。
使用到的ADOX的方法有:
1. Append(Columns):將新的 Column 對象添加到 Columns 集合;
2. Append(Tables):將新的 Table 對象添加到 Tables 集合;
3. Create:創建新的目錄;
4. Item:按名稱或序號返回集合的指定成員。
使用到的ADOX的屬性有:
1. Active Connection:指示目錄所屬的 ADO Connection 對象;
2. Count:指示集合中的對象數量;
3. Name:指示對象的名稱。
同樣,要在開發工具中使用EXCEL,也需要在Visual Basic工程中引用。通過對EXCEL使用OLE自動化,可以創建出用戶所需要的EXCEL表。
3.3 AO類接口
ArcMap和ArcCatalog類都是COM類,COM類用接口來組織屬性與方法。類會有許多接口。ArcObjects提供了強大的接口功能,可以根據需求選擇不同的接口。在分區裁切地塊數據的模塊中,按分區選擇裁切時,需要根據用戶需求對該分區邊界處的地塊是否按區界進行裁切,還要通過判斷地塊的質心是否落入該分區內從而選擇裁切的方法。這就要求在ArcObjects所提供的接口中尋找符合用戶需要的接口。舉例如下:
u IBasicGeoprocessor接口
在按區界進行裁切時,在不需要判斷地塊的質心是否落入該分區內的前提下,用到了IBasicGeoprocessor接口下的Clip方法。IBasicGeoprocessor接口的功能主要提供了處理地理要素的方法,如:裁切、合并、打散、聯合等。
u IArea接口和IRelationalOperator接口
在判斷地塊的質心是否落入該分區內時,首先用IArea接口下的Cenroid方法找出所在地塊的質心,再用IRelationalOperator接口下的Within方法判斷該地塊的質心是否在所在區界之內。IArea接口提供了獲取地塊屬性的方法,如:質心、標識點、范圍等。IRelationalOperator接口提供了確定一個地塊與另一個地塊之間的關系的方法,如:包含、疊加、覆蓋等。
4.系統功能設計
4.1分區裁切
4.1.1批量切割用地
u 實現功能
用地層沿界線層的邊線批量切割。可選擇界線層的全部地物,也可自定義選擇部分地物。被切割的用地各類屬性不變,面積和周長自動重新計算,并同時附上界線層用于批量切割的關鍵字屬性。適用于僅進行用地性質和用地面積計算的批量統計,不適用于如容積率、建筑密度、人口密度等會隨著幾何形狀的改變而發生無法預測的變化的屬性字段的批量統計。批量切割用地的成果,是GeoDatabase數據庫下的一批Feature Class,每一個Feature Class以界線層用于批量切割或批量選擇的關鍵字屬性值命名
u 實現思路
通過界面獲取界限層和用地層的圖層,用AO接口IBasicGeoprocessor下的
Clip方法實現對用地層的裁切。裁切部分按分區界的界限邊界進行裁切,在各類用地屬性不變的前提下,重新計算裁切出地塊的面積和周長,并同時附上關鍵字的屬性值。
在重新計算裁切出地塊的面積時,用AO接口IArea下的Area方法可直接得到該地塊的面積;在計算裁切出地塊的周長時,用AO接口ICurve下的Length方法獲取該地塊的周長。
4.1.2批量選擇用地
u 實現功能
用地層按照界線層的邊界批量進行“質心包含”選擇,可選擇界線層的全部地物,也可自定義選擇部分地物。用地層各類屬性都不變,并同時附上界線層用于批量選擇的關鍵字屬性。適用于除用地面積以外的數值型屬性的統計。缺點是批量選擇的用地層的地物與界線層的地物仍存在犬牙交齒的情況,不是完全包含。批量選擇用地的成果,是GeoDatabase數據庫下的一批Feature Class,每一個Feature Class以界線層用于批量切割或批量選擇的關鍵字屬性值命名。
u 實現思路
為了按要求實現批量選擇用地的成果是GeoDatabase數據庫下的Feature Class,特設計了子函數Function CreateAccessDatabase( sDir As String, sDBName As String, bOverwrite As Boolean) As Iworkspace,用于創建一個新的AccessDatabase。利用AO接口IfeatureWorkspace下的CreateFeatureClass方法來創建最終成果的FeatureClass,其中FeatureClass的Field字段都已添加好.
再通過界面獲取界限層和用地層的圖層,首先用AO接口IArea下的Cenroid方法找出用地層地塊的質心,再用IRelationalOperator接口下的Within方法判斷用地層地塊的質心是否在所選擇的界限內。如果界限包含用地層地塊的質心,則被選入該界限內的;如果用地層地塊的質心在界限之外,則不被選入該界限中。
4.2批量統計用地
4.2.1批量統計用地
u 實現功能
通過界面選擇將要批量統計的圖層、分區界圖層以及關鍵字段,實現對于每個分區的用地圖,都要按照某一個屬性字段,如“UTL”,或“HEI”來統計另一個數值型屬性字段,如“SHAPE_AREA”,或“ARR*VOL”,并生成各分區用地統計表。
u 實現思路
該模塊功能的目標是實現對于每一個分區的用地圖,都要按照某一個屬性字段來統計另一個數值型屬性字段,這就要求必須對已有數據進行查詢選擇的處理。由于現有數據十分龐大,所涉及到的迭代計算過程很繁雜,所以使用用戶自定義結構體來實現對計算中間數據的存儲和傳遞。在統計如“ARR*VOL”這樣的要求靈活多變的計算公式時,在開發過程中使用到了類模塊來實現對于算式各項的控制。
1. 自定義結構體的設計
在統計UTL的各大、中、小類時,自定義了Type landUTLArea結構體,其中包含了LandBigArea() as LandUTLArea、LandMidArea() as LandUTLArea、LandLitArea() as LandUTLArea和對于用地面積、建筑面積、以及各用地面積和建筑面積占總面積的百分比的統計。在后面的程序中調用自定義結構體也十分方便,把已統計出的數值存放到對應的結構體的各項中,在需要的時候直接調用即可。
2. 類模塊的設計
在統計較為靈活的屬性字段時,需要利用函數Public Property Get() as Variant和函數Public Property Let() as Variant將用戶的選擇傳入到類模塊中。
為了實現對計算公式的控制,設計了子程序Public Sub AddStatFldName(oFieldList As ListBox)用來判斷計算公式。另外,還設計了子程序Public Sub AddStatValue(pfeatureclass As IFeatureClass)用于實現對用戶所選擇屬性字段的統計。在該子程序中也用到了自定義結構體來存放各屬性項的統計值。
3. ADOX和ADODB技術的設計
對于每個分區的用地圖,都要求生成各分區用地統計表,其中包含mdb和exl表。為了實現先生成mdb的統計表,再生成exl的統計表,運用到了ADOX技術。在新建立mdb表時,用到了ADOX方法下的Catalog 和Table,用于實現對目錄的控制及新建表格,另外利用ADODB方法下的Connection和RecordSet來連接數據庫和在mdb表中寫入數據。在類模塊中也使用到了ADOX和ADODB技術來創建和生成最終成果的mdb統計表。
在生成exl統計表時,設計了子函數Function ExportToExcel(rcd As ADODB.Recordset, sFileName As String, Optional iRows As Integer = -1) As Integer用于實現將mdb表轉為exl表。
為了在“批量打印”模塊中易于打印,若統計表記錄行數大于20以上的,以20行為限進行分頁,這就需要在程序中先判斷是否大于20行,如大于20行從而將統計表分頁。
由于“批量統計用地”模塊是“綜合統計用地”和“極值統計用地”模塊的數據基礎,這就要求在數據的統計時要具有高度準確性。
4.2.2綜合統計用地
u 實現功能
將“批量統計用地”生成的各分區用地統計表集成為用地綜合統計表,以便宏觀的比較各分區的各類性質。
u 實現思路
在“批量統計用地” 生成的各分區用地統計表的基礎上,對已統計出的數據進行整合處理,利用ADOX和ADODB技術來獲取已統計出的MDB表中的數據以及對新生成的MDB表中行和列的控制,根據需要生成新的用地綜合統計表,最終實現對各分區的各類性質的宏觀比較。同樣,為了在“批量打印”模塊中易于打印,若統計表記錄行數大于20以上的,以20行為限進行分頁,這就需要在程序中先判斷是否大于20行,如大于20行從而將統計表分頁。
4.2.3極值統計用地
u 實現功能
實現分區中各種數值型屬性項的極大值、極小值的查詢與在地圖中的定位,以及對各種數值型屬性項的總和和平均值的計算。
u 實現思路
在“批量統計用地”所得出的數據的基礎上,根據所選擇的數值型屬性項統計出極大值、極小值、總和以及平均值。處理在界面中定位極大值或極小值時,使用了AO接口IGeometry、IEnvelope下的Envelope方法來實現對于所定位邊界的控制,并使用IMxDocument接口下的ActivatedView方法使所選區域高亮顯示,更易于查看。
4.3批量打印
u 實現功能
實現A4、A3橫向、縱向的多種方式布局,可根據專題圖圖名中的關鍵字,替換專題圖中分區用地圖和統計表;
實現批量打印,可一次打印排版方式相同的一批圖;
實現批量生成JPG圖像文件,以便在文本文件制作中引用。
u 實現思路
針對A3橫向、A3縱向、A4橫向、A4縱向等四種布局方式,分別做成一個MXD文件。
1.橫向布局的設計
橫向的布局如下圖:
該布局的界面共包括四個數據框架(dataframe):分區規劃用地圖、分區用地位置示意圖、圖例以及統計表的數據框架。
為了實現分區用地數據源的自動替換,特設計了子程序changeRource (QuName As String),利用IfeatureLayer接口的FeatureClass屬性,直接替換為要求的分區用地數據。同時設計了函數:
Function ReSymbolize(pFeatcls As IFeatureClass, pLyr As IGeoFeatureLayer, qName As String) As Boolean來實現根據用戶要求的字段對替換后的分區用地數據進行重新符號化。其中用到接口IuniqueValueRenderer,根據唯一屬性值進行符號顏色的配賦方法來實現。根據重新符號化的結果刷新圖例,則使用IlegendFormat、IlegendClassFormat、IlegendItem等接口進行圖例相關信息的設置。
另外,還設計了插入統計表的子程序insertExl和插入替換標題文字內容的子程序insertText(QuName, FileName)。其中插入統計表的子程序用到ImxDocument接口的InsertObject方法;并根據放置統計表的數據框架的大小對所插入exl表的大小進行調整,實現的方法是:首先根據插入exl表的長寬比例換算出插入表符合數據框架大小的Envelop,再將此Envelop賦給指向該表的pElement對象的Geometry屬性。
最后再根據用戶需要進行圖片的輸出或打印,使用IActiveView接口的Output方法實現。圖片輸出是設計子程序ExportPic(FileName)來實現的。
2.縱向布局的設計
縱向的布局如下圖:
該布局的界面包括兩個數據框架(dataframe):分區用地位置示意圖和統計表的數據框架。
首先調用替換分區地塊數據源的子程序changeRource (QuName As String);
插入統計表時,若統計表記錄行數大于20以上的,以20行為限進行分頁,這在進行批量統計輸出統計表時就已進行判斷而將統計表分頁。在根據分區號進行統計表的插入時,需要首先判斷該分區共有幾個表,再判斷哪個表有分表,最后再順序插入表,同時進行輸出或打印。設計了insertText(Quname, FileName(k))、insertExl、ExportPic(FileName(k))等子程序來實現。
5.系統運行環境
5.1機器配置要求
CPU>=PVI-1.6G,內存>256M,硬盤>40G。
5.2系統軟件要求
1. 操作系統Windows2000或WinXP的高端版本。
2. 數據庫系統必須有MS Access2000、MS EXCEL2000。
3. GIS系統要求ARCGIS 9.0或以上版本。
4. 開發軟件要求Visual Basic 6.0版的編程軟件。
聲明①:文章部分內容來源互聯網,如有侵權請聯系刪除,郵箱 cehui8@qq.com
聲明②:中測網登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點或證實其描述,文章內容僅供參考。
加群提示:我們創建了全國32個省份的地方測繪群,旨在打造本地測繪同行交流圈,有需要請聯系管理員測小量(微信 cexiaoliang)進群,一人最多只能進入一個省份群,中介人員勿擾