Can Graphics Layers be Queried?

3117
5
Jump to solution
05-03-2017 07:22 AM
ChristopherSchreiber
Occasional Contributor II

Hello,

Can Graphics Layers be Queried?  I cannot see anywhere that says that they cannot.

I know that CSV Layers cannot be queried.

Thanks,

Chris

0 Kudos
1 Solution

Accepted Solutions
ThomasSolow
Occasional Contributor III

In the 4.XX API a layer view can be queried for a graphics layer the same way you would query the layer view for a feature layer: 

// source: https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html
// returns all the graphics from the layer view
view.whenLayerView(lyr).then(function(lyrView){
  lyrView.watch("updating", function(val){
    if(!val){  // wait for the layer view to finish updating
      lyrView.queryFeatures().then(function(results){
        console.log(results);  // prints all the client-side graphics to the console
      });
    }
  });
});

You could pass a Query into layerView.queryFeatures with an extent geometry and the 'intersects' spatial relationship to query for features inside an extent.  See Query | API Reference | ArcGIS API for JavaScript 4.3  for more details.

If you're using the 3.XX API, my bet would be that you could easily write a query method yourself by accessing each graphic in a graphics layer and using the geometry engine to test each one.  This is not an approach that scales especially well.  I'm not sure if layerView.queryFeatures scales very well either.

View solution in original post

5 Replies
RobertScheitlin__GISP
MVP Emeritus

Chris,

  The simple answer is No. But you could manually query the GL by looping through it's graphics and checking the graphics attributes.

ThomasSolow
Occasional Contributor III

In the 4.XX API a layer view can be queried for a graphics layer the same way you would query the layer view for a feature layer: 

// source: https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html
// returns all the graphics from the layer view
view.whenLayerView(lyr).then(function(lyrView){
  lyrView.watch("updating", function(val){
    if(!val){  // wait for the layer view to finish updating
      lyrView.queryFeatures().then(function(results){
        console.log(results);  // prints all the client-side graphics to the console
      });
    }
  });
});

You could pass a Query into layerView.queryFeatures with an extent geometry and the 'intersects' spatial relationship to query for features inside an extent.  See Query | API Reference | ArcGIS API for JavaScript 4.3  for more details.

If you're using the 3.XX API, my bet would be that you could easily write a query method yourself by accessing each graphic in a graphics layer and using the geometry engine to test each one.  This is not an approach that scales especially well.  I'm not sure if layerView.queryFeatures scales very well either.

ChristopherSchreiber
Occasional Contributor II

Thank you all for the feedback!

0 Kudos
RyanSutcliffe
Occasional Contributor II

I could be wrong but I don't see how you can get a LayerView class from a GraphicsLayer. Seems a GraphicsLayer creates a GraphicsLayerView which only has queryGraphics(). The example and link above works only for a FeatureLayer. If either of you were indeed able to do the above would love to see a code sample of how you got this: specifically a LayerView from a GraphicsLayer in a map. 

0 Kudos
RyanSutcliffe
Occasional Contributor II

Taking a second look this morning I see how you can take a collection of graphics and set them as a source for a new FeatureLayer. That way you have access to queryFeatures and related functionality. I thought that a FeatureLayer required a REST endpoint or Map/FeatureService as it's source. 

0 Kudos