ThinkGeo.com    |     Documentation    |     Premium Support

InMemoryMarkerOverlay works, but Simple MarkerOverlay does not

 I am calling a a method which returns a marker overlay, everything works with inmemorymarkeroverlay, but does not work with simple marker overlay, I can confirm that the code for a simple marker overlay returns a populated overlay.


 


This code produces a working map:


 



            InMemoryMarkerOverlay HospitalsOverlay = new InMemoryMarkerOverlay("HospitalsOverlay");


 


 


            for (int i = 0; i < dt.Rows.Count; i++)


            {


                HospitalsOverlay.Features.Add(new Feature(Convert.ToDouble(dt.Rows["Long"]), Convert.ToDouble(dt.Rows["Lat"])));


            }


            


            WebImage HospitalSymbol = new WebImage("/images/circle_green.png");


            WebImage ClientSymbol = new WebImage("/images/circle_red.png");


 


            //Marker ClientMarker = new Marker(Convert.ToDouble(dt1.Rows[0]["Long"]), Convert.ToDouble(dt1.Rows[0]["Lat"]), ClientSymbol);


 


            HospitalsOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage = HospitalSymbol;


            HospitalsOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageWidth = 20;


            HospitalsOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageHeight = 20;


            HospitalsOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


 


 


 


            HospitalsOverlay.IsVisible = true;


 


            return HospitalsOverlay;


 


 


 


This code does not:


 



            SimpleMarkerOverlay HospitalsOverlay = new SimpleMarkerOverlay("HospitalsOverlay");


 


            WebImage HospitalSymbol = new WebImage("/images/circle_green.png");


 


            for (int i = 0; i < dt.Rows.Count; i++)


            {


                HospitalsOverlay.Markers.Add(new Marker(Convert.ToDouble(dt.Rows["Long"]), Convert.ToDouble(dt.Rows["Lat"]), HospitalSymbol));


            }


 


            int d = HospitalsOverlay.Markers.Count;


 


            HospitalsOverlay.IsVisible = true;


 


            return HospitalsOverlay;


 




Hi Eric,  
  
 Thanks for your question! You stated that both overlays are populated correctly but ‘everything works’ with InMemoryOverlay. Can you describe the functions that are not working with the SimplerMarkerOverlay?

Nothing shows up on the map when using simple marker overlay, while markers show up on the map if i use inmemorymarker overlay. 
  
 I have verified that features are added to the overlay by checking overlay.markers.count 
  
 Everything else in my program is the same, as this method returns the overlay which is added directly to the map.customoverlays collection. 
  
 Thank you for your assistance, 
  
 Eric 
  


Any idea why this isn’t working??

Eric,


I setup a simple test but could not replicate the issue. Both your SimpleMarkerOverlay and InMemoryMarkerOverlay code look fine. Please try my sample below.




using System;
using System.Configuration;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebEdition;

