專利名稱:基于ArcGIS Engine的水文復雜數(shù)據(jù)類型擴充方法
技術領域:
本發(fā)明涉及一種基于ArcGIS Engine的數(shù)據(jù)類型擴充方法,尤其涉及一種水文復雜數(shù)據(jù)類型擴充方法,屬于地理信息系統(tǒng)數(shù)據(jù)模型領域。
背景技術:
地理信息技術與地理學相關學科的交叉研究已成為趨勢,在水文學科領域基于數(shù)字地球的思想提出了數(shù)字流域的概念,期待將水文現(xiàn)象與現(xiàn)代地理信息技術相結合,進一步推動水文學的研究。數(shù)字流域體系一般分為三層數(shù)據(jù)層、模型層和應用層。在數(shù)據(jù)層方面,現(xiàn)代數(shù)字流域技術已能將龐大的地理觀測數(shù)據(jù)、水文觀測數(shù)據(jù)以大型數(shù)據(jù)庫存儲,進而用地理信息系統(tǒng)以圖形化的方式進行表達,通過形象、直觀的圖形展示龐大的水文地理數(shù)據(jù),清晰地表達水文數(shù)據(jù)的空間分布特征和時間分布規(guī)律等信息,并能對水文過程做出復雜的定量分析,極大地推動了水文學的發(fā)展。在模型層和應用層方面,水文學所涉及的專業(yè)模型也需要地理信息系統(tǒng)支撐,以便改進模型結構和提升模型精度,這就需要將水文模型與地理信息系統(tǒng)建立耦合關聯(lián)。目前水文模型與地理信息系統(tǒng)耦合主要還是一種松散的集成模式,即首先通過專業(yè)地理信息系統(tǒng)軟件為水文專業(yè)模型處理數(shù)據(jù),然后將處理好的數(shù)據(jù)輸出到中介數(shù)據(jù)庫中,水文模型讀取中介數(shù)據(jù)后運行,模型計算的結果也保存在中介數(shù)據(jù)庫中,由地理信息系統(tǒng)軟件讀取顯示計算結果。如目前在ArcGIS平臺下的HEC_GeoRas、HEC_GeoHMS、ArcHydro等軟件皆是這種模式,在這個過程中水文模型和地理信息系統(tǒng)軟件沒有實現(xiàn)緊密耦合,兩者分別獨立運行,不能做到真正意義上的可視化構模,也難以做到模型計算結果的實時分析和參數(shù)的實時調(diào)整,模型運行花費大量時間在中間過程的存儲和讀取上,給模型完善帶來很大困難, 給決策支持等應用層也帶來很大復雜度。解決問題的有效方法是將水文模型和地理信息系統(tǒng)完全緊密耦合,使得地理信息系統(tǒng)對模型的修改達到所見即所得,兩者之間不需要通過外部介質(zhì)交換。要實現(xiàn)這一目標就要求地理信息系統(tǒng)與模型的數(shù)據(jù)結構一致,從底層開發(fā)適合水文的GIS軟件系統(tǒng)可以很輕易地實現(xiàn)這一目標,然而從底層開發(fā)難度和耗費非常大,而現(xiàn)有的最強大的商業(yè)GIS軟件ArcGIS的數(shù)據(jù)結構又很難與水文模型的數(shù)據(jù)結構匹配,不滿足要求。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術問題是針對現(xiàn)有商業(yè)軟件ArcGIS數(shù)據(jù)結構不滿足水文模型需求,以ArcGIS Engine組件為基礎,提出一種水文復雜數(shù)據(jù)類型的擴充方法,解決 ArcGIS軟件與水文模型緊密耦合的問題,使得基于此建立的數(shù)字流域體系在模型層和應用層更簡潔、高效。本發(fā)明為解決上述技術問題采用以下技術方案
一種基于ArcGIS Engine的水文復雜數(shù)據(jù)類型擴充方法,包括以下步驟
步驟1 首先提取出水文復雜數(shù)據(jù)類型的公共特征,其次按照微軟COM組件技術標準定義包含上述公共特征的抽象接口 ;所述公共特征為能夠充分反映水文數(shù)據(jù)類型共同的信息特征;
步驟2 在步驟1中定義的抽象接口基礎上,采用軟件工程中面向對象的方法從中派生具體的水文復雜數(shù)據(jù)類型,在派生出的水文復雜數(shù)據(jù)類型中實現(xiàn)步驟1中定義的所有公共特征;
步驟3 按照ArcGIS Engine組件的要求構建水文圖層,該水文圖層須能容納步驟2得到的包含水文復雜數(shù)據(jù)類型接口的數(shù)組;
步驟4 根據(jù)水文模型的構建需求和面向對象的方法,建立步驟2定義的具體水文復雜數(shù)據(jù)類型的對象,然后將其加入到步驟3構建的自定義水文圖層中;
步驟5 將步驟4中包含有水文復雜數(shù)據(jù)對象的自定義水文圖層加入到ArcGIS地圖中顯不。作為本發(fā)明進一步的優(yōu)化方案,步驟1所述水文數(shù)據(jù)類型共同的信息特征包括 水文復雜數(shù)據(jù)類型對象的名稱、地圖符號、顯示范圍、編號屬性,以及繪圖方法、點擊測試方法、選擇方法。作為本發(fā)明的進一步優(yōu)化方案,步驟3的具體步驟如下
步驟a,定義一個能管理步驟1所述抽象接口數(shù)組的水文圖層接口,該接口中的函數(shù)包括增加、刪除、查找函數(shù);
步驟b,按照ArcGIS Engine技術文檔中的規(guī)定,采用微軟COM組件技術實現(xiàn)一個自定義的水文圖層,該水文圖層可實現(xiàn)步驟a定義的水文圖層接口,也同時能實現(xiàn)ArcGIS軟件認可的標準接口。作為本發(fā)明的進一步優(yōu)化方案,步驟1中采用C語言的語法和IDL文件的格式定義包含所述公共特征的抽象接口類型。本發(fā)明采用以上技術方案與現(xiàn)有技術相比,具有以下技術效果
本發(fā)明提出的方法不僅適用于水文專業(yè)領域的復雜數(shù)據(jù)類型擴充,也適用于地質(zhì)、采礦、交通等與地理密切相關領域的數(shù)據(jù)對象的擴充,具有良好的擴展度,使得各專業(yè)領域模型系統(tǒng)能夠借助強大的地理信息系統(tǒng)技術,推動模型的完善和降低復雜模型的使用難度。
圖1是本發(fā)明的流程框圖。圖2是河道類和接口之間的關系圖。圖3是圖層類和接口之間的關系圖。圖4是地圖和圖層、河道對象之間的相互關系圖。圖5是圖形繪制和存儲函數(shù)調(diào)用過程圖。
具體實施例方式下面結合附圖對本發(fā)明的技術方案做進一步的詳細說明
本實例以Windows XP SP2及以上為操作系統(tǒng)環(huán)境,Visual Studio 2008 SPl為開發(fā)環(huán)境,C++為開發(fā)語言,ArcGIS Engine組件系統(tǒng)為平臺,微軟COM組件技術為技術手段。如圖1所示,本發(fā)明的具體實施步驟如下步驟1,通過對水文中常用專業(yè)模型的分析,歸納出一般水文復雜數(shù)據(jù)對象的公共特征包括對象的名稱、地圖符號、顯示范圍、編號等屬性,還包括繪圖、點擊測試、選擇等方法。基于微軟COM組件模型,構建包含上述特征的抽象接口類,一個以c語言表達的抽象接口類如下
interface IBaseFeature IUnknown
{ HRESULT Name ([out, retval] BSTR* pName); [propput, helpstringf 屬性 Name,] HRESULT Name ([in] BSTR newName); [propget, helpstring("屬性 Envelope")] HRESULT Envelope([out, retval] IEnvelope** pVal); HRESULT Draw ([in] IDisplay* Display); [helpstring("方法 HitTest")] HRESULT HitTest([in] DOUBLE x, [in] DOUBLE y, [in] DOUBLE tolerance); HRESULT ID ([out, retval] LONG* pVal); [propput, helpstringf 屬性 ID")] HRESULT ID ([in] LONG newVal); HRESULT Geometry([out, retval] IGeometry** pVal); HRESULT Geometry ([in] IGeometry* newVal); };
步驟2,在步驟1定義的抽象通用接口基礎上,采用軟件工程中面向對象的思想從接口派生具體的水文復雜對象類,在該具體的類中實現(xiàn)接口中定義的所有公共特征。河道也是水文模型中一種復雜的數(shù)據(jù)類型,由一個河道邊界的面區(qū)域和內(nèi)部的大量斷面組成。以河道為例,從步驟1中得接口派生河道類,該類中實現(xiàn)接口中定義的所有方法, 為了河道數(shù)據(jù)的存儲,河道類也從IPersistMream類派生,河道類和接口之間的關系如圖 2,實現(xiàn)的部分方法如下
class ATL_N0_VTABLE CRiverlD public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CRiverlD, &CLSID_RiverlD>, public IBaseFeature,
public IPersistStream
{
STDMETHOD(get_Name)(BSTR* pName); STDMETHOD(put_Name)(BSTR newName); STDMETHOD(get_Envelope)(IEnvelope** pVal);
STDMETHOD(Draw)(IDisplay* Display, ITrackCancel* TrackCancel); STDMETHOD(HitTest) (DOUBLE x, DOUBLE y, DOUBLE tolerance, VARIANT_B00L* hit);
STDMETHOD(get_ID)(LONG* pVal); STDMETHOD(put_ID)(LONG newVal);STDMETHOD(get_Geometry)(IGeometry** pVal); STDMETHOD(put_Geometry)(!Geometry* newVal);
}
STDMETHODIMP CRiverlD::get_Name(BSTR* pName)
{
*pName = SysAllocString(m—bstrName); return S_OK;
ι
STDMETHODIMP CRiverlD::put_Name(BSTR newName)
{
::SysReAlIocString(&m_bstrName, newName); return S_OK;
ι
步驟3,首先定義一個能管理步驟1中抽象接口數(shù)組的水文圖層接口,該接口中的函數(shù)必須包括增加、刪除、查找等函數(shù),能對水文復雜數(shù)據(jù)類型接口數(shù)組進行有效管理。以c語言表達的水文圖層接口如下
interface IHydroLayer IUnknown
{ HRESULT AddFeature ([in] IBaseFeature* pFeature); HRESULT DeleteFeature([in] IBaseFeature氺 pFeature); HRESULT FeatureCount ([out, retval] LONG* pVal); HRESULT Feature ([in] LONG nlndex, [out, retval] IBaseFeature水水 pVal);
ι;
其次按照ArcGIS Engine技術文檔中的規(guī)定,采用微軟COM組件技術實現(xiàn)一個自定義的圖層,該圖層必須實現(xiàn)ArcGIS軟件認可的幾個標準接口,并同時實現(xiàn)前面定義的水文圖層接口。為了圖層的存儲,該圖層類同時派生于微軟標準COM接口 IPersistMream,圖層類和接口之間的關系如圖3。以微軟COM技術實現(xiàn)的自定義圖層類如下 class ATL_NO_VTABLE CHydroLayer
public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CModelLayer, &CLSID_ModelLayer>, public IHydroLayer, public ILayer, public IGeoDataset,publicILayerDrawingPropertiesj
publicILegendInfoj
publicIPersistStream
{
ι
步驟4,在將步驟2具體定義的類的多個對象依次加入到步驟3所定義的圖層中,采用自定義圖層的函數(shù)進行有效管理,主要涉及圖層類中的如下操作
STDMETHODIMP CHydroLayer:AddFeature (IBaseFeature* pFeature)
{
if (pFeature == 0)return E_P0INTER; m_ipltems. push_back(pFeature); return S_0K;
}
步驟5,將步驟4中已經(jīng)容納了實際對象數(shù)組的圖層加入到ArcGIS Engine的地圖中, 地圖和圖層、復雜對象之間的相互關系如圖4所示。 地圖自動調(diào)用圖層的繪制函數(shù),圖層調(diào)用復雜數(shù)據(jù)類型的繪制函數(shù)在地圖上顯示自定義的數(shù)據(jù)對象,在地圖存儲的過程中也有相似的函數(shù)調(diào)用過程,繪圖函數(shù)Draw和存儲函數(shù)Mve調(diào)用過程如圖5所示。
權利要求
1.一種基于ArcGIS Engine的水文復雜數(shù)據(jù)類型擴充方法,其特征在于,包括以下步驟步驟1 首先提取出水文復雜數(shù)據(jù)類型的公共特征,其次按照微軟COM組件技術標準定義包含上述公共特征的抽象接口 ;所述公共特征為能夠充分反映水文數(shù)據(jù)類型共同的信息特征;步驟2 在步驟1中定義的抽象接口基礎上,采用軟件工程中面向對象的方法從中派生具體的水文復雜數(shù)據(jù)類型,在派生出的水文復雜數(shù)據(jù)類型中實現(xiàn)步驟1中定義的所有公共特征;步驟3 按照ArcGIS Engine組件的要求構建水文圖層,該水文圖層須能容納步驟2得到的包含水文復雜數(shù)據(jù)類型接口的數(shù)組;步驟4 根據(jù)水文模型的構建需求和面向對象的方法,建立步驟2定義的具體水文復雜數(shù)據(jù)類型的對象,然后將其加入到步驟3構建的自定義水文圖層中;步驟5 將步驟4中包含有水文復雜數(shù)據(jù)對象的自定義水文圖層加入到ArcGIS地圖中顯不。
2.根據(jù)權利要求1所述的基于ArcGISEngine的水文復雜數(shù)據(jù)類型擴充方法,其特征在于,步驟1所述水文數(shù)據(jù)類型共同的信息特征包括水文復雜數(shù)據(jù)類型對象的名稱、地圖符號、顯示范圍、編號屬性,以及繪圖方法、點擊測試方法、選擇方法。
3.根據(jù)權利要求1所述的基于ArcGISEngine的水文復雜數(shù)據(jù)類型擴充方法,其特征在于,步驟3的具體步驟如下步驟a,定義一個能管理步驟1所述抽象接口數(shù)組的水文圖層接口,該接口中的函數(shù)包括增加、刪除、查找函數(shù);步驟b,按照ArcGIS Engine技術文檔中的規(guī)定,采用微軟COM組件技術實現(xiàn)一個自定義的水文圖層,該水文圖層可實現(xiàn)步驟a定義的水文圖層接口,也同時實現(xiàn)ArcGIS軟件認可的標準接口。
4.根據(jù)權利要求1所述的基于ArcGISEngine的水文復雜數(shù)據(jù)類型擴充方法,其特征在于,步驟1中采用C語言的語法和IDL文件的格式定義包含所述公共特征的抽象接口類型。
全文摘要
本發(fā)明公開了一種基于ArcGISEngine的水文復雜數(shù)據(jù)類型擴充方法,以ArcGISEngine的組件對象模型為基礎,構建一種可以容納自定義水文復雜數(shù)據(jù)類型對象的組件模型。本發(fā)明首先提取出水文復雜數(shù)據(jù)類型的公共特征,定義水文復雜數(shù)據(jù)類型的接口,構建能容納所定義接口數(shù)組的水文圖層,然后采用面向對象的思想構建模型。本發(fā)明減少了專業(yè)模型編制人員處理數(shù)據(jù)的復雜度,有別于現(xiàn)有地理信息系統(tǒng)常用點、線、面圖層的復雜拓撲組合來表達復雜地理對象的方法,提供了一種將現(xiàn)有地理信息系統(tǒng)與專業(yè)模型緊密耦合的途徑,將促進地理信息系統(tǒng)與專業(yè)模型真正意義上的融合。
文檔編號G06F17/30GK102495859SQ20111037340
公開日2012年6月13日 申請日期2011年11月22日 優(yōu)先權日2011年11月22日
發(fā)明者向小華, 吳曉玲 申請人:河海大學