ThinkGeo.com    |     Documentation    |     Premium Support

Update Shapefile shape and data

I'm attempting to update both the shape and the non-spatial columns of a Shapefile.  The way I do this is


'tempLayer is assigned to a Shapefile Layer that is open


'tempShape is assigned to a polygonShape I wish to update in the table


tempLayer.EditTools.BeginTransaction


dim tempColumns as String() = {"Name"}


'read in the first feature of the layer into a Feature called tempFeature


dim tempFeature as Feature = tempLayer.FeatureSource.GetFeatureByID("1",tempColumns)


tempFeature.ColumnValues("Name") = "New Name"


'update the shape


tempLayer.EditTools.Update(tempFeature.Id, tempShape)


'update the attributes


tempLayer.EditTools.Update(tempFeature)


tempLayer.EditTools.CommitTransaction()


 


My shape update is lost however.  If I reverse the shape and attribute update statements so that the attribute update comes first, then the attribute update is lost.  So, whichever update I call first appears to be overwritten with the later update and therefore has no effect.  If I place a Call to CommitTransaction and BeginTransaction in between the shape and attribute updates it works just fine.


I have a few questions on this...


1)  Is this the way it's supposed to work?


2)  Is there a better way of updating both the shape and non-spatial columns than what I'm doing above?


3)  When is it appropriate to call CommitTransaction?  If I have 10 records on which I only update attribute information, do I need to call CommitTransaction 10 times or can the update to all 10 records be committed with a single call to CommitTransaction?  How about for 10 shapes?   And for 5 records requiring both shape and attribute updates?



John, 
  
 Thanks for the post, here are the answers. 
  
 1, If you make multi updates to the same record before CommitTransaction(),only the last one is supposed to take effects. 
   
 2, You should create a new feature including both the updated shape and updated non-spatial columns, and send that to the update once. Here as following are the codes. 
  
 Feature newFeature = ([New Shape], [Old Id], [Updated ColumnValues Collection]) 
 Layer.EditTools.Update(newFeature) 
  
 3, Be sure we should call CommitTransaction only at the end of all your edits. For example, if we need to update 10 records, we should call QueryTools.Update 10 times then call CommitTransaction once at the end. I think you’ve seen already from the above code that it’s very easy to update spatial data and non-spatial columns at the same time. So for your question, to update 10 column data or update 10 shapes, the code is the same. 
  
 Ben 


I just downloaded and installed the 3.0.96 build of the beta and now Visual Studio is complaining that the Feature constructors that take an id (such as you just suggested I use above) are obsolete and I should be using a different version of the constructor.  What would be the "new" recommended way of doing what you suggest above?

John,  
  
 In the latest edition (3.0.96), we did some name modification to make sure every API’s name is informative and following a uniform convention. Also to make it backwards compatibility, we keep the old APIs and mark them as obsolete, making it still work and remind developers to change to the new one. That’s the reason compiling the old app with the new dll, you might see many warnings. 
  
 For your case, you should use the constructor “Feature(BaseShape, Dictionary(of String, string))”. Property “Id” is added in BaseShape and we need to set the id there. Following is the code  
 
'……
        Dim newShape = New PolygonShape(“Polygon((-40 0, -40 20, -10 20, -40 0))”)
        newShape.Id = “1” ’ the id of the feature to be updated
        Dim newFeature As New Feature(newShape, newColumnData)
'……
 
 Any queries please let us know. 
  
 Ben