ThinkGeo.com    |     Documentation    |     Premium Support

Determining actual number of features drawn

Hello,


In our application the user can click on the map and get attribute info of the closest feature to the click point.  However, depending on the zoom level some of the layers will not have any features drawn and the lookup for closest feature should not consider these layers.  Is there a way to determine how many features were actually drawn?  I tried using the DrawingFeatures event of the layer but it seems to give me a collection of features even when the resulting map shows no features drawn for that layer.  Is there a more appropriate way to determine that no features were drawn from a layer? 


Thanks,


Allen



Hi Allen,
 
Event “DrawingFeatures” is raised when features are about to be drawn in the layer. In the event arguments, there is a collection of features to be drawn. So I think it’s suitable for your scenario, I have tested it with the following code, it works.
private void LoadAnShapeFileFeatureLayer_Load(object sender, EventArgs e)
{
    winformsMap1.MapUnit = GeographyUnit.DecimalDegree;

    winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

    WorldMapKitWmsDesktopOverlay worldMapKitDesktopOverlay = new WorldMapKitWmsDesktopOverlay();
    winformsMap1.Overlays.Add(worldMapKitDesktopOverlay);

    ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"…\SampleData\Data\Countries02.shp");
    worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
    worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));
    worldLayer.DrawingFeatures += new EventHandler<DrawingFeaturesEventArgs>(worldLayer_DrawingFeatures);

    LayerOverlay staticOverlay = new LayerOverlay();
    staticOverlay.Layers.Add(“WorldLayer”, worldLayer); 
    winformsMap1.Overlays.Add(staticOverlay);

    winformsMap1.CurrentExtent = new RectangleShape(-10, -5, -5, -10);
    winformsMap1.Refresh();
}

private void worldLayer_DrawingFeatures(object sender, DrawingFeaturesEventArgs e)
{
    int i = e.FeaturesToDraw.Count;
}

 
Please let us know if you have further questions.
 
Regards,
 
Ivan

Hello Ivan, 
  
 I currently do use this event for other purposes.  As I said in the first posting, I may be wrong on this, so I’ll go back and test again, but I THOUGHT the collection of features had items in it even when nothing was rendered on the map.  This was in an application with a lot of layers, so I will go back and try this with a simple map with just one layer; I might have been looking at that collection for a different layer.  I’ll report back when I check this again. 
  
 Thanks! 
 Allen

Allen, 
  
 In my experience, I’ve found that Ivan is correct.  The e.FeaturesToDraw property in the DrawingFeatures event will only contain features that are in the Map’s CurrentExtent.  If I zoom to an extent without any features, the e.FeaturesToDraw.Count is 0. 
  
 Let us know if you have any problems or if you see different behavior in your tests. 
  
 Thanks, 
  
 Phil

OK Phil…looks like I’m being outnumbered here, so I probably am wrong.  I will doublecheck this and confess if I am wrong.  It’s happened before! 
  
 Allen

Thanks Allen.  Let us know if you have any other questions. 
  
 Phil

OK, I did a test on a single layer.  If there are no features to draw, the layer_DrawingFeatures event does not fire. 
  
 I loaded a layer of municipal boundaries with the style applied from zoom levels 8 through 20.  With this setting the features display at the full extent of the data and DrawingFeatures reports 275 features.  If I zoom out the event is fired and, of course, there are still 275 features reported.  If I zoom out once more (and presumably go beyond zoom level 8) the map shows no features and the event doesn’t fire. 
  
 So I think this is what I’m going to try: after the OverlaysDrawn event is fired, clear out a list of all the layers that were drawn.  When the DrawingFeature event fires, add the layer name to the list.  Then when I need to check if a layer is being drawn, I can look to that list to see if the layer is present.  Unless someone has a better idea… 
  
 Allen

Allen, 
  
 I think your solution above is the best way to handle it.   
  
 An alternative would be to use spatial queries to count the features in the current extent for each layer, but this would return results even if the features were not drawn (levels 1-7).   
  
 Thanks, 
 Phil

Hi Phil, 
  
 In a simple test program it worked, but when I applied it to our real product it didn’t because user interactions with other overlays (the EditOverlay most likely in this case) caused OverlaysDrawn to be fired and this list to be cleared when I didn’t want it to.  (I thought about using the count of overlays drawn provided by that event or to only look for a certain overlay containing base data to be drawn, but that sounded like it would easily break if we added or removed overlays.)  So for the moment I’ve tied the clearing of the list of drawn layers to the map’s ExtentChanged event which I know only fires when the map has actually changed enough to turn a layer on or off…on second thought ScaleChanged would be more appropriate because the styling levels might kick in when zooming in or out.  The loading of the list is still done by DrawingFeatures.  I did a little testing and it appears to be working. 
  
 Allen

Allen,


In my opinion, CurrentExtentChanged event is more appropriate than CurrentScaleChanged. For example, when you pan the map to a extent without any drawn features, the scale is not changed. Please let us know if you have further questions.


Regards,


Ivan