《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 基于Java的ArcSDE空間數據查詢的設計與實現

基于Java的ArcSDE空間數據查詢的設計與實現

2009-01-15
作者:樊昱,高紅雨,廖湖聲

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)的河流相交的城市。?

查詢條件如下:?

?

?

StateName?

??? M?

?

?

?

??????? ?

??????????? Population?

??????????? 100000?

??????? ?

??????? ?

??????????? Feature?

??????????? ?

??????????????? < gml:coordinates>-50,20 –57,22?

??????????? ?

??????? ?

??? ?

?

(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月第一版

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲素人在线| 欧美日韩中文在线观看| 亚洲美女网站| 91久久黄色| 久久精精品视频| 久久成人这里只有精品| 欧美一区二粉嫩精品国产一线天| 亚洲影院高清在线| 亚洲午夜精品一区二区| 在线视频欧美日韩精品| 99视频精品全部免费在线| 日韩一级视频免费观看在线| 亚洲毛片在线看| 99国内精品| 洋洋av久久久久久久一区| 一本久久综合亚洲鲁鲁五月天| 日韩一区二区久久| 在线亚洲一区| 亚洲无毛电影| 亚洲欧美一区二区三区极速播放| 午夜国产不卡在线观看视频| 羞羞色国产精品| 亚洲二区在线| 亚洲久久成人| 国产精品99久久久久久宅男| 亚洲香蕉视频| 亚洲女人天堂av| 欧美一区激情| 久久综合中文字幕| 欧美精品色网| 国产精品九色蝌蚪自拍| 国产免费观看久久| 极品尤物久久久av免费看| 亚洲大胆在线| 亚洲欧洲日产国产综合网| aa级大片欧美| 性色av一区二区三区红粉影视| 久久激情综合网| 亚洲毛片在线看| 亚洲在线视频观看| 欧美专区日韩专区| 蜜桃av一区二区| 欧美日韩色婷婷| 国产伦精品一区二区三区照片91| 黄色精品免费| 亚洲精品综合久久中文字幕| 亚洲综合色网站| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲女女女同性video| 亚洲男人影院| 麻豆成人精品| 欧美视频在线观看一区| 国产日韩欧美在线播放| 亚洲国产婷婷| 亚洲欧美日韩一区| 亚洲日本va在线观看| 亚洲欧美成aⅴ人在线观看| 久久天天躁狠狠躁夜夜av| 老司机免费视频一区二区| 欧美日韩1区| 国产视频欧美视频| 亚洲精品欧美专区| 欧美一区免费| 在线一区二区三区四区| 久久久久国产一区二区三区| 欧美金8天国| 国产日韩亚洲欧美| 日韩午夜剧场| 亚洲国产精品成人综合色在线婷婷 | 亚洲图片在区色| 亚洲第一网站| 亚洲综合成人在线| 欧美激情无毛| 国产一区二区三区久久 | 亚洲精品视频一区二区三区| 先锋资源久久| 亚洲一区综合| 欧美激情影院| 狠狠色丁香婷婷综合| 一区二区三区福利| 亚洲免费久久| 美女精品国产| 国产农村妇女毛片精品久久麻豆 | 嫩草国产精品入口| 国产九九精品视频| 一本色道久久综合一区| 最新中文字幕一区二区三区| 久久精品国产2020观看福利| 欧美午夜在线一二页| 亚洲国产美国国产综合一区二区| 性久久久久久久久久久久| 亚洲综合另类| 欧美日韩日日夜夜| 亚洲人www| 亚洲精品视频免费在线观看| 久久久久成人网| 国产日韩精品在线观看| 日韩香蕉视频| 一本色道久久综合精品竹菊| 欧美a级大片| 在线观看成人小视频| 欧美亚洲午夜视频在线观看| 午夜日韩av| 国产精品久久久久一区| 一本一道久久综合狠狠老精东影业| 亚洲免费成人av| 欧美在线视频免费| 国产精品毛片a∨一区二区三区|国| 精品999在线播放| 欧美一区二区三区免费观看| 香蕉久久久久久久av网站| 午夜欧美精品| 性欧美18~19sex高清播放| 亚洲一区二区三区777| 欧美精品一区二区精品网 | 亚洲色图综合久久| 欧美日韩成人在线观看| 亚洲国产日韩一级| 91久久国产综合久久| 免费精品视频| 亚洲国产福利在线| 亚洲人在线视频| 欧美激情视频网站| 亚洲精品日韩精品| 一区二区三区高清在线观看| 欧美日韩高清免费| 99国产一区二区三精品乱码| 亚洲午夜三级在线| 欧美午夜精品理论片a级按摩| 在线一区二区三区四区| 亚洲一区二区三区成人在线视频精品| 欧美视频中文在线看| 在线亚洲高清视频| 先锋影音网一区二区| 国产午夜精品理论片a级大结局| 欧美一区二区三区免费观看视频 | 欧美日韩一级片在线观看| 日韩视频在线观看| 亚洲欧美福利一区二区| 国产日韩欧美另类| 久久精品国产亚洲一区二区| 欧美国产国产综合| 亚洲精品中文字幕女同| 亚洲免费婷婷| 国产一区二区三区丝袜| 亚洲国产一区二区三区高清| 欧美高清在线播放| 99视频精品在线| 欧美资源在线观看| 亚洲国产第一| 亚洲在线第一页| 国产一区二三区| 亚洲免费不卡| 国产精品外国| 亚洲国产精品t66y| 欧美日韩伦理在线免费| 亚洲欧洲99久久| 欧美高清在线视频| 亚洲丝袜av一区| 久久精品国产v日韩v亚洲| 在线观看精品| 亚洲午夜精品国产| 国产亚洲一区二区三区| 日韩视频不卡中文| 国产精品视频内| 亚洲激情六月丁香| 黄色亚洲在线| 亚洲黑丝在线| 嫩模写真一区二区三区三州| 国产乱码精品| a4yy欧美一区二区三区| 欧美一区免费视频| 欧美丰满少妇xxxbbb| 中日韩在线视频| 麻豆av一区二区三区| 一区二区高清在线观看| 久久精品主播| 99精品欧美一区二区蜜桃免费| 久久精品伊人| 99av国产精品欲麻豆| 久久免费视频观看| avtt综合网| 欧美成人精精品一区二区频| 亚洲视频自拍偷拍| 欧美h视频在线| 午夜在线一区| 欧美日韩理论| 亚洲国产精品一区二区三区| 国产精品看片资源| 日韩午夜在线观看视频| 国产日韩欧美亚洲| 在线视频日韩精品| 在线免费日韩片| 欧美在线三区| 一区二区激情| 欧美高清视频| 亚洲成色www久久网站| 国产精品美女久久久浪潮软件| 亚洲欧洲一区二区三区| 国产亚洲一区二区三区在线观看 |