ArcGIS中的三種查詢

ArcGIS runtime SDK for WPF/Silverlight中的三種常用的查詢:QueryTask、FindTask、IdentifyTask都是繼承自ESRI.ArcGIS.Client.Tasks,關係如下圖所示:

1、QueryTask:是一個進行空間和屬性查詢的功能類,它可以在某個地圖服務的某個子圖層內進行查詢,順便提一下的是,QueryTask進行查詢的地圖服務並不必須加載到Map中進行顯示。QueryTask的執行需要兩個先決條件:一個是需要查詢的圖層URL、一個是進行查詢的過濾條件。

下面是QueryTask的基本過程:

複製代碼
            //新建一個QueryTask
            QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");

            // Query對象
            Query query = new Query();

            //傳入空間幾何範圍,可以不設置
            //合法的geometry類型是Extent, Point, Multipoint, Polyline, Polygon
            query.Geometry = geometry;

            //是否返回查詢結果的空間幾何信息
            query.ReturnGeometry = true;

            //查詢結果返回的字段,字段必須在圖層中,字段的大小寫可忽略
            query.OutFields.AddRange(new string[] { "AREANAME", "POP2000" });
            //quer.OutField.Add("*"); //返回所有字段 

            //查詢的where條件,可以是任何合法的SQL語句,可以不設置
            query.Where = "POP2000 > 350000";

            //異步查詢,需要綁定queryTask的兩個事件,通過ExecuteCompleted得到查詢結果
            queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
            queryTask.Failed += QueryTask_Failed;
            queryTask.ExecuteAsync(query);

            //同步查詢,不需要綁定事件,直接返回查詢結果
            //FeatureSet featureSet = queryTask.Execute(query);
複製代碼

 

2、FindTask:允許對地圖中一個或多個圖層的要素進行基於屬性字段值的查詢(search one or more layers in a map for features with attribute values that match or contain an input value)。FindTask不能進行“空間查詢”,因爲FindTask可以對多個圖層進行查詢,所有它的url屬性需要指向所查詢的地圖服務的REST URL,而不像QueryTask需要指定某個圖層的URL。

下面是FindTask的基本過程:

複製代碼
            //新建一個Find task
            FindTask findTask = new FindTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/");

            //異步執行,綁定事件
            findTask.ExecuteCompleted += FindTask_ExecuteCompleted;
            findTask.Failed += FindTask_Failed;

            //初始化FindParameters參數
            FindParameters findParameters = new FindParameters();
            findParameters.LayerIds.AddRange(new int[] { 3 }); //查找的圖層
            findParameters.SearchFields.AddRange(new string[] { "NAME" }); //查找的字段範圍
            findParameters.ReturnGeometry = true;
            findParameters.SearchText = FindTextBox.Text; //查找的“屬性值”
            
            //設置查詢的LayerDefinitions
            ESRI.ArcGIS.Client.LayerDefinition myDefinition = new ESRI.ArcGIS.Client.LayerDefinition();
            myDefinition.LayerID = 3;
            //設置LayerDefinition,屬性字段“Name”屬於ID爲0的圖層
            //LayerDefinition的設置語句和Query中的Where語句一樣
            myDefinition.Definition = "NAME = 'XXX'";

            //創建一個ObservableCollection,add設置的LayerDefinition
            System.Collections.ObjectModel.ObservableCollection<LayerDefinition> myObservableCollection =
               new System.Collections.ObjectModel.ObservableCollection<LayerDefinition>();
            myObservableCollection.Add(myDefinition);
            findParameters.LayerDefinitions = myObservableCollection; //設置查詢的LayerDefinitions

            //異步執行
            findTask.ExecuteAsync(findParameters);
複製代碼

 

3、IdentifyTask:是一個在地圖服務中識別要素(Feature)的功能類。通過IdentifyTask可以搜索地圖層中與輸入幾何形相交的要素(search the layers in a map for features that intersect an input geometry)。因爲也是在多個圖層中查詢,所以Task的URL是動態圖層服務的地址。同樣,返回的要素都可以作爲Graphic被添加到地圖的GraphicsLayer上。

基本過程如下:

複製代碼
            //新建一個Identify task
            IdentifyTask identifyTask = new IdentifyTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer");

            //異步執行,綁定事件
            identifyTask.ExecuteCompleted += IdentifyTask_ExecuteCompleted;
            identifyTask.Failed += IdentifyTask_Failed;

            //初始化 Identify parameters
            IdentifyParameters identifyParameters = new IdentifyParameters();
            identifyParameters.LayerOption = LayerOption.all;

            //傳遞地圖屬性給 identify parameters
            identifyParameters.MapExtent = MyMap.Extent;
            identifyParameters.Width = (int)MyMap.ActualWidth;
            identifyParameters.Height = (int)MyMap.ActualHeight;

            //輸入的幾何參數爲一個點,args來自點擊事件
            identifyParameters.Geometry = args.MapPoint; //Point Envelop Extent polyline polygon

            //設置查詢的LayerDefinitions
            ESRI.ArcGIS.Client.LayerDefinition myDefinition = new ESRI.ArcGIS.Client.LayerDefinition();
            myDefinition.LayerID = 3;
            //設置LayerDefinition,屬性字段“Name”屬於ID爲0的圖層
            //LayerDefinition的設置語句和Query中的Where語句一樣
            myDefinition.Definition = "NAME = 'XXX'";
            //創建一個ObservableCollection,add設置的LayerDefinition
            System.Collections.ObjectModel.ObservableCollection<LayerDefinition> myObservableCollection =
               new System.Collections.ObjectModel.ObservableCollection<LayerDefinition>();
            myObservableCollection.Add(myDefinition);
            identifyParameters.LayerDefinitions = myObservableCollection; //設置查詢的LayerDefinitions
            
            //異步執行
            identifyTask.ExecuteAsync(identifyParameters);
複製代碼

 

三種查詢的返回結果:

QueryTask:返回的是一個FeatureSet。Featureset.features[i]可以加入到GraphicsLayer上顯示,也可以通過Attributes屬性字段得到屬性信息。

FindTask:返回的是一個FindResults數組, FindResults[i].feature可以加入到GraphicsLayer上顯示,也可以通過Attributes屬性字段得到屬性信息。

IdentifyTask:返回的是一個IdentifyResults數組,IdentifyResults[i].feature可以加入到GraphicsLayer上顯示,也可以通過Attributes屬性字段得到屬性信息。

 

參考:

http://help.arcgis.com/en/webapi/silverlight/1.2/help/index.html

http://resources.arcgis.com/en/help/runtime-wpf/concepts/index.html#/Querying_and_searching_overview/0170000000m4000000/



原文地址:http://www.cnblogs.com/luxiaoxun/p/3297654.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章