Select features on multiple feature layers within Polygon

2243
5
Jump to solution
08-20-2013 11:13 AM
tonylife
New Contributor III
I am trying to get all features on multiple feature layers inside of a polygon.

I was doing polygon.contains(), it works great for point type feature layer, but not for polyline type or polygon type feature layer.

Then I was directed to implement this in different way, which is doing query on feature layer, by setting query.geomotry = polygon.geometry.
It works fine for single layer, but when it comes to multiple layers, I have trouble to get correct result.
What I am getting, is always the selected features for last layer. Does it clear the selectFeatures result from previous layer every time run for next layer? I did try SELECTION_ADD mode, which is not working either.

Here is the code
var query = new esri.tasks.Query(); query.geometry = area.geometry; var counter = 0; var listOfSelectedFeatures; for (var j = 0; j < map.graphicsLayerIds.length; j++) {  var currentLayer = map.getLayer(map.graphicsLayerIds);      currentLayer.selectFeatures(query, currentLayer.SELECTION_NEW, function () {   counter++;   if (counter == (map.graphicsLayerIds.length - 1)) {    for (var k = 0; k < map.graphicsLayerIds.length; k++) {     var layer = map.getLayer(map.graphicsLayerIds);     if (listOfSelectedFeatures == undefined) {      listOfSelectedFeatures = layer.getSelectedFeatures();     } else {      listOfSelectedFeatures.concat(layer.getSelectedFeatures());     }    }   }  }); }                


Thanks,
Tony
1 Solution

Accepted Solutions
JasonZou
Occasional Contributor III
Try:

var query = new esri.tasks.Query(); query.geometry = area.geometry; var listOfSelectedFeatures = [];  for (var j = 0; j < map.graphicsLayerIds.length; j++) {  var currentLayer = map.getLayer(map.graphicsLayerIds);             if (currentLayer.declaredClass === "esri.layers.FeatureLayer") {          currentLayer.selectFeatures(query, currentLayer.SELECTION_NEW, function (featureSet) {    listOfSelectedFeatures.concat(featureSet.features);         });         } }


Please be noted that
1. The above code only deals with feature layers. Pure graphics layers should be filtered out since graphics layer has no selectFeatures method.
2. listOfSelectedFeatures may contain features in mixed spatial types.

View solution in original post

5 Replies
JasonZou
Occasional Contributor III
Try:

var query = new esri.tasks.Query(); query.geometry = area.geometry; var listOfSelectedFeatures = [];  for (var j = 0; j < map.graphicsLayerIds.length; j++) {  var currentLayer = map.getLayer(map.graphicsLayerIds);             if (currentLayer.declaredClass === "esri.layers.FeatureLayer") {          currentLayer.selectFeatures(query, currentLayer.SELECTION_NEW, function (featureSet) {    listOfSelectedFeatures.concat(featureSet.features);         });         } }


Please be noted that
1. The above code only deals with feature layers. Pure graphics layers should be filtered out since graphics layer has no selectFeatures method.
2. listOfSelectedFeatures may contain features in mixed spatial types.
ZachLiu1
Occasional Contributor II
If you know all the layers you need to select, you may try assign a queryTask for each layer , and after you get the polygon to select features, try"

var queryTask1 = new QueryTask(serviceurl1);
var queryTask2 = new QueryTask(serviceurl2);
var queryTask3 = new QueryTask(serviceurl3);
...
queryTaskList = [queryTask1, queryTask2,queryTask3...];

var query = new Query();
query.spatialRelationship = Query.SPATIAL_REL_CONTAINS;
query.geometry = area.geometry;

var queryTaskToDoList = dojo.map(queryTaskList, function(item, index){
    return item.execute(query)
    }):

var listOfSelectedFeatures = [];

all(queryTaskToDoList).then(function(featureSetList) { //this function returns a list of feature sets from all queryTask executions.
    dojo.forEach(featureSetList, function(featureSet) {
        listOfSelectedFeatures.push(featureSet);
    });
});
0 Kudos
tonylife
New Contributor III
Try:

var query = new esri.tasks.Query();
query.geometry = area.geometry;
var listOfSelectedFeatures = [];

for (var j = 0; j < map.graphicsLayerIds.length; j++) {
 var currentLayer = map.getLayer(map.graphicsLayerIds);
   
        if (currentLayer.declaredClass === "esri.layers.FeatureLayer") {
         currentLayer.selectFeatures(query, currentLayer.SELECTION_NEW, function (featureSet) {
   listOfSelectedFeatures.concat(featureSet.features);
        });
        }
}


Please be noted that
1. The above code only deals with feature layers. Pure graphics layers should be filtered out since graphics layer has no selectFeatures method.
2. listOfSelectedFeatures may contain features in mixed spatial types.


Thanks for your reminder.
The two points you mentioned does make sense to me.
The key to fix my problem is, the returned parameter "featureSet" for callback function of selectFeatures method.
Things got much easier after knowing there is a featureSet returned by selectFeatures.

Here is the updated code, which is working.

            var listOfSelectedFeatures = [];
            $.each(areas, function (ind, area) {
                var query = new esri.tasks.Query();
                query.geometry = area.geometry;

                for (var j = 0; j < GISViewer.map.graphicsLayerIds.length; j++) {
                    var currentLayer = GISViewer.map.getLayer(GISViewer.map.graphicsLayerIds);
                    if (currentLayer.visible) {
                        if (currentLayer.declaredClass === "esri.layers.FeatureLayer") {
                            currentLayer.selectFeatures(query, currentLayer.SELECTION_NEW, function (featureSet) {
                                listOfSelectedFeatures.push.apply(listOfSelectedFeatures, featureSet);
                            });
                        }
                    }
                }
            });
0 Kudos
tonylife
New Contributor III
If you know all the layers you need to select, you may try assign a queryTask for each layer , and after you get the polygon to select features, try"

var queryTask1 = new QueryTask(serviceurl1);
var queryTask2 = new QueryTask(serviceurl2);
var queryTask3 = new QueryTask(serviceurl3);
...
queryTaskList = [queryTask1, queryTask2,queryTask3...];

var query = new Query();
query.spatialRelationship = Query.SPATIAL_REL_CONTAINS;
query.geometry = area.geometry;

var queryTaskToDoList = dojo.map(queryTaskList, function(item, index){
    return item.execute(query)
    }):

var listOfSelectedFeatures = [];

all(queryTaskToDoList).then(function(featureSetList) { //this function returns a list of feature sets from all queryTask executions.
    dojo.forEach(featureSetList, function(featureSet) {
        listOfSelectedFeatures.push(featureSet);
    });
});


Thanks for your solution.
Your solution is doing query against service directly which would introduce client server communication.
What I am trying to do is querying feature layer using existed client side data.
I will try your solution when there comes a need.

Thanks again.
Tony
0 Kudos
GaneshSolai_Sambandam
New Contributor III
Thanks for your solution.
Your solution is doing query against service directly which would introduce client server communication.
What I am trying to do is querying feature layer using existed client side data.
I will try your solution when there comes a need.

Thanks again.
Tony


Hi Tony,
Would able to share your full code incluidng (html, javascript) or put it in a fiddler and it may really help me.
Also, I would like to ask will this work for ARCDynamic Map layers as well.


Regards
Ganesh
0 Kudos