namespace CSSamples
{
    public partial class UseDraggableMarkers : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
                Map1.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);
                Map1.MapTools.PanZoomBar.Enabled = true;
                Map1.MapTools.MouseCoordinate.Enabled = true;
                Map1.MapUnit = GeographyUnit.Meter;

                GoogleOverlay google = new GoogleOverlay("Google Map");
                google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings["GoogleUriV3"]);
                google.GoogleMapType = GoogleMapType.Normal;
                Map1.CustomOverlays.Add(google);

                SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay("MarkerOverlay");
                markerOverlay.DragMode = MarkerDragMode.Drag;
                markerOverlay.Markers.Add(new Marker(-8922952.93266, 2984101.58384, new WebImage(21, 25, -10.5f, -25f)));
                markerOverlay.Markers.Add(new Marker(-10830821.09801, 4539747.98328, new WebImage(21, 25, -10.5f, -25f)));
                markerOverlay.Markers.Add(new Marker(-12454955.13517, 4980025.26614, new WebImage(21, 25, -10.5f, -25f)));
                markerOverlay.Markers.Add(new Marker(-10772117.52067, 3864656.14956, new WebImage(21, 25, -10.5f, -25f)));
                markerOverlay.Markers.Add(new Marker(-13164290.75755, 4035875.09290, new WebImage(21, 25, -10.5f, -25f)));
                markerOverlay.Markers.Add(new Marker(-9754587.80028, 5156136.17929, new WebImage(21, 25, -10.5f, -25f)));

                //Map1.CustomOverlays.Add(markerOverlay);

                InMemoryMarkerOverlay inmemorymarkerOverlay = new InMemoryMarkerOverlay("InMemoryMarkerOverlay");
                inmemorymarkerOverlay.Features.Add("Feature1",new Feature(-8922952.93266, 2984101.58384));
                inmemorymarkerOverlay.Features.Add("Feature2", new Feature(-10830821.09801, 4539747.98328));
                inmemorymarkerOverlay.Features.Add("Feature3", new Feature(-12454955.13517, 4980025.26614));
                inmemorymarkerOverlay.Features.Add("Feature4", new Feature(-10772117.52067, 3864656.14956));
                inmemorymarkerOverlay.Features.Add("Feature5", new Feature(-13164290.75755, 4035875.09290));
                inmemorymarkerOverlay.Features.Add("Feature6", new Feature(-9754587.80028, 5156136.17929));
                inmemorymarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageWidth = 21;
                inmemorymarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageHeight = 25;
                inmemorymarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageOffsetX = -10.5f;
                inmemorymarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageOffsetY = -25f;
                inmemorymarkerOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                Map1.CustomOverlays.Add(inmemorymarkerOverlay);
            }
        }
    }
}
 
 



will do, 
  
 thanks

Hey, 
  
 I tried to run your example to trouble shoot this, but threw an exception error which is copied below. 
  
  
 System.ArgumentNullException was unhandled by user code 
   Message=Value cannot be null. 
 Parameter name: uriString 
   Source=System 
   ParamName=uriString 
   StackTrace: 
        at System.Uri…ctor(String uriString) 
        at Test2.WebForm1.Page_Load(Object sender, EventArgs e) in C:\Users\eshepard\Documents\Visual Studio 2010\Projects\Test2\Test2\WebForm1.aspx.cs:line 33 
        at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) 
        at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) 
        at System.Web.UI.Control.OnLoad(EventArgs e) 
        at System.Web.UI.Control.LoadRecursive() 
        at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
   InnerException:  


Eric,  



The issue is the URI that the GoogleOverlay needs normally gets polled from a web.config file that is not present. Simply remove the GoogleOverlay from the code or implement the Google URI found in the Map Suite Web Sample Applications to resolve this exception.



I have narrowed down the scope of this issue, but would really like it resolved. 
  
 I am using a callback to remove/replace layers as they are redrawn to reflect changes. 
  
 I think something is happening with the simple marker overlay not redrawing properly. 
  
 If I add a marker when the overlay is first drawn, that marker shows up when I redraw the overlay, just not the other markers added to the overlay. 
  
 Could it be possible that there is a glitch with simple marker overlay and a callback??

I previously used inmemorymarkeroverlay as a workaround.  This may not work now, because I need client side functionality where when a marker is clicked the unique id is accessible, but I want to assign the Id not the randont string of characters automatically assigned.

Hi Eric,  
  
 Thanks for your question but was the initial issue resolved? Were you able to run my sample? We need to be sure your initial question was resolved before adding additional elements. 
  
 I am not sure it is necessary to remove/replace a Overlay simply to have it update. A refresh of the Map or that specific Overlay might be in order, but completly removing/re-adding the Overlay should not be necessary. Can you provide a complete solution that can demonstrate the issue you are encountering?

Hey, 
  
 Your sample did work, I am happy to provide a solution, but it is linked to all sorts of stuff in an SQL database.  The reason I remove and add overlays is because there were problems simply updating some of the overlays previously. 
  
 I have implemented a workaround for now.  When I build the markeroverlays i retrieve the lat long for the markers from an SQL table, at that time I also write the id of the feature to a column in the table, so when a marker is clicked the client side retrievable id can be used to get our custom id out of the table we populated in SQL. 
  
 I will upload some code later after I cleanse it to work outside of our SQL environment. 
  
 Thanks, 
  
 Eric 
  


