ThinkGeo.com    |     Documentation    |     Premium Support

Markers duplicated in Full version 5.0 + daily builds

Hello,



In full version 5.0 + last few daily builds I have the following issue which I did not see before.

When I update the display I remove and add the layer with the markers like this:

wpfMap1.Overlays.Remove("MarkerOverlay");

<do it="" want="" actually="" we="" and="" put="" user="" the="" where="" out="" figure="" to="" calculations="" some="">..do some calculations to figure out where the user put the marker, and where we actually want it..

..create new overlay and add marker to it..

<create it="" to="" marker="" add="" and="" overlay="" new="">wpfMap1.Overlays.Add("MarkerOverlay", markerOverlay);



This will probably change to increase performance by moving the markers without removing the whole overlay.



So when I move the marker it is duplicated on what seems like a static overlay because when I pan the map they do not move with the map



On the screenshot, that should be just one marker



Thanks

Thomas

 </create></do>



clones2.png (2.64 KB)

Thomas, 
  
 I would like to ask you what’s the marker overlay you used? InMemoryMarkerOverlay or SimpleMarkerOverlay? According to your code, I think you updated the appearance by removing and adding the marker overlay, not layer. I want to ask you why didn’t you just add or remove the marker feature to instead of the marker overlay? Also you mentioned when you moved the marker it is duplicated, so I think you used the SimpleMarkerOverlay, because the markers can be dragged in the SimpleMarkerOverlay, the markers in the other marker overlay cannot be dragged properly. I tested the SimpleMarkerOverlay for adding, removing, dragging, it worked fine. So maybe I misunderstood anything for your issue, could you provide a sample to us so that we can recreate this issue properly and to see where is the problem exactly? 
  
 Thanks, 
  
 Scott,

Scott,


Right, I used 


SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();


This is a quick prototype so I just remove the whole overlay when I redraw everything on the map.


Did you try this sequence:


Add marker to marker overlay, add marker overlay to map, user drags marker and in response all is redraw which means: remove overlay from map, and repeat from beginning


thanks


Thomas



Scott,



I wrote a simple example, see below.



And run it with eval 4.5 + daily build from around 6/6

And run it with full version with WpfDesktopEditionFull5.0.42.0DllPackage from today



On each version I grab the marker originally in Poland to Russia, then it is supposed return to Poland, then I grab it from Poland and move it to Spain

In 4.5 It disappears from each of those places after each drag and re-appears in Poland



In 5.0 it correctly reappears in Poland but each time one stays in Russia and Spain, basically the marker gets copied.  But when you pan the map those two copies do not move with the map, as if they are on a different overlay



I attached screenshots



Take care



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

using ThinkGeo.MapSuite.Core;

using ThinkGeo.MapSuite.WpfDesktopEdition;



namespace CDMProtoGui

{

    ///


 


 




    /// Interaction logic for Window1.xaml

    /// 

    public partial class Window1 : Window

    {

        public Window1()

        {

            InitializeComponent();

        }



        private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            // Set the Map Unit. The reason for setting it to DecimalDegrees is that is what the shapefile’s unit of measure is inherently in.

            wpfMap1.MapUnit = GeographyUnit.DecimalDegree;



            // We create a new Layer and pass the path to a Shapefile into its constructor. 

            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"C:\Program Files\ThinkGeo\Map Suite Wpf Desktop Evaluation Edition 4.5\Samples\CSharp Samples\SampleData\Data\Countries02.shp");



            // Set the worldLayer with a preset Style, as AreaStyles.Country1 has YellowGreen background and black border, our worldLayer will have the same render style.  

            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;



            // This setting will apply from ZoonLevel01 to ZoomLevel20, that means we can see the world the same style with ZoomLevel01 all the time no matter how far we zoom out/in. 

            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            // Create a new Layer Overlay to hold the layer we just created

            LayerOverlay layerOverlay = new LayerOverlay();



            // Add a background Layer

