ThinkGeo.com    |     Documentation    |     Premium Support

InternalFeatures.Remove/featuresource.deletefeature

I am trying to remove a feature from an InMemoryFeatureLayer. I first saw the internalfeatures.remove method and tried this, although it says this is obsolote and you will need to call the buildindex method later. I have tried deleting by passing the actual feature itself and by using the id. Neither seem to do anything and the feature is not deleted.

 


 I have also tried using the featuresource.deletefeature method. I get the same results. I am beginning and closing a transaction whne I do this way



 


 


cbLayer.QueryTools.GetFeaturesContaining(


 


cbLayer.FeatureSource.Open()Dim editFeaturesClicked As Collection(Of Feature) = _ClickedPoint, ReturningColumnsType.AllColumns)If editFeaturesClicked.Count > 0 Then

Map1.EditOverlay.Features.Clear()


Map1.EditOverlay.Features.Add(editFeaturesClicked(0))


cbLayer.InternalFeatures.Remove(editFeaturesClicked(0).Id)


cbLayer.BuildIndex()


cbOverlay.Redraw()


 


 


'TODO: handle multiple shapes clicked

 


 


End If.



David,


We will remove the obsolete warning message in our next public release of all our products. Here  is a workaround for you temporary, please have a try.





                shapeLayer.Open();
                shapeLayer.FeatureSource.BeginTransaction();
                shapeLayer.FeatureSource.DeleteFeature(feature.Id);
                TransactionResult result = shapeLayer.FeatureSource.CommitTransaction();
                shapeLayer.Close();


Thanks,

Khalil



David,

 

I did a test but there is no problem when deleting a feature from InMemoryFeatureLayer. Could you add a breakpoint at the removing line? And see if there are some differences between the contained features and the one you passed? "obsolote " means that we will delete this method in next release, please use the reminded one instead.  Below is the test code:

 



            if (!Page.IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
                Map1.CurrentExtent = new RectangleShape(-51, 121, 149, -13);
                Map1.MapUnit = GeographyUnit.DecimalDegree;

                InMemoryFeatureLayer inMemoryLayer = new InMemoryFeatureLayer();
                Feature feature = new Feature(BaseShape.CreateShapeFromWellKnownData("POLYGON((10 60,40 70,30 85, 10 60))"));
                inMemoryLayer.InternalFeatures.Add("Polygon", feature);
                inMemoryLayer.InternalFeatures.Add("Rectangle", new Feature(new RectangleShape(65, 30, 90, 15)));

                inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.FromArgb(100, GeoColor.StandardColors.RoyalBlue);
                inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Blue;inMemoryLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                Map1.StaticOverlay.Layers.Add(inMemoryLayer);

                inMemoryLayer.InternalFeatures.Remove(feature);
            }


Maybe you can add only one feature that you want to remove into the InMemoryFeatureLayer, then input the id or feature itselfe for removing to check if there is something wrong? Please let us know if it still has no results. 

 

 

Thanks,

 

Johnny



As stated, I have tried the deletefeature method and get the same results. Here are some debug screeenshots of what I am seeing. Notice that the id is the same, but the feature is not deleted. Also, why do I always get the Count = {System.TypeLoadException} when I reference the internalfeatures property? I have also included my code for adding the features to the cblayer. Do you see anything wrong there that would be causing this?


 


 


 


Dim newFeature As Feature = Map1.EditOverlay.Features(0)True

cbOverlay.Redraw()


Map1.EditOverlay.Features.Clear()



 



cbLayer.InternalFeatures.Add(Map1.EditOverlay.Features(0))


cbLayer.IsVisible =



 



David,
 
Thanks for giving so detail debug information. It was caused by the different input key and feature id for cbLayer.InternalFeatures when you add features into collection, InternalFeatures is the type of GeoCollection that requires two parameters – key, feature, but the key is different with feature.id. When we want to remove a feature from the InternalFeatures, the Remove method requires a key instead of feature.id, so the error occurs. Please change the Adding features into cbLayer.Interfeatures statement from 
            
            cbLayer.InternalFeatures.Add(feature);
 
To:     cbLayer.InternalFeatures.Add(feature.id, feature). And then all will work fine.
 
Also please use the BeginTransaction and CommitTransaction when removing the feature.
 
Thanks,
 
Johnny