ThinkGeo.com    |     Documentation    |     Premium Support

Feature not being updated

    I have a FeatureLayer with PointShapes, and they are drawn in the right location the first time, but when I try to update it's position it does not change. This is the code I use to update it:







 <style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #1e39f6}
span.s1 {color: #1e39f6}
span.s2 {color: #000000}
</style>

      Dim IconPoint As PointShape = InMemoryTrackIconsFeatureLayer.InternalFeatures(TargetID.ToString).GetShape()


      IconPoint.X = Longitude


      IconPoint.Y = Latitude


 


      SyncLock InMemoryTrackIconsFeatureLayer


        InMemoryTrackIconsFeatureLayer.Open()


        InMemoryTrackIconsFeatureLayer.EditTools.BeginTransaction()


        InMemoryTrackIconsFeatureLayer.EditTools.Update(InMemoryTrackIconsFeatureLayer.InternalFeatures(TargetID.ToString))


        InMemoryTrackIconsFeatureLayer.EditTools.CommitTransaction()


        InMemoryTrackIconsFeatureLayer.Close()


      End SyncLock


 



    What am I missing?




 Carlos, not refreshing overlay perhaps?  After feature collection of a layer changes, you have to call Overlay.Refresh() on layer's parent overlay.  


K



Of course!!! I know… but even adding a breakpoint in the "InMemoryTrackIconsFeatureLayer.Close()" of the above code the "InMemoryTrackIconsFeatureLayer.InternalFeatures(TargetID.ToString).GetShape()" still have the old point :(

Carlos, I think you have a reference issue here.  I doubt Feature.GetShape() always returns the same reference.  To confirm this, call  
  
  Dim IconPoint As PointShape1 = InMemoryTrackIconsFeatureLayer.InternalFeatures(TargetID.ToString).GetShape() 
  Dim IconPoint As PointShape2 = InMemoryTrackIconsFeatureLayer.InternalFeatures(TargetID.ToString).GetShape() 
  
 and then compare the hash code (Object.GetHashCode() ) of both PointShape1 and PointShape2.  They are probably different.  I doubt feature keeps a reference to its geometry and instead stores it using some optimized, probably binary format.    If so, you may have to replace feature TargetID with a new one using your modified shape.  Do not forget to copy all column values.

Hi Klaus, 
  
  You are right, both hashcodes are differents (I never used the Object.GetHashCode() what is it for?). And indeed the only workarround I found is to remove the feature and add a new one with a new PointShape as you suggest, but is strange, because the .EditTools.Update function uses the ID of the Feature or BaseShape passed, not the object itself. In fact I originally was doing InMemoryTrackIconsFeatureLayer.EditTools.Update(IconPoint) as it’s the same thing its working in the HowDoI for moving a plane, or in other Overlay I have for refreshing the vessel gps position. But with this overlay it doesn’t work, and I don’t know why, because is the exact same code as in the other. 
  


Carlos, Object.GetHashCode() is a quick and dirty way to determine if you are looking at the same instance of an object.  You can also use Object.Equals.  Check out this MSDn article:  



msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx 



EditTools.Update probably creates a new feature behind the scenes as well because Feature may not be keeping a reference to a BaseShape.  If it was, calling Feature.GetShape() should always return the same object instance.   



I am doing something similar when users edit geometries.   I think this is as designed.



Hi Klaus, 
  
  Thanks for the GetHashCode() tip. Your explanation sounds reasonable (and also work, of course), so I will rename it from “temporal workarround” to “final implementation”, BUT still confused because it do work that way in the HowDoI sample of “Dinamic Shapes>Efficiently move a plane image”. Anyway It’s working now… my deadline for first release counts in days now…  
  
 Carlos.

Carlos&Klaus, 
  
 Your conversation is  great that can help other users know many knowledge of MapSuite. I am also glad Klaus’s solution is working with Carlos’s requirement. 
  
 Let us know if you have more ideas. 
  
 Thanks, 
 James

Hi, 
  
  Just as follow up… I realized that if the feature is created without specifying an ID as: 
  
  Dim newFeature As New Feature(New PointShape(Longitude, Latitude)) 
  
  and then added to the FeatureLayer, It is not updated with FeatureLayer.EditTools.Update, but if an ID is specified such in: 
  
  Dim newFeature As New Feature(New PointShape(Longitude, Latitude).GetWellKnownBinary, BuoyID.ToString) 
  
  It just works, so you can update it’s position as in HowDoI sample “Dinamic Shapes>Efficiently move a plane image”

Carlos, 
  
 Yes, you’re right. We will consider to provide more documentation for some specific operations. 
  
 Feel free to let me know if you have more questions. 
  
 Thanks, 
 James