国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于FME Objects 的空間數(shù)據(jù)格式轉(zhuǎn)換方法研究

2023-02-05 13:57:26
經(jīng)緯天地 2023年6期
關(guān)鍵詞:窗體代碼對象

周 飛

(江蘇省測繪工程院,江蘇南京 210013)

0 引言

地理信息數(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)一使用。

1 FME軟件簡介

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)換是高效的。

2 程序運行

依托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)換流程圖

3 程序架構(gòu)

3.1 窗體運行與設(shè)置

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)等。

3.2 創(chuàng)建對象

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 主要功能

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);

3.4 狀態(tài)欄更新

狀態(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()+"要素......"); }

3.5 要素數(shù)量檢查

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ù)量檢查文本

4 結(jié)語

本文基于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)換的程序處理則是下一步的研究點。

猜你喜歡
窗體代碼對象
神秘來電
睿士(2023年2期)2023-03-02 02:01:09
試談Access 2007數(shù)據(jù)庫在林業(yè)檔案管理中的應(yīng)用
檔案天地(2019年5期)2019-06-12 05:12:02
創(chuàng)世代碼
動漫星空(2018年11期)2018-10-26 02:24:02
創(chuàng)世代碼
動漫星空(2018年2期)2018-10-26 02:11:00
創(chuàng)世代碼
動漫星空(2018年9期)2018-10-26 01:16:48
創(chuàng)世代碼
動漫星空(2018年5期)2018-10-26 01:15:02
攻略對象的心思好難猜
意林(2018年3期)2018-03-02 15:17:24
基于熵的快速掃描法的FNEA初始對象的生成方法
區(qū)間對象族的可鎮(zhèn)定性分析
基于LayeredWindow的異形窗體局部刷新
中文信息(2014年2期)2014-03-06 23:49:14
三原县| 廊坊市| 朔州市| 磴口县| 从江县| 通州市| 巴楚县| 微山县| 灵丘县| 德清县| 东阿县| 安平县| 凤阳县| 巩义市| 平邑县| 陆川县| 白银市| 苗栗市| 涪陵区| 南召县| 柳林县| 湾仔区| 田阳县| 阜新市| 柳江县| 江源县| 天柱县| 吉水县| 都江堰市| 江都市| 嘉禾县| 财经| 临邑县| 曲水县| 鹤岗市| 舟山市| 商城县| 西林县| 南召县| 全椒县| 余姚市|