ThinkGeo.com    |     Documentation    |     Premium Support

Some questions on TrackInteractiveOverlay

    The attached sample allows you to draw a line by using TrackInteractiveOverlay. Then, after the line have been created it is possible to start editing it by clicking on it.


  To doing so I find the Feature on the mouse position with:


wpfMap1.TrackOverlay.TrackShapeLayer.FeatureSource.GetFeaturesNearestTo(WorldPos, GeographyUnit.Meter, 5, columnNames, distanceBuffer, DistanceUnit.Meter)


 This returns the Feature under the mouse position properly, but then in this lines:


 


            wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(SelectingFeatures(k).Feature)


            wpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Remove(SelectingFeatures(k).Feature)


The first (adding to EditOverlay) works (i.e. the selected Feature is properly added to EditOverlay), but the second does not (i.e TrackShapeLayer.InternalFeatures.Remove does not seem to recognize the Feature returned by GetFeature and hence the feature is not removed)


 I also tried using a transactions and FeatureSource as follows:


 


            wpfMap1.EditOverlay.EditShapesLayer.FeatureSource.Open()


            wpfMap1.EditOverlay.EditShapesLayer.FeatureSource.BeginTransaction()


            wpfMap1.EditOverlay.EditShapesLayer.FeatureSource.AddFeature(SelectingFeatures(k).Feature)


            wpfMap1.EditOverlay.EditShapesLayer.FeatureSource.CommitTransaction()


            wpfMap1.TrackOverlay.TrackShapeLayer.FeatureSource.Open()


            wpfMap1.TrackOverlay.TrackShapeLayer.FeatureSource.BeginTransaction()


            wpfMap1.TrackOverlay.TrackShapeLayer.FeatureSource.DeleteFeature(SelectingFeatures(k).Feature.Id)


            wpfMap1.TrackOverlay.TrackShapeLayer.FeatureSource.CommitTransaction()


 


With same results


 


 In order to workarround the issue I ended up with:


 


 


    For Each TrackOverlayFeature In WpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures


      If TrackOverlayFeature.GetWellKnownText = Feature.GetWellKnownText Then


        WpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Remove(TrackOverlayFeature)


        Exit For


      End If


    Next


 


 But I don't think is the best approach.


 


 What I am missing?


 


 As additional questions on TrackOverlay, Is it needed to BuildIndex and so on after adding and deleting features to the TrackShapeLayer / EditShapeLayers? It seems is not, but don't know why either


 


I'm using dlls version 6.0.200.0



TrackAndEditInteractive.zip (84.8 KB)

In addition to the above questions, I am wondering how bad it would be if I leave the InteractiveClickInterval = 1 to ensure that the first click on map after line drawing tool was selected actually starts the line drawing instead of a pan operation 
  
  Thanks in advance, 
  
 Carlos

Hi Carlos, 
  
 Here is the code for your first question. 
  
 wpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Remove(SelectingFeatures(k).Feature.Id) 
  
 For your second question, as far as I know, drawing always starts before panning. you can set it to a big number to have a try.  
  
 Regards, 
  
 Edgar 


Dear Edgar, 
  
  It doesn’t work with the id either. If fact both overloads should have worked the same as the one I were using receive the feature itself returned by GetFeaturesNearestTo 
  
 Is it needed to BuildIndex and so on after adding and deleting features to the TrackShapeLayer / EditShapeLayers internal features? 
  
 Carlos

Carlos,
 
Sorry we just thought it was correct when the feature was removed, after digging into this, we found that you made it editable when first click on it and not editable the next click, so there is one more line should be changed: wpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Add(feature.id,feature), this time it will work as expected.
 
Regards,
Edgar

 



Ok, but what is the purpose of .Remove(Feature) then? It won’t work in any case! and also why the .Add(Feature) does not take the feature ID automatically?

Here is the scenario Remove(Feature) work, 



            InMemoryFeatureLayer a = new InMemoryFeatureLayer();
            Feature feature = new Feature();
            a.InternalFeatures.Add(feature);
            a.InternalFeatures.Remove(feature);

The reason that it didn't work with your scenario is that the method GetFeatureNearestTo and all the other query method, they will return the copy of the original features, so the queryed features' references are different from the original ones.


For your second question, because the type of InternalFeatures are GeoCollection(T), not all the "T"s have Id peoperty right?


Regards,


Edgar



Cristal clear now. Thanks a lot Edgar. 
  
  Regards, 
  
 Carlos

You’re welcome :).