Query Layer介绍
Query Layer介紹
題記
Query Layer的具體介紹大家在2010年Esri中國北方用戶大會分發的ArcGIS中國通訊上已經有《ArcGIS10新特性之Query Layer介紹》,這里面就不做重復的說明了。下面所介紹的就是對文中沒有涉及知識的相關補充。
概念
Query Layer是通過?SQL?查詢定義的圖層或獨立表。通過查詢圖層可將空間信息和非空間信息都存儲在?DBMS?中,從而使這些信息可以輕松地整合到?ArcMap?中的各?GIS?項目。
其實就是把我們的空間數據圖層的概念看作成后臺數據庫存儲的表的概念,因為我們通常習慣于利用SQL語句來直接操作屬性表,但是對空間數據圖層來說在ArcGIS10之前是不支持的,鑒于大家對SQL的喜愛,Esri在ArcGIS10就引入了Query Layer,它就可以直接使用SQL語句進行查詢或者空間數據與屬性數據的聯表查詢。
使用前
- 必須采用當前使用的?ArcGIS?版本支持的?DBMS?版本。
- 查詢圖層定義中必須包括在查詢圖層中用作對象?ID?的唯一、非空的列或列組合。
- 根據所使用的?DBMS?類型,可能需要在?DBMS?中進行一些必要的配置來使用空間類型。
- 另外,根據?DBMS?類型,可能需要在從中創建查詢圖層連接的每個客戶端計算機上進行一些配置。
特點
保存為文件
通過另存為圖層文件?(.lyr)、創建圖層包?(.lpk)?或通過地圖包?(.mpk)?綁定地圖和關聯數據,查詢圖層可在用戶之間、應用程序之間和其他地圖文檔之間輕松地實現共享。
其實這個文件與我們經常使用的MXD文件有異曲同工之妙,該文件并沒有存儲真正的查詢數據信息,而是存儲了服務器連接信息、查詢過濾條件信息,這樣也就保證我們隨時可以查詢最新的信息。
案例
????為了證明新增數據可以同步在Query Layer顯示,筆者進行了相關測試。
環境:Oracle數據庫、ArcMap10、ArcSDE10
1:新建一個Query Layer圖層
2:選擇數據連接
3:針對一個圖層或者一個圖層與普通表進行條件過濾或者聯表查詢條件過濾
4:參數添加完畢后,Query Layer就可以加載到ArcMap上了,然后也可以另存為上面所說的相關格式文件。假如我們將Query Layer存儲為XX.lyr文件,C:\Users\gis\AppData\Roaming\ESRI\Desktop10.0\ArcMap文件夾下會產生一個***.qcf存儲Query Layer的連接信息文件。
5:編輯當前源數據文件,修改相關屬性,使其在過濾條件之內。
6:重新加載Query Layer文件,發現并沒有實時的將最新的數據給加載上去。
這是為什么呢?
解決方式:查看幫助,ArcGIS10有中文幫助,肯定讓不少GISer為之瘋狂。
?
如果在?ArcSDE?地理數據庫中對版本化的要素類定義了查詢,則查詢將只返回基表中的數據;而不會返回添加表(Add?表)或刪除表(Delete?表)中的任何信息。
看到這個信息就恍然大悟,原來這個Query Layer針對版本數據時這個概念啊!這點相似于版本與歷史歸檔的關系。
感覺這個讓用戶有點不爽了,編輯完數據,必須實時的進行Compress,才能使數據進行同步了。
擴展
鑒于Query Layer可以保存為一個文件而不用保存數據的特點,我們在使用ArcGIS Engine開發的時候,也可以事先把我們經常要使用的查詢語句所對應的數據以Query Layer的文件形式保存,到時候我們直接可以加載該*.lyr文件,然后再進行相關分析。
案例
在國土行業中,我們會使用地類圖斑這個面狀圖層進行相關分析,因為該圖層包含一個土地用途的字段(土地用途就是將不同的土地利用以不同的利用代碼),因為該土地用途包含了我們使用的所有代碼,但是我們有時候針對的數據往往可能是,我專門對耕地(011,012,013)或者建設用地(201等)這些進行分析或者統計,那么我們就可以事先創建不同的Query Layer進行分析,不用每次就進行先查詢后分析的過程了。
Query Layer比較
?
Query Layer VS. Definition Query
Definition Query:單個要素類、動態顯示、非保存
只是對某一個要素類進行過濾條件的查詢,而且這些數據不能以文件的形式保存(注意不是將數據導出,而是說,我進行該方式的查詢,如果再一次使用同樣的條件只能將Where條件重新輸入。
Query Layer VS. Join
Join:可以進行單個要素與屬性表的連接,動態顯示、非保存
這一點其實與上面的Definition Query比較類似。而且Join不能處理1對多的關系。
Query Layer VS. ArcSDE視圖
ArcSDE視圖:與Query Layer類似,支持單個要素類或者一個要素類與屬性表聯表、在數據庫中以視圖的形式存儲。
Query Layer可用于作為地理處理工具的輸入來顯示數據,或使用開發人員?API?通過編程方式進行訪問。Query Layer可以修改相關的過濾條件,但是ArcSDE視圖都不能做到。
ArcGIS Engine開發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);
?
?
簡單說明一下幾個參數的意思:
???Dbclient
根據不同的數據庫類型填寫不同的值
???????SQLServer
???????Oracle10g
???????Oracle11g
???????PostgreSQL
???????Informix
???????DB2
???????DB2ZOS
???Serverinstance
該值應該填寫數據庫服務器的IP或者主機名
對SQL Server Express,?使用?machine_name\instance_name
???Database
連接數據庫的名稱
???Authentication_mode
DBMS(默認) 和?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開發中,如果進行屬性查詢我們通常使用IQueryFilter,聯表查詢使用IQueryDef,但是如果條件是只讀,建議用戶考慮使用這種方式,效率比較高。
轉載于:https://www.cnblogs.com/sqlite3/archive/2012/06/09/2566683.html
總結
以上是生活随笔為你收集整理的Query Layer介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你学习ROR-6.Rooter的
- 下一篇: Overview of the New