ThinkGeo.com    |     Documentation    |     Premium Support

Shapefile File Feature Update

I would like to know what the best way to alter a shapefiles feature is.



I've got my shapefile sitting on in a DynamicOverlay, I then have a DropDown list that lists all my editable shape files. when I select the layer in the dropdown list, it pushed the features of the layer to a HighlightOverlay.



I then have an edit button, that pushes the features onto the EditOverlay (I've noted that the features in the EditOverlay seem to lose all column data.) I can then edit the features however I want.



Once editing is complete, I then loop through all the EditOverlays features an either add them, or update them on the DynamicLayer. However, I have to do this by finding the dynamic layers feature by ID, then setting it to the editoverlayers feature, recreate the data that was originally there (as it gets cleared when setting it to the editoverlays feature) then updateing the dynamicoverlay.



The problem is this seems to be a very complicated was of performing what should be a simple task (I'm talking about the recreating of the data in the data columns) and on top of which, when I tell my DynamicOverlay to redraw at the end of the method, it seems to "Hide" my shapefile. I say "Hide" because my shapefile dissapears off the map. However if I stop the Web Site and restart it, my shapefile is there with all the features in the new places.



So once again my question is, what is the easiest way to update a feature (so the data is still there) and refresh the map to reflect the changes?



Please see my save method below:



ShapeFileFeatureLayer currentLayer = (ShapeFileFeatureLayer)mapMain.DynamicOverlay.Layers[cboEditLayer.SelectedItem.Text];

 currentLayer.Open();

 currentLayer.EditTools.BeginTransaction();

 foreach (Feature feature in mapMain.EditOverlay.Features)

 {

 if (currentLayer.FeatureSource.GetFeatureById(feature.Id, ReturningColumnsType.AllColumns) == null) 

 {

 currentLayer.FeatureSource.AddFeature(feature);

 }

 else

 {  

 Feature f = currentLayer.FeatureSource.GetFeatureById(feature.Id, ReturningColumnsType.AllColumns);

 Dictionary



Hi Jeremy,






If you want to keep the column values from the shape file, you need to add the column set in EditOverlay by the following script.


Map1.EditOverlay.Columns.Add(new FeatureSourceColumn("A"));

I can’t find the reason why the shapes are missing after a PostBack without your logic, so please see the attached sample for detail, it works fine.




If you have any questions please let me know.


Thanks,


Howard



670-Post5723.zip (5.73 KB)

Thanks for the postes attachment, I'll run through it and see if there isn't something I've done wrong. 


I see in your attachment that you have the shapefile sitting in a static layer. I was under the impression from a post I read yesterday, that its recommended to have the shapefile that will be edited sitting in the dynamic layer.



Strange I've adjusted my code to use the logic in your example, yet I'm haveing the same problem. I've excluded my AddLayers() method as is just shows my adding the layer to the dynamic overlay, and a lot of other irrelevant code. Please see my code below:



        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                mapMain.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 0, 50, 0));
                mapMain.CurrentExtent = new RectangleShape(-195.7852, 91.2020, 0.2821, -30.6353);
                mapMain.MapUnit = GeographyUnit.DecimalDegree;

                mapMain.MapTools.OverlaySwitcher.Enabled = true;
                mapMain.MapTools.MouseCoordinate.Enabled = true;
                mapMain.MapTools.OverlaySwitcher.BackgroundColor = new GeoColor(200, 180, 200, 180);

                AddLayers();
            }
        }


        protected void cboEditLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (int.Parse(cboEditLayer.SelectedValue) != -1)
            {
                ShapeFileFeatureLayer currentLayer = (ShapeFileFeatureLayer)mapMain.DynamicOverlay.Layers[cboEditLayer.SelectedItem.Text];
                currentLayer.Open();
                Collection<Feature> features = currentLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
                Collection<FeatureSourceColumn> featureColumns = currentLayer.QueryTools.GetColumns();
                currentLayer.Close();

                mapMain.EditOverlay.FeatureSource.Open();
                mapMain.EditOverlay.Features.Clear();
                mapMain.EditOverlay.Columns.Clear();

                //Add in the currentLayers data columns to the edit overlay here
                if (featureColumns.Count() > 0)
                {
                    foreach (FeatureSourceColumn fColumn in featureColumns)
                    {
                        mapMain.EditOverlay.Columns.Add(fColumn);
                    }
                }               

                //Add the currentLayer features to the edit overlay here
                foreach (Feature feature in features)
                {
                    mapMain.EditOverlay.Features.Add(feature);
                }

                mapMain.EditOverlay.FeatureSource.Close();

                //currentLayer.IsVisible = false;
                mapMain.DynamicOverlay.Redraw();
                mapMain.EditOverlay.TrackMode = TrackMode.Edit;
            }
           
        }


        protected void layereditSave_Click(object sender, ImageClickEventArgs e)
        {
            if (int.Parse(cboEditLayer.SelectedValue) != -1)
            {
                ShapeFileFeatureLayer currentLayer = (ShapeFileFeatureLayer)mapMain.DynamicOverlay.Layers[cboEditLayer.SelectedItem.Text];

                foreach (Feature feature in mapMain.EditOverlay.Features)
                {
                    currentLayer.Open();
                    Feature selectedFeature = currentLayer.FeatureSource.GetFeatureById(feature.Id, ReturningColumnsType.AllColumns);

                    currentLayer.EditTools.BeginTransaction();

                    if (selectedFeature == null)
                        currentLayer.EditTools.Add(feature);
                    else
                        currentLayer.EditTools.Update(feature);

                    currentLayer.EditTools.CommitTransaction();
                    currentLayer.Close();
                }

                mapMain.EditOverlay.Features.Clear();
                //currentLayer.IsVisible = true;                
                mapMain.DynamicOverlay.Redraw();
               
                cboEditLayer.SelectedIndex = 0;
            }
        }


Its so strange. I've even tried switching the visibility of my layer on and off and it still does the some thing.



Ok, If I try this code on my Rivers Shape file, it works perfectly. Yet my points shape file disappears??? Is this a known issue, is it prehaps my shape file, or is it prehaps the combination of a altering a points shape file that has a label or some other formatting on it??? 
  
 If someone can tell me it would be appreciated, in the mean time I’m going to see if I can’t find out myself.

Hi Jeremy, 


I can’t find the problem with the attached code. I changed my StaticOverlay to DynamicOverlay, it works fine; also, I tested with label but can’t find anything wrong.   


Could you provide us your sample? It’ll be helpful to figure out the issue. If it’s available, please send your sample to support@thinkgeo.com and ask them to forward to Howard.  


Any questions please let me know. 


Thanks,  


Howard



OK, I think it may have had something to do with my Points Shape file. I've changed shapefiles and now it seems to work. 


 



Jeremy, 
  
 Great, if you have more queries please let me know. 
  
 Thanks, 
  
 Howard 


Thanks Howard. For now it seems like its working.

Jeremy,  
  
 You are welcome; please feel free to ask us if you have more queries. 
  
 Thanks, 
  
 Howard