1.引言?
??? 近年來,地理信息系統(GIS)發展迅速。為了在全球范圍內實現GIS軟件組件的互操作性,OGC(Open GIS Consortium)提出了空間要素服務(WFS)的實現規范[1],有利于解決基于Web的GIS軟件的數據共享、互操作性和開放性等問題。
??? WFS是OGC提出的一種空間要素服務。它將Web服務應用于地理信息系統,允許客戶端通過互聯網從多個服務器端獲取以地理標注語言GML(Geography Markup Language)編碼的空間地理數據。
??? 空間數據的查詢是通過發送GetFeature請求來實現的。在WFS的實現規范中,一個GetFeature請求是由空間要素類型、屬性和查詢條件三部分組成,以XML格式定義。其中要素類型用于指定查詢哪類要素,屬性用于指定需獲取該要素的哪些屬性,而查詢條件用于篩選出滿足指定條件的要素。?
??? 我們的課題是需要實現一個基于J2EE的WFS系統;其中存儲空間數據的數據源采用的是ArcSDE(ESRI公司開發的空間數據庫軟件),在查詢數據源ArcSDE時使用其自身提供的客戶端應用接口。由于ArcSDE應用接口與WFS應用接口之間存在著差異,因此需要對收到的WFS GetFeature請求作一些適當的變換,以適應ArcSDE的數據查詢。
??? 本文將著重介紹以WFS GetFeature請求查詢ArcSDE的實現方法,以及必要的變換算法。
2.設計思想?
??? WFS應用接口與ArcSDE應用接口之間的主要差異在于查詢條件的設置。
首先,在數據格式方面,WFS GetFeature請求中的查詢條件是以XML格式定義,而ArcSDE的應用接口不支持XML,因此需要對此XML字符串進行解析。
??? 其次,在數據內容方面,GetFeature的查詢條件可以分為兩類,一類以要素標識符作為查詢條件;另一類是由空間篩選條件,或者非空間篩選條件,或者這二者的邏輯組合組成的查詢條件。每次查詢只能選用其中一類查詢條件,兩類不能同時出現在一次查詢中。對第一類GetFeature的查詢條件,在ArcSDE的應用接口中提供了一種用要素標識符作為約束條件的篩選器對象來處理此類條件。對于第二類查詢條件,在ArcSDE中可以通過定義SQL屬性查詢來處理GetFeature請求中的非空間篩選條件,而通過添加空間約束的篩選器則可處理請求中的空間篩選條件。對于空間和非空間篩選條件的邏輯組合組成的條件,則相對不易處理。由于在查詢ArcSDE時空間篩選器需以數組的形式設置,使得空間篩選條件之間只能以邏輯“與”的關系進行組合。同樣,由于空間和非空間篩選分開設置,使得空間與非空間篩選條件之間也只能以邏輯“與”的關系進行組合。而在實際的GetFeature請求的查詢條件中,查詢請求可能是由“與”、“或”、“非”三種邏輯關系任意混合組成,條件之間的組合不一定能滿足上述ArcSDE篩選條件的要求。我們在這里提出了一種解決的方案:對查詢條件提取析取范式,轉換成多個“與”項組合(有的與項組合有可能只有一項)的并集,然后對每個“與”項組合組織一次子查詢,每次得到一個結果集,最后對所有的結果集再取并集,即為整個查詢的結果集。
3.算法設計?
??? 根據上面分析的結果,將整個查詢變換分為兩個步驟:
??? (1)對XML格式的查詢條件進行DOM解析。DOM處理XML文檔時會將XML文檔加載到內存中生成一棵DOM節點樹,可以方便地實現遍歷。
??? (2)對查詢條件提取析取范式,將不符合ArcSDE要求的查詢條件拆分為多次。
??? (2.1)遍歷DOM樹同時生成BLRTree,用以去除Not節點,并將非空間條件轉換為SQL語句,將空間條件封裝為特定的類結構。
??? 由于在GetFeature查詢條件的DOM樹中的可能存在著Not節點,而且根據GetFeature查詢條件的格式,所有單個的空間或非空間篩選條件在樹中是以一棵子樹的形式存在,而不是一個節點,因此還不能直接作邏輯關系的轉換,需要對這棵DOM樹進行“化簡”。為了不改變原樹的邏輯,本文定義了一種二叉樹數據結構BLRTree(二元邏輯關系樹—Binary Logic Relation Tree)。在遍歷原DOM樹的過程中,自底向上構造這一數據結構。在BLRTree中,所有的樹枝節點都是二元邏輯運算符“And”或“Or”,而所有的葉子節點都是單個的查詢條件。這種處理是將Not節點作為函數遞歸的一個布爾值參數truth傳遞給下層,在沒有遇到Not節點時,truth都為“true”,而如果遇到了Not節點,只是將truth取反(注意:是取反,而不是取“false”值),并不在Not節點上作任何處理操作,這樣對其下層的子節點就可以根據truth的取值來進行構造相應的了BLRTree子樹。原DOM樹中的所有Not節點在BLRTree中已根據摩根定率降至葉子節點處,且不以節點的形式存在,而并作為條件節點的一個布爾值參數。
??? (2.2)遍歷(后序)BLRTree同時生成O_A_C_Tree,根據分配率和結合律進行邏輯關系變換提取析取范式。
??? BLRTree樹構造完畢后,如果發現樹根是一個條件節點,則不必作邏輯關系轉換。如果是邏輯操作符節點則需進行邏輯關系的轉換。由于最終的結果是多個與項組合的并集(析取范式結構),即將多個與項組合“或”起來。若把每個與項組合中的所有條件項看作是同一層,而把每個與項組合之間看作是同一層,最上層的“或”關系為一層,則可將一個多個與項組合的并集用一種3層孩子兄弟樹的結構來表示。因此定義了一種3層孩子兄弟樹的數據結構O_A_C_Tree(Or-And-Condition Tree)來輔助轉換。在后序遍歷BLRTree的同時,從條件節點開始構造子樹。如遇到Or節點,則通過結合律將左右子樹進行合。而遇到And節點,則通過分配律將左右子樹進行合。如此遞歸操作生成一棵完整的O_A_C_Tree,完成邏輯關系的轉換。
??? (2.3)遍歷O_A_C_Tree,將所有篩選條件放置到兩個數組中,以便于訪問。
??? 完成了邏輯轉換之后,原查詢條件將被放置到兩個數組whereclauses[]和spatialfilters[][]中。其中whereclauses[]是非空間條件組,數組中每個元素代表一次查詢的非空間篩選條件。由于非空間篩選條件是以SQL語句的形式存在,一次子查詢中的非空間篩選條件用邏輯“與”可合并為一個整體,因此一次子查詢中的所有非空間篩選條件可以合并只用一個元素來表示。spatialfilters[][]是空間條件數組,數組中的每一維代表一次子查詢的所有空間篩選條件。用whereclauses[]中的一個元素,再搭配spatialfilters[][]中的相應一組元素(如whereclauses[i]和spatialfilters[i][]可以構成第i次子查詢的篩選條件)就可以構成一次ArcSDE子查詢的全部篩選條件。
??? 如此便可完成一次查詢變換,根據數組的內容就可以設置相應的篩選條件,進行查詢。在處理結果時,將每個取到的結果其封裝成GML格式,寫到輸出流中。這樣不必保存查詢的要素對象實體,降低了系統開銷。由于在對組合條件進行條件拆分的時候,將一次查詢分成了多次子查詢,因此每次子查詢的結果集之間可能會有重復的情況,這時需要將其中重復的結果舍去。由于要素標識符都是唯一確定的,這樣只需把查到過的要素標識符記錄下來,下次再遇到標識符相同的要素將會跳過而不做任何操作。由于查詢的數據量可能會很大,如果只將標識符的值順序的存儲在一個表中,進行查找的開銷會很大,因此為了利于新值的插入和加快查找的速度,本文選擇以二叉排序樹為存儲結構,使用了二叉樹查找算法。
4.算法實現?
?? 關鍵算法:
算法2.1 構造二元邏輯關系樹:?
BLRTreeNode construct ( Node root , boolean truth ){? //root 為DOM樹中的根節點?
?????? if? root為and(/or)? Then? ?
對root的左子樹作construct( root.Lchild , truth )得到Lchild ?
對root的右子樹作construct( root.Rchild , truth )得到Rchild ?
if? truth為true Then?
創建一個and(/or)節點,將Lchild,Rchild作為左右孩子?
Else?
創建一個or(/and)節點,將Lchild,Rchild作為左右孩子?
Endif?
返回新創建的節點?
Endif?
if? root為not?? Then? //not是單目的邏輯運算符,只有一棵子樹?
????????????? if? root的孩子也為not? Then?
????????????? ???? 對root的孫子樹作construct(root.Grandchild, truth)?
????????????? ???? 得到grandchild節點,將其返回?
????????????? Else?
truth取反?
對root的子樹作construct(root.child, truth)?
得到child節點,將其返回?
????????????? Endif?
?????? Endif?
?????? if? root為非空間條件節點??? Then?
????????????? ?? 根據truth 構造非空間條件節點, 將其返回?
Else if? root為空間條件節點??? Then?
????????????? ?? 根據truth 構造空間條件節點, 將其返回?
?????? Endif?
}?
算法2.2? 等價構造析取范式結構樹:?
ORNode LogicTransform ( BLRTreeNode root ){? //root 是BLRTree的根節點?
if? root . Lchild是條件節點??? then?????? ?
????????????? 生成condNode節點cond1 ?
??? ? ??? 新添一個ANDNode節點and1,孩子指針指向cond1?
?????? 新添一個ORNode節點or1,孩子指針指向and1?
Else? 對左子樹作LogicTransform (root . Lchild ),得到or1?
Endif?
if? root . Rchild是條件節點??? then?????? ?
????????????? 生成condNode 節點cond2?
?????? 新添一個ANDNode節點 and2,孩子指針指向cond2?
??? ? ??? 新添一個ORNode 節點or2,孩子指針指向and2?
Else? 對右子樹作LogicTransform (root . Rchild ),得到or2?
Endif?
? if?? root為Or節點? then? ?? ?
將or2節點的所有孩子添加到or1節點的孩子鏈上去?
?????? 返回or1節點?
Endif?
? if?? root為And節點? then?
新添一個ORNode節點newOR?
for( i = 0;i < or1節點孩子個數;i++ ) {?
? for( j = 0;j < or2的孩子個數;j++) {?
新添一個ANDNode節點newAnd?
將or1的第i個孩子的所有子孩子和or2的第j個孩子的所有子孩子都添加到newAnd節點的孩子鏈上去,作為newAnd的共同的孩子?
為newOR的添加一個孩子newAnd?
?????? }?
}?
?????? 返回newOR節點?
Endif?
}n ??? 下面舉一實例來表現轉換的全過程:? ??? 要求查找所有屬于M州,且不同時滿足人口大于100000和與一條起止點坐標為(-50 20,-57 22)的河流相交的城市。? 查詢條件如下:? ??? ? ??????? ??????????? ??????????? ??????? ? ??????? ??????????? ??????????? ??????????????? < gml:coordinates>-50,20 –57,22 gml:coordinates>? ??????????? ? ??????? ? ??? ? ? (1)對XML的查詢條件進行DOM解析后,生成DOM節點樹? ?????? (2.1)遍歷DOM樹同時生成BLRTree: 圖1? 生成BLRTree? ?????? (2.2)遍歷BLRTree樹同時生成O_A_C_Tree? 圖2? 生成O_A_C_Tree? ?????? (2.3)遍歷O_A_C_Tree輸出到數組中? whereclauses[0] =? “StateName=‘M’ And Not Population >100000”? ???? whereclauses[1] =? “StateName=‘M’”? n? n? filters[0]置空 filters[1][0]為不滿足與線相交的空間條件 5、結束語 ??? 本文在對比了WFS GetFeature查詢請求的格式與數據源ArcSDE的查詢的基礎上,提出了一種將WFS的要素查詢變換為ArcSDE查詢對象的變換算法,并著重介紹了以WFS的應用接口對數據源ArcSDE進行查詢實現的實現方法。 ??? 在轉換的過程中為了實現數據的接口一致性,進行一系列的數據轉換,這勢必增加系統的負擔,降低系統的效率。因此,還需要在系統的優化方面作進一步的研究。 參考文獻 1.?Open GIS Consortium Inc.,Feature Service Implementation Specification 1.0.0 (02-058) ,Version 1.0.0, 19-September-2002 2.?Open GIS Consortium Inc.,OpenGIS Filter Encoding Implementation Specification 1.0.0 (02-059),Version 1.0.0, 19-September-2001 3.?Open GIS Consortium Inc.,OpenGIS Geography Markup Language (GML) Implementation Specification (02-009),Version 2.1.1, 25-April-2002 4. ESRI,ArcSDE Developer Help 8.3 2003年 5.?Don Box, Aaron Skonnard和John Lam著,卓棟濤譯。XML 本質論。中國電力出版社,2003年3月第一版