日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Query Layer介绍

發(fā)布時(shí)間:2025/3/15 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Query Layer介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。