周 飛
(江蘇省測繪工程院,江蘇南京 210013)
地理信息數(shù)據(jù)的格式轉(zhuǎn)換是相當(dāng)普遍的。各主流數(shù)據(jù)處理軟件能夠?qū)崿F(xiàn)一些簡易的格式轉(zhuǎn)換功能,但存在要素或?qū)傩詠G失、圖形變形的情況,無法滿足無損轉(zhuǎn)換的需要。
FME Objects 提供了一套軟件組件用于處理空間數(shù)據(jù)。程序的二次開發(fā)引用軟件安裝生成的FME Objects Dot Net 4 庫,該庫包含了一整套處理空間數(shù)據(jù)的類、對象、常用變量、函數(shù)方法。本文利用FME Objects 讀寫數(shù)據(jù)、編輯數(shù)據(jù)、屬性傳遞的特性及對多種數(shù)據(jù)格式支持、靈活嵌入其他系統(tǒng)的優(yōu)勢,開發(fā)集成了多源數(shù)據(jù)的格式轉(zhuǎn)換工具,高效滿足了各類數(shù)據(jù)源的統(tǒng)一使用。
FME 主要功能由FME Data Inspector 與FME Workbench 實現(xiàn)。FME Data Inspector 主要用于查看數(shù)據(jù)的要素數(shù)量、組織結(jié)構(gòu)、要素屬性、圖層分類。FME Workbench 是支持?jǐn)?shù)據(jù)格式轉(zhuǎn)換與處理的軟件平臺,可手動設(shè)置讀模塊、轉(zhuǎn)換器、寫模塊3部分,用于數(shù)據(jù)的格式轉(zhuǎn)換。FME 采用的是語義轉(zhuǎn)換方法,支持多源數(shù)據(jù)的讀取與相互轉(zhuǎn)換,針對需求,調(diào)用豐富的函數(shù)轉(zhuǎn)換器,處理坐標(biāo)、圖形、屬性,在轉(zhuǎn)換過程中實現(xiàn)數(shù)據(jù)重構(gòu)的功能。“語義轉(zhuǎn)換”運用映射文件的對應(yīng)模型,提供了不同類型數(shù)據(jù)的流通通道,破除了數(shù)據(jù)之間的壁壘,有效避免了數(shù)據(jù)丟失或圖形變形的發(fā)生,實現(xiàn)全過程自動化。FME憑借其強大的功能,封裝了500 多種轉(zhuǎn)換器(函數(shù)),實現(xiàn)了數(shù)據(jù)的多需求、多方向的格式轉(zhuǎn)換。對于大批量數(shù)據(jù)格式的轉(zhuǎn)換處理,借助開發(fā)鏈接庫,運用程序定制處理同類型的數(shù)據(jù)轉(zhuǎn)換是高效的。
依托FME Objects 動態(tài)鏈接庫,運用C#語言,在.NET 平臺面向?qū)ο箝_發(fā)的程序界面如圖1 所示。界面提供了選擇源數(shù)據(jù)按鈕、目標(biāo)數(shù)據(jù)存儲路徑選擇按鈕、對應(yīng)格式轉(zhuǎn)換按鈕,以及更新狀態(tài)欄。軟件主要包括dgn->shp、dgn->dwg、dgn->gdb、dgn->mdb、dwg->dgn、mdb->dgn、dwg->shp、gdb->dgn 八種格式轉(zhuǎn)換功能。程序運行流程如圖2 所示。
圖1 程序界面圖
圖2 轉(zhuǎn)換流程圖
c#界面窗體的運行是以static void Main()為起點,主要調(diào)用EnableVisualStyles()、SetCompatibleTextRenderingDefault(false)、Run(new Form1())這三個函數(shù)方法實現(xiàn)窗體的初步運行。
EnableVisualStyles()函數(shù)實現(xiàn)窗體及設(shè)置控件的可視化;SetCompatibleTextRenderingDefault(false)函數(shù)的參數(shù)一般設(shè)置為false,此函數(shù)使用GDI 方式設(shè)置控件的顯示文本;Run(new Form1())則用于窗體標(biāo)準(zhǔn)消息的運行與循環(huán)。
窗體的設(shè)置主要包括button(按鈕)、ListBox(列表盒)、StatusStrip(狀態(tài)欄)、OpenFileDialog(打開對話框)。地理信息數(shù)據(jù)格式中的Geodatabase(簡稱gdb)是以文件夾形式表示的,應(yīng)選用FloderBrowser Dialog 打開數(shù)據(jù)對話框。窗體設(shè)置的控件、對話框、狀態(tài)欄主要用于觸發(fā)函數(shù)的運行、顯示數(shù)據(jù)的選擇及狀態(tài)等。
FME Objects 運用接口定義了對象必須實現(xiàn)的成員變量。IFM EOSession 定義成員m_fmeSession并使其初始化,這是所有后續(xù)成員變量定義的起點。由于接口不能直接創(chuàng)建對象,所以對象m_fmeSession 由FME Objects 根類通過CreateSession()方法創(chuàng)建,其他對象均由對象m_fmeSession 通過函數(shù)方法創(chuàng)建。次級生成的6 種對象主要包括圖形操作工具、轉(zhuǎn)換日志、對話框、要素、磁盤向量以及讀寫器,對象的關(guān)系及創(chuàng)建方法如圖3 所示。
圖3 對象關(guān)系及創(chuàng)建方法圖
3.3.1 釋放內(nèi)存函數(shù)
Dispose()函數(shù)廣泛用于釋放界面對象的資源空間,如m_fmeSession 等對象在調(diào)用后釋放資源避免報警,代碼編寫位于設(shè)計頁面的void Dispose(bool disposing)函數(shù)中,偽代碼如下:
if(m_fmeSession!=null)
{ m_fmeSession.Dispose();
m_fmeSession=null;}
其他各類對象的釋放資源可參考m_fmeSession對象的操作,所有對象釋放完成后調(diào)用系統(tǒng)基類的釋放函數(shù)base.Dispose()。
3.3.2 屬性復(fù)制傳遞
地理信息數(shù)據(jù)的非圖形屬性是不可或缺的,F(xiàn)ME 默認(rèn)的轉(zhuǎn)換通道不能直接實現(xiàn)此類屬性的復(fù)制傳遞。我們以dgn 數(shù)據(jù)轉(zhuǎn)換為shapefile 數(shù)據(jù)為例,實現(xiàn)在讀取過程中加入屬性參數(shù)。
如圖3 所示,已闡述對象fmeReader 通過CreateReader(參數(shù))創(chuàng)建,CreateReader()方法主要包含m_dataInfo、m_createDirectives 兩個變量和一個布爾值。m_dataInfo 用于設(shè)定數(shù)據(jù)導(dǎo)入的路徑與數(shù)據(jù)格式,m_createDirectives 用于設(shè)置屬性參數(shù)。由于兩個參數(shù)是基于FME 的m_fmeDialog 對象設(shè)置的,而m_fmeDialog 是啟用對話框形式實現(xiàn)參數(shù)與路徑的傳輸,每次只能導(dǎo)入一個文件,限制了批量轉(zhuǎn)換的可能性,故程序?qū)ο髆_fmeDialog 解構(gòu),分別設(shè)置兩個變量的傳入?yún)?shù)。
m_createDirectives 通過Add()的方法加入屬性參數(shù),偽代碼如下:
m_createDirectives.Add(“......DGNV8_EXPOSE_FORMAT_ATTRS,“entity_num_0,integer entity_num_1,integer link_type_0,char(40)link_type_1,char(40)”......”);
加入屬性參數(shù)設(shè)定后,程序根據(jù)屬性名稱依次復(fù)制屬性值到目標(biāo)數(shù)據(jù),可靈活增添刪除非圖形類屬性。Shapefile 文件由于對屬性字段長度的限制,超過10 個字符的屬性字段會被強制截取表示,故可導(dǎo)入mdb/gdb 數(shù)據(jù)庫后另行操作。
3.3.3 讀取數(shù)據(jù)與模式要素函數(shù)
FME 設(shè)計中同時讀取數(shù)據(jù)要素與模式要素才能夠完整地讀取文件數(shù)據(jù)。數(shù)據(jù)轉(zhuǎn)換系統(tǒng)將讀取數(shù)據(jù)要素函數(shù)命名為readDataFeatures,讀取模式要素函數(shù)命名為readSchemaFeatures。
readDataFeatures 函數(shù)運用while(fmeReader.Read(fmeFeature))的循環(huán)遍歷數(shù)據(jù)特征并記錄存儲到數(shù)據(jù)字典中,讀完每條信息后重建對象,同時在轉(zhuǎn)換日志中記錄每條信息。偽代碼如下:
while(fmeReader.Read(fmeFeature))
{m_fmeLogFile.LogFeature(fmeFeature,F(xiàn)MEOMessageLevel.Inform,-1);
insertIntoFeatureTypeDictionary(fmeFeature);
fmeFeature=m_fmeSession.CreateFeature(); }
readSchemaFeatures 函數(shù)運用方法與readData-Features 類似。
為將完整的數(shù)據(jù)信息整合存入到字典中,需設(shè)置insertIntoFeatureTypeDictionary 函數(shù)。此函數(shù)通過FME OFeature 定義的成員對象pFeature 所收集字符串形式的信息與原庫自定義的FeatureType 格式,實現(xiàn)數(shù)據(jù)字典格式的存儲。偽代碼如下:
string currFeatureType=pFeature.FeatureType;
IFMEOFeatureVectorOnDisk
currVectorOnDisk=m_featureTypeDictionary-
[currFeatureType];
currVectorOnDisk.Append(pFeature);
由已創(chuàng)建的對象fmeReader 實現(xiàn)數(shù)據(jù)的磁盤存儲,偽代碼如下:
StringCollection openParams=new
StringCollection();
fmeReader.Open(m_dataInfo.Dataset,
openParams);
readSchemaFeatures(fmeReader,ref
schemaFeatureCount);
readDataFeatures(fmeReader,ref featureCount);
3.3.4 轉(zhuǎn)換輸出
數(shù)據(jù)的轉(zhuǎn)換輸出類似于數(shù)據(jù)的讀取,創(chuàng)建打開FMEOWriter 對象,設(shè)定輸出格式與路徑,輸出目標(biāo)的數(shù)據(jù)和模式要素。偽代碼如下:
StringCollection openParams=new
StringCollection();
fmeWriter.Open(m_dataInfo.Dataset,
openParams);
writeSchemaFeatures(fmeWriter,ref
schemaFeatureCount);
writeDataFeatures(fmeWriter,ref featureCount);
狀態(tài)欄位于程序的左下角,用于更新數(shù)據(jù)轉(zhuǎn)換的進度及數(shù)量,更新狀態(tài)欄的代碼如下:
private void updateStatusBar(string pText)
{ toolStripStatusLabel1.Text=pText;
statusStrip1.Refresh();}
為方便用戶了解讀取與轉(zhuǎn)換的進程,每循環(huán)一次要素的讀取,便通過numFeatures 計數(shù)。狀態(tài)欄展示內(nèi)容的更新代碼如下:
while(fmeReader.Read(fmeFeature))
{ numFeatures++;
updateStatusBar(" 已讀取" + numFeatures.ToString()+"要素......"); }
m_fmeLogFile 對象通過LogFeature()函數(shù)輸出轉(zhuǎn)換日志,日志內(nèi)容包含了源數(shù)據(jù)與目標(biāo)數(shù)據(jù)的格式和路徑、調(diào)用的動態(tài)庫函數(shù)、讀取要素的模式、讀取要素量、轉(zhuǎn)換線型的粗細顏色值、屬性名字段、輸出要素量等。但是要素是否丟失是最為關(guān)鍵的,故系統(tǒng)設(shè)置了用于對比要素讀取量與轉(zhuǎn)換量的檢查文件,結(jié)合numFeatures 的計數(shù)功能,在讀取函數(shù)和轉(zhuǎn)換函數(shù)中嵌入文件流代碼。偽代碼如下:
string datacheck=@"D:datacheck.txt";
streamWriter=new StreamWriter(fileStream);
streamWriter.WriteLine("第" +(i + 1).ToString()+ "個文件所有要素量為:" + numFeatures.ToString());//嵌入讀取函數(shù)
streamWriter.WriteLine("第" +(i + 1).ToString()+"個文件要素轉(zhuǎn)換量為:"+featureCount.ToString());//嵌入轉(zhuǎn)換函數(shù)
檢查文本示意圖如圖4 所示:
圖4 要素數(shù)量檢查文本
本文基于FME Objects 動態(tài)鏈接庫開發(fā)的格式轉(zhuǎn)換軟件,解析了FME Objects 應(yīng)用的類對象、函數(shù)方法、成員變量。通過對帶屬性數(shù)據(jù)的格式歸類與批量輸入,軟件實現(xiàn)了各類數(shù)據(jù)圖形與屬性的無損轉(zhuǎn)換,促進了多源地理信息類文件的高效使用。隨著自然資源機構(gòu)改革的深入,原屬國土、測繪、海洋、規(guī)劃等行業(yè)數(shù)據(jù)的格式轉(zhuǎn)換并疊加分析使用是必然的趨勢。對于FME Objects 中涉及要素操作、坐標(biāo)轉(zhuǎn)換的程序處理則是下一步的研究點。