Eric, 
  
 Just checking if you finish it and expect the code that we can recreate the problem in our site. Or any progress please let me know that we can know the current status. 
  
 Thanks, 
 James

James, 
  
 I am unable to recreate the problem in a simple example. 
  
 This is a big problem for me now.  Our Application now needs to support hundreds of different marker icons, and I don’t want to have hundreds of different overlays. 
  
 There is a trouble ticket I have open regarding this same issue.

Hi Eric,  
  
 Please refer to the Customer Portal Ticket for additional information on this issue.

Hi Ryan, 
  
 In simplemarkeroverlay I created a event for MouseLeftButtonDown as well as MouseLeftButtonUp. 
  
 MouseLeftButtonDown event is called when i click on a marker, but when i release the mouse click it should called MouseLeftButtonUp event. 
 But it doesn’t call…  
  
 markerOverlay = new SimpleMarkerOverlay();

            markerOverlay.MouseLeftButtonDown += new EventHandler<MouseLeftButtonDownMarkerOverlayEventArgs>(markerOverlay_MouseLeftButtonDown);
            markerOverlay.MouseLeftButtonUp += new EventHandler<MouseLeftButtonUpMarkerOverlayEventArgs>(markerOverlay_MouseLeftButtonUp); 
 
  
 check on this asap !!!

Hello Madan, 
  
 I think MouseLeftButtonDownMarkerOverlayEventArgs is not our event, isn’t it? 
  
 Could you please show me more code about this event? 
  
 Regards, 
  
 Gary

Hi Gary,


There is an issue with the map. When i click on a marker for more than 2 secs, mouse click is locked on the map. And wherever i move the mouse the map is panned. This happens even after the mouse click is released. And to stop this i have to click on a screen outside the map then when i do mouse over the map it doesn't happen.


 To avoid this behaviour i included two events for simplemarkeroverlay, on mouseleftbutton down i made the the isenabled property for mousemaptools to false which stops panning, and in the leftbuttonup i have enabled it . Problem is Leftbuttonup function is not called...


I have attached the piece of code for reference..



 
        private void DrawMap(string ButtonColor, string selectedRegion, string selectedSiteCode)
        {
            //Map1.Overlays.Clear();
            
            markerOverlay = new SimpleMarkerOverlay();

            markerOverlay.MouseLeftButtonDown += new EventHandler<MouseLeftButtonDownMarkerOverlayEventArgs>(markerOverlay_MouseLeftButtonDown);
            markerOverlay.MouseLeftButtonUp += new EventHandler<MouseLeftButtonUpMarkerOverlayEventArgs>(markerOverlay_MouseLeftButtonUp);
        }

        void markerOverlay_MouseLeftButtonDown(object sender, MouseLeftButtonDownMarkerOverlayEventArgs e)
        {
            Map1.MapTools.MouseMapTool.IsEnabled = false;
            Marker marker = e.CurrentMarker;
            GeneratePopupContent(marker.Position, ((System.Windows.FrameworkElement)(marker)).DataContext);
            
        }

         void markerOverlay_MouseLeftButtonUp(object sender, MouseLeftButtonUpMarkerOverlayEventArgs e)
        {
           
            Map1.MapTools.MouseMapTool.IsEnabled = true;
        }

        private void GeneratePopupContent(Point Position, object datacontext)
        {
            Map1.Popups.Clear();
            GeoPopup popupMapItemDetails = new GeoPopup(Position);
           StoreLocation objloc = (StoreLocation)datacontext;
           if (objloc.IsSite)
           {
               popupMapItemDetails.Style = (System.Windows.Style)this.Resources["GeoPopupSiteStyle"];
           }
           else
           {
               popupMapItemDetails.Style = (System.Windows.Style)this.Resources["GeoPopupSupplierStyle"];
           }
            popupMapItemDetails.Offset = new Point(-28, -32);
            popupMapItemDetails.DataContext = objloc;


            Map1.Popups.Add(popupMapItemDetails);
        }


Hi Madan, 
  
 We don’t know when you raise the events and how you implement them. Could you please send us a sample? 
  
 Thanks, 
  
 Edgar