ThinkGeo.com    |     Documentation    |     Premium Support

Extending a Line

What I would like is for the user to click on the map to create a starting point on the map and then continue click on points on the map to add vertices to the line. I would like to use the class DragInteractiveOverlay which is a custom class I found in one of the samples, it inherits EditInteractiveOverlay Class.


DragInteractiveOverlay dragInteractiveOverlay = new DragInteractiveOverlay();

LineShape line1 = new LineShape();

Vertex vb = new Vertex(-97.7591, 30.3126);

Vertex vb1 = new Vertex(-97.7591, 30.3);

line1.Vertices.Add(vb);

line1.Vertices.Add(vb1);

line1.Id = "line1";

dragInteractiveOverlay.EditShapesLayer.InternalFeatures.Add(new Feature(line1));


dragInteractiveOverlay.CanAddVertex = false;

dragInteractiveOverlay.CanDrag = true;

dragInteractiveOverlay.CanRemoveVertex = false;

dragInteractiveOverlay.CanResize = false;

dragInteractiveOverlay.CanRotate = false;

dragInteractiveOverlay.CalculateAllControlPoints();


winformsMap1.EditOverlay = dragInteractiveOverlay;


This will create a line on the map with the two points specified, and if I try to extend the line by adding the following code to the mapclick event handler, nothing happens. (note I declared the line in the class so it can be accessed by any method)


Vertex v = new Vertex(e.WorldLocation);

line1.Vertices.Add(v);

dragInteractiveOverlay.EditShapesLayer.Open();

dragInteractiveOverlay.EditShapesLayer.EditTools.BeginTransaction();

dragInteractiveOverlay.EditShapesLayer.EditTools.Update(line1);

dragInteractiveOverlay.EditShapesLayer.EditTools.CommitTransaction();

dragInteractiveOverlay.EditShapesLayer.Close();


This updating worked for gps tracking when I wanted to show the movement of a moving object, if there is a better way to add a line I try something else but I like the way this line works.


 



 



003_002_001_test.zip (370 KB)

Gary, 
  
 Thanks for the sample!  I was able to figure out what was going on, the problem isn’t acutally in the Update instead it’s when the original feature is added to the EditLayer in your form load.   In the code you provided you were adding the feature with the following line of code in the form load. 
  
 dragInteractiveOverlay.EditShapesLayer.InternalFeatures.Add(LineFeature); 
  
 Since this feature was added outside of the EditTools API the EditTools didn’t register the ID and so when the Update was called in your click event the feature wasn’t found and the update failed.   
  
 In order to resolve this instead of using the Add off of the InternalFeatures collection you should use the EditTools API to add your feature like the code below in the form load, this way the Adding and Updating will be done by the same API’s and be consistent. 
  
             dragInteractiveOverlay.EditShapesLayer.Open(); 
  
             dragInteractiveOverlay.EditShapesLayer.EditTools.BeginTransaction(); 
  
             dragInteractiveOverlay.EditShapesLayer.EditTools.Add(LineFeature); 
  
             dragInteractiveOverlay.EditShapesLayer.EditTools.CommitTransaction(); 
  
             dragInteractiveOverlay.EditShapesLayer.Close(); 
  
 As a rule of thumb I would never use the InternalFeatures collection i and always use the EditTools when the features have the possiblity of changing.  The InternalFeatures collection is a quick and dirty way to access the features and hasn’t been fully tested for editing scenarios.   
  
 One other helpfull tidbit of information when using the EditTools is that you can actually check the results of the transaction.  Many people don’t know this but it can be very helpfull in debugging issues when editing featurs.  To see the results of the transaction you just interogate the TransactionResult object returned from the CommitTransaction method.   
  
 TransactionResult tr = dragInteractiveOverlay.EditShapesLayer.EditTools.CommitTransaction(); 
  
 Thanks for reporting the issue and let us know if you have any additional questions. 
  
  
 Thanks!