Query Layer介绍
Query Layer介紹
題記
Query Layer的具體介紹大家在2010年Esri中國(guó)北方用戶大會(huì)分發(fā)的ArcGIS中國(guó)通訊上已經(jīng)有《ArcGIS10新特性之Query Layer介紹》,這里面就不做重復(fù)的說(shuō)明了。下面所介紹的就是對(duì)文中沒有涉及知識(shí)的相關(guān)補(bǔ)充。
概念
Query Layer是通過?SQL?查詢定義的圖層或獨(dú)立表。通過查詢圖層可將空間信息和非空間信息都存儲(chǔ)在?DBMS?中,從而使這些信息可以輕松地整合到?ArcMap?中的各?GIS?項(xiàng)目。
其實(shí)就是把我們的空間數(shù)據(jù)圖層的概念看作成后臺(tái)數(shù)據(jù)庫(kù)存儲(chǔ)的表的概念,因?yàn)槲覀兺ǔA?xí)慣于利用SQL語(yǔ)句來(lái)直接操作屬性表,但是對(duì)空間數(shù)據(jù)圖層來(lái)說(shuō)在ArcGIS10之前是不支持的,鑒于大家對(duì)SQL的喜愛,Esri在ArcGIS10就引入了Query Layer,它就可以直接使用SQL語(yǔ)句進(jìn)行查詢或者空間數(shù)據(jù)與屬性數(shù)據(jù)的聯(lián)表查詢。
使用前
- 必須采用當(dāng)前使用的?ArcGIS?版本支持的?DBMS?版本。
- 查詢圖層定義中必須包括在查詢圖層中用作對(duì)象?ID?的唯一、非空的列或列組合。
- 根據(jù)所使用的?DBMS?類型,可能需要在?DBMS?中進(jìn)行一些必要的配置來(lái)使用空間類型。
- 另外,根據(jù)?DBMS?類型,可能需要在從中創(chuàng)建查詢圖層連接的每個(gè)客戶端計(jì)算機(jī)上進(jìn)行一些配置。
特點(diǎn)
保存為文件
通過另存為圖層文件?(.lyr)、創(chuàng)建圖層包?(.lpk)?或通過地圖包?(.mpk)?綁定地圖和關(guān)聯(lián)數(shù)據(jù),查詢圖層可在用戶之間、應(yīng)用程序之間和其他地圖文檔之間輕松地實(shí)現(xiàn)共享。
其實(shí)這個(gè)文件與我們經(jīng)常使用的MXD文件有異曲同工之妙,該文件并沒有存儲(chǔ)真正的查詢數(shù)據(jù)信息,而是存儲(chǔ)了服務(wù)器連接信息、查詢過濾條件信息,這樣也就保證我們隨時(shí)可以查詢最新的信息。
案例
????為了證明新增數(shù)據(jù)可以同步在Query Layer顯示,筆者進(jìn)行了相關(guān)測(cè)試。
環(huán)境:Oracle數(shù)據(jù)庫(kù)、ArcMap10、ArcSDE10
1:新建一個(gè)Query Layer圖層
2:選擇數(shù)據(jù)連接
3:針對(duì)一個(gè)圖層或者一個(gè)圖層與普通表進(jìn)行條件過濾或者聯(lián)表查詢條件過濾
4:參數(shù)添加完畢后,Query Layer就可以加載到ArcMap上了,然后也可以另存為上面所說(shuō)的相關(guān)格式文件。假如我們將Query Layer存儲(chǔ)為XX.lyr文件,C:\Users\gis\AppData\Roaming\ESRI\Desktop10.0\ArcMap文件夾下會(huì)產(chǎn)生一個(gè)***.qcf存儲(chǔ)Query Layer的連接信息文件。
5:編輯當(dāng)前源數(shù)據(jù)文件,修改相關(guān)屬性,使其在過濾條件之內(nèi)。
6:重新加載Query Layer文件,發(fā)現(xiàn)并沒有實(shí)時(shí)的將最新的數(shù)據(jù)給加載上去。
這是為什么呢?
解決方式:查看幫助,ArcGIS10有中文幫助,肯定讓不少GISer為之瘋狂。
?
如果在?ArcSDE?地理數(shù)據(jù)庫(kù)中對(duì)版本化的要素類定義了查詢,則查詢將只返回基表中的數(shù)據(jù);而不會(huì)返回添加表(Add?表)或刪除表(Delete?表)中的任何信息。
看到這個(gè)信息就恍然大悟,原來(lái)這個(gè)Query Layer針對(duì)版本數(shù)據(jù)時(shí)這個(gè)概念啊!這點(diǎn)相似于版本與歷史歸檔的關(guān)系。
感覺這個(gè)讓用戶有點(diǎn)不爽了,編輯完數(shù)據(jù),必須實(shí)時(shí)的進(jìn)行Compress,才能使數(shù)據(jù)進(jìn)行同步了。
擴(kuò)展
鑒于Query Layer可以保存為一個(gè)文件而不用保存數(shù)據(jù)的特點(diǎn),我們?cè)谑褂肁rcGIS Engine開發(fā)的時(shí)候,也可以事先把我們經(jīng)常要使用的查詢語(yǔ)句所對(duì)應(yīng)的數(shù)據(jù)以Query Layer的文件形式保存,到時(shí)候我們直接可以加載該*.lyr文件,然后再進(jìn)行相關(guān)分析。
案例
在國(guó)土行業(yè)中,我們會(huì)使用地類圖斑這個(gè)面狀圖層進(jìn)行相關(guān)分析,因?yàn)樵搱D層包含一個(gè)土地用途的字段(土地用途就是將不同的土地利用以不同的利用代碼),因?yàn)樵撏恋赜猛景宋覀兪褂玫乃写a,但是我們有時(shí)候針對(duì)的數(shù)據(jù)往往可能是,我專門對(duì)耕地(011,012,013)或者建設(shè)用地(201等)這些進(jìn)行分析或者統(tǒng)計(jì),那么我們就可以事先創(chuàng)建不同的Query Layer進(jìn)行分析,不用每次就進(jìn)行先查詢后分析的過程了。
Query Layer比較
?
Query Layer VS. Definition Query
Definition Query:單個(gè)要素類、動(dòng)態(tài)顯示、非保存
只是對(duì)某一個(gè)要素類進(jìn)行過濾條件的查詢,而且這些數(shù)據(jù)不能以文件的形式保存(注意不是將數(shù)據(jù)導(dǎo)出,而是說(shuō),我進(jìn)行該方式的查詢,如果再一次使用同樣的條件只能將Where條件重新輸入。
Query Layer VS. Join
Join:可以進(jìn)行單個(gè)要素與屬性表的連接,動(dòng)態(tài)顯示、非保存
這一點(diǎn)其實(shí)與上面的Definition Query比較類似。而且Join不能處理1對(duì)多的關(guān)系。
Query Layer VS. ArcSDE視圖
ArcSDE視圖:與Query Layer類似,支持單個(gè)要素類或者一個(gè)要素類與屬性表聯(lián)表、在數(shù)據(jù)庫(kù)中以視圖的形式存儲(chǔ)。
Query Layer可用于作為地理處理工具的輸入來(lái)顯示數(shù)據(jù),或使用開發(fā)人員?API?通過編程方式進(jìn)行訪問。Query Layer可以修改相關(guān)的過濾條件,但是ArcSDE視圖都不能做到。
ArcGIS Engine開發(fā)Query Layer
獲得SQL工作空間
//方式一???
IWorkspaceFactory2 workspaceFactory2 = new SqlWorkspaceFactoryClass();
????????????????// Create the connection properties.
????????????????IPropertySet connectionProps = new PropertySetClass();
????????????????connectionProps.SetProperty("dbclient", "oracle11g");
????????????????connectionProps.SetProperty("serverinstance", "lish");
????????????????//connectionProps.SetProperty("database", "sde");
????????????????connectionProps.SetProperty("authentication_mode", "dbms");
????????????????connectionProps.SetProperty("user", "sde");
????????????????connectionProps.SetProperty("password", "sde");
????????????????// Open the workspace.
????????????????IWorkspace workspace = workspaceFactory2.Open(connectionProps, 0);
?
//方式二
// Create the workspace factory.
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SqlWorkspaceFactory");
IWorkspaceFactory2 workspaceFactory2 = (IWorkspaceFactory2)Activator.CreateInstance
????(factoryType);
?
// Build a connection string.
String[] connectionProps =
{
????"dbclient=SQLServer", "serverinstance=MyMachine\\SqlExpress",
????????"database=MyDatabase", "authentication_mode=OSA"
};
String connString = String.Join(";", connectionProps);
?
// Open the workspace.
IWorkspace workspace = workspaceFactory2.OpenFromString(connString, 0);
?
?
簡(jiǎn)單說(shuō)明一下幾個(gè)參數(shù)的意思:
???Dbclient
根據(jù)不同的數(shù)據(jù)庫(kù)類型填寫不同的值
???????SQLServer
???????Oracle10g
???????Oracle11g
???????PostgreSQL
???????Informix
???????DB2
???????DB2ZOS
???Serverinstance
該值應(yīng)該填寫數(shù)據(jù)庫(kù)服務(wù)器的IP或者主機(jī)名
對(duì)SQL Server Express,?使用?machine_name\instance_name
???Database
連接數(shù)據(jù)庫(kù)的名稱
???Authentication_mode
DBMS(默認(rèn)) 和?operating systems authentication (OSA)兩種方式.
Creating a query description
IQueryDescription queryDescription = sqlWorkspace.GetQueryDescription(
"SELECT COUNTY, HIGHWAY FROM HIGHWAYS");
?
queryDescription.OIDFields = "COUNTY, HIGHWAY";
Creating a query class
IQueryDescription queryDescription = sqlWorkspace.GetQueryDescription(
????"SELECT * FROM PARCELS");
ITable queryClass = sqlWorkspace.OpenQueryClass("Parcels", queryDescription);
Creating a query cursor
// Construct a SQL query.
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.Append("SELECT CITY_NAME, STATE_NAME, CITYSHAPE ");
queryBuilder.Append("FROM CAPITALS JOIN STATES ");
queryBuilder.Append("ON CAPITALS.FIPS = STATES.FIPS ");
queryBuilder.Append("ORDER BY CITY_NAME");
String query = queryBuilder.ToString();
?
using(ComReleaser comReleaser = new ComReleaser())
{
????// Create the query cursor.
????IFeatureCursor featureCursor = (IFeatureCursor)sqlWorkspace.OpenQueryCursor
????????(query);
????comReleaser.ManageLifetime(featureCursor);
?
????// Iterate through the features.
????IFeature feature = null;
????while ((feature = featureCursor.NextFeature()) != null)
????{
????????// Write the values to the console.
????????Console.WriteLine("City: {0}", feature.get_Value(0));
????????Console.WriteLine("State: {0}", feature.get_Value(1));
????????IPoint point = feature.get_Value(2)as IPoint;
????????if (point != null)
????????{
????????????Console.WriteLine("Location: {0}, {1}", point.X, point.Y);
????????}
????}
}
在我們ArcGIS Engine開發(fā)中,如果進(jìn)行屬性查詢我們通常使用IQueryFilter,聯(lián)表查詢使用IQueryDef,但是如果條件是只讀,建議用戶考慮使用這種方式,效率比較高。
轉(zhuǎn)載于:https://www.cnblogs.com/sqlite3/archive/2012/06/09/2566683.html
總結(jié)
以上是生活随笔為你收集整理的Query Layer介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你学习ROR-6.Rooter的
- 下一篇: TopFreeTheme精选免费模板【2