            layerOverlay.Layers.Add(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)));

            // Add the shapefile layer to the layer overlay

            layerOverlay.Layers.Add(worldLayer);



            // We need to add the layerOverlay to map.

            wpfMap1.Overlays.Add(layerOverlay);



            // Set a proper extent for the Map.  

            wpfMap1.CurrentExtent = new RectangleShape(0, 78, 30, 26);



            // marker

            DoMarker();



            // We now need to call the Refresh() method of the Map control so that the Map can redraw based on the data that has been provided.

            wpfMap1.Refresh();

        }



        void DoMarker()

        {

            SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();

            markerOverlay.DragMode = MarkerDragMode.Drag;

            Marker marker = new Marker(new PointShape(18.6, 53.0333333));

            markerOverlay.Markers.Add("m", marker);

            wpfMap1.Overlays.Add("MarkerOverlay", markerOverlay);

            markerOverlay.MarkerDragged += new EventHandler<markerdraggedsimplemarkeroverlayeventargs>(markerOverlay_MarkerDragged);

        }



        void markerOverlay_MarkerDragged(object sender, MarkerDraggedSimpleMarkerOverlayEventArgs e)

        {

            SimpleMarkerOverlay sm = (SimpleMarkerOverlay)wpfMap1.Overlays["MarkerOverlay"];

            sm.Markers.Remove("m");

            sm.Markers.Clear();

            wpfMap1.Overlays.Remove("MarkerOverlay");

            DoMarker();

            wpfMap1.Refresh();

        }



        private void Window_Loaded()

        {



        }

    }



}

  </markerdraggedsimplemarkeroverlayeventargs>


4.5 after dragging twice to Russia and Spain


<markerdraggedsimplemarkeroverlayeventargs>

 


5.0 after dragging twice to Russia and Spain



</markerdraggedsimplemarkeroverlayeventargs>


 


 



 Thomas,


 
I reviewed your code I think your requirement is that you don't want to copy the marker when dragging it, so on the map you just want to keep one marker and drag it anywhere. Is that true? I think this is what you want according to your code and the screen shot for 4.5 version.
 
If that you just remove the following code from DoMarker() method:
 
markerOverlay.MarkerDragged += new EventHandler<MarkerDraggedSimpleMarkerOverlayEventArgs>(markerOverlay_MarkerDragged);
 
So it will not copy any new markers when dragging it, if I misunderstood it please correct me and explain it again,
 
Thanks,
 
Scott,

Scott,


Thanks for the response.  


I need that callback because in the real code (this is just a small sample), I figure out where the user dropped the marker and relocate it a little bit because there are constraints to where the marker is allowed to be.  


So a quick and dirty initial code tries to erase the whole marker layer and recreate it with the marker in proper location.  


That approach works fine in 4.5 but not in 5.0


thanks


Thomas


 


 



Thomas, 
  
 I used the 4.5.0.0 version to try your code and found out the behavior is not the same as the 5.0 version, also I believe that is a bug in the 5.0 version, so I have posted it to our development team, please wait for a moment if there are any updates I will let you know, 
  
 Thanks, 
  
 Scott,

Thanks Scott.

Thomas, 
  
 You are welcome,  
  
 Thanks, 
  
 Scott,

Thomas, 
  
 This bug had been fixed, please get the latest daily build (5.0.46.0 or later) to have another try.   
   
 Also I recommend please use the workaround instead of adding/removing markeroverlay frequently which hurts the performance. But it is considered by you. That’s just a suggestion for you. 
  
 Thanks, 
  
 Scott,

Scott,


Thanks!  I will try it.  Yes, you are correct, this is a prototype and once some of the other features are coded, the code will be improved for performance.  


take care


Thomas



Scott,


I tried WpfDesktopEditionFull5.0.48.0DllPackage.zip     6.35 MB     6/30/2011 


And it does the same thing, i.e. does not seem to be fixed


thanks


Thomas



Thomas, 
  
 Sorry for the inconvenience, I reopened this issue for our development team again, they will verify it as soon as possible, if there are any updates I will let you know, 
  
 Thanks, 
  
 Scott,

Hi Scott,


Any news on this? I tried the one from 7/1 and it does the same thing


thanks


Thomas



 Thomas,


I have modified a litte bit of your sample code, please look at attached file. My change is that add a parameter PointShape to DoWork method. It keeps your requirement that you can relocate the marker in event handler.


I tested the 5.0.48 dlls by updated sample code, it works properly. 


Thanks,


James



DisplayASimpleMap.xaml.zip (3.43 KB)

James,


Sorry it appears it has been fixed, but I missed it somehow


The new DLLs work now with my original code


Sorry to waste your time


take care


Thomas



Thomas, 
  
 It doesn’t matter, I am glad you confirmed the issue is fixed. 
  
 Any more questions please let me know. 
  
 Thanks, 
 James