Select to view content in your preferred language

Can Graphics Layers be Queried?

3617
8
Jump to solution
05-03-2017 07:22 AM
ChristopherSchreiber
Frequent Contributor

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
Frequent Contributor

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

8 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
Frequent Contributor

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
Frequent Contributor

Thank you all for the feedback!

0 Kudos
RyanSutcliffe
Frequent Contributor

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
Frequent Contributor

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
Sparkles
Emerging Contributor

Hi @RyanSutcliffe , did you manage to get this to work for querying a GraphicsLayer? Would you be open to sharing a code snippet? Thank you very much!

0 Kudos
Sparkles
Emerging Contributor

Hi @RyanSutcliffe , did you manage to get this to work for querying a GraphicsLayer? Would you be open to sharing a code snippet? Thank you very much!

0 Kudos
RyanSutcliffe
Frequent Contributor

Its been a few years, if I recall the above OP's code worked, the trick was to make your graphicsLayer the source of a FeatureLayer and then you should be good to go. Sorry no codepen kicking around.

0 Kudos