ThinkGeo.com    |     Documentation    |     Premium Support

Click Event Of Markers

Hi, following the samples in the downloaded code I wrote some code that lets users add markers.Users can delete the markers by clicking on them. But the code is not working. Click event handler is never entered... The code is shown below...


 private void UserControl1_Load(object sender, EventArgs e)

        {

            winformsMap1.MapClick += new EventHandler<MapClickWinformsMapEventArgs>(winformsMap1_MapClick);

            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;

            winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);



            WorldMapKitWmsDesktopOverlay worldMapKitOverlay = new WorldMapKitWmsDesktopOverlay();

            winformsMap1.Overlays.Add(worldMapKitOverlay);



            SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();

            markerOverlay.MapControl = winformsMap1;

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



            winformsMap1.Refresh();

        }



        private void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)

        {

            SimpleMarkerOverlay markerOverlay = (SimpleMarkerOverlay)winformsMap1.Overlays["MarkerOverlay"];



            Marker marker = new Marker(e.WorldLocation);

            marker.Image = Properties.Resources.AQUA;

            marker.Width = 20;

            marker.Height = 34;

            marker.XOffset = -10;

            marker.YOffset = -34;

            marker.Click += new EventHandler(marker_Click);

            markerOverlay.Markers.Add(marker);

            winformsMap1.Refresh();

        }



        void marker_Click(object sender, EventArgs e)

        {

            SimpleMarkerOverlay markerOverlay = (SimpleMarkerOverlay)winformsMap1.Overlays["MarkerOverlay"];



            markerOverlay.Markers.Remove(sender as Marker);

            

        }


 



Tarkan,


Thanks for your post,


Actually, the marker_Click event is inherited from Control class of .NET framework, there is a workaround for your requirement, here is the solution for you below:


 



  private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);

            WorldMapKitWmsDesktopOverlay worldMapKitOverlay = new WorldMapKitWmsDesktopOverlay();
            winformsMap1.Overlays.Add(worldMapKitOverlay);
            InMemoryFeatureLayer inmemoryFeatureLayer = new InMemoryFeatureLayer();
            inmemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(new GeoImage(yourMarkerImageFilePath)); 
            inmemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay markerOverlay = new LayerOverlay();
            markerOverlay.Layers.Add(inmemoryFeatureLayer);
            winformsMap1.Overlays.Add("MarkerOverlay", markerOverlay);
            winformsMap1.Refresh();
        }

        private void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            LayerOverlay markerOverlay = (LayerOverlay)winformsMap1.Overlays["MarkerOverlay"];
            InMemoryFeatureLayer inmemoryFeatureLayer = markerOverlay.Layers[0] as InMemoryFeatureLayer;

            MultipolygonShape buffer = e.WorldLocation.Buffer(350, GeographyUnit.DecimalDegree, DistanceUnit.Kilometer);

            Collection<Feature> deleteMarkers = inmemoryFeatureLayer.QueryTools.GetFeaturesWithin(buffer, ReturningColumnsType.NoColumns);
            if (deleteMarkers.Count > 0)
            {
                inmemoryFeatureLayer.InternalFeatures.Remove(deleteMarkers[0]);
            }
            else
            {
                inmemoryFeatureLayer.InternalFeatures.Add(new Feature(e.WorldLocation));
            }

            winformsMap1.Refresh();
        }

I have tested it, it worked fine for meeting your requirements,


Thanks,


Scott,



Do you have sample code on how to customize the marker for each PointShape in the Layer? 
  
 Thanx, 
 Rob

Robert,


I made a simple sample for you to add different customized markers to the map control based on different Lat/Lon locations.
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Post8715Sample.zip (16.1 KB)

Hey Yale, I think you missed the point. I am currently using the SimpleMarkerOverlay, but I need to handle the click event of the markers. ... OR have the marker (or simpleMarkerLayer) pass the click event to the shapes underneath.  That would work for my needs as well.



Robert, 
  
 I reviewed the attached sample code what the Yale provided, in the sample he added different customize markers to the map control and used the SimpleMarkerOverlay to add them. For your requirements, can you tell us the detail information on how to customize the marker? Currently, I just understand you want to add the click event to each marker, but I don’t know what’s requirements for each marker in the click event, also the marker’s click event is easy to bind as below: 
  
 marker1.Click +=new EventHandler(marker1_Click); 
  
 So you can add your own code in the click event, if you have any special requirements please let us know we will help you on that, 
  
 Thanks, 
  
 Scott,

Scott,  
  
 As Tarkan pointed out in his initial post, the click event is never entered. 
  
 When I create the markers I am adding the handler like this: 
 
AddHandler tempMarker.Click, AddressOf Marker_Click
 
 and here is my Event Handler: 
 
Private Sub Marker_Click(sender As Object, e As EventArgs)
Dim tempMarker As Marker
Dim apn As String
If TypeOf sender Is Marker = True Then
tempMarker = CType(sender, Marker)
apn = tempMarker.Tag.ToString
PerformSearch(apn, "")
End If
End Sub
 


PS.  The primary reason I need this is certain shapes have markers to indicate certain information, but they need to be able to click on the shape to get at more information.  Problem is the marker is in front of the shape and doesn’t seem to respond to anything.  I need to be able to handle the marker click event, or the marker needs to pass the click on to the layers below.  Either method is fine with me.

Robert,


Thanks for your post and feedbacks.
 
I verified that the marker event works as Scott said, it will be fired when we click on the image. I think the issue is that it is somehow difficult to click on the marker to get it fired, as we have to click on the image without exceeding its scope. Following is my test code, you can take a try against it.
 
One possible solution you can consider is trying to customize the event in the map click event with the query against the markers in the SimpleMarkerOverlay, which is very similar with query against feature layer. In this way, we can customize the way to detect the marker event by finding the nearest marker point.
 

private void Form1_Load(object sender, EventArgs e)
{
    winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
    winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);
 
    WorldMapKitWmsDesktopOverlay worldMapKitOverlay = new WorldMapKitWmsDesktopOverlay();
    winformsMap1.Overlays.Add(worldMapKitOverlay);
 
    SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();
    markerOverlay.MapControl = winformsMap1;
 
    Marker marker1 = new Marker(-113.547125, 36.0296875);
    marker1.Image = new Bitmap(@"..\..\data\n.png");
    marker1.Width = 20;
    marker1.Height = 34;
    marker1.YOffset = -17;
    marker1.Click += new EventHandler(marker_Click);
    markerOverlay.Markers.Add(marker1);
 
 
    Marker marker2 = new Marker(6.68725000000001, -16.0015625);
    marker2.Image = new Bitmap(@"..\..\data\s.png");
    marker2.Width = 20;
    marker2.Height = 34;
    marker2.YOffset = -17;
    marker2.Click += new EventHandler(marker_Click);
     markerOverlay.Markers.Add(marker2);
 
     Marker marker3 = new Marker(-102.297125, -59.5953125);
     marker3.Image = new Bitmap(@"..\..\data\nw.png");
     marker3.Width = 20;
     marker3.Height = 34;
     marker3.YOffset = -17;
     marker3.Click += new EventHandler(marker_Click);
     markerOverlay.Markers.Add(marker3);
 
     winformsMap1.Overlays.Add("MarkerOverlay", markerOverlay);
 
     winformsMap1.Refresh();
 }
 
 void marker_Click(object sender, EventArgs e)
 {
     System.Diagnostics.Debug.WriteLine("marker_Click");
 }

 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hello, 
  
 I try to use the click event but doesn’t work!!! 
  
 help needed. 
  
 Thanks

Hello, 
  
 I try to use the click event but doesn’t work!!! 
  
 help needed. 
  
 Thanks

Hi Jean-marie, 
  
 Could you please post your code or upload your sample ? That will help us find out what’s the problem quickly. 
  
 Any more questions please feel free to let me know. 
  
 Thanks, 
  
 Gary

here is the code (the same as above!) 
  
       private void Form1_Load(object sender, EventArgs e) 
         { 
             winformsMap1.MapUnit = GeographyUnit.DecimalDegree; 
             winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9); 
  
             WorldMapKitWmsDesktopOverlay worldMapKitOverlay = new WorldMapKitWmsDesktopOverlay(); 
             winformsMap1.Overlays.Add(worldMapKitOverlay); 
  
             SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay(); 
             markerOverlay.MapControl = winformsMap1; 
  
             Marker marker1 = new Marker(-113.547125, 36.0296875); 
             marker1.Image = new Bitmap(Properties.Resources._CT); 
             marker1.Width = 20; 
             marker1.Height = 34; 
             marker1.YOffset = -17; 
             marker1.Click += new EventHandler(marker_Click); 
             markerOverlay.Markers.Add(marker1); 
  
  
             Marker marker2 = new Marker(6.68725000000001, -16.0015625); 
             marker2.Image = new Bitmap(Properties.Resources._CT); 
             marker2.Width = 20; 
             marker2.Height = 34; 
             marker2.YOffset = -17; 
             marker2.Click += new EventHandler(marker_Click); 
             markerOverlay.Markers.Add(marker2); 
  
             Marker marker3 = new Marker(-102.297125, -59.5953125); 
             marker3.Image = new Bitmap(Properties.Resources._CT); 
             marker3.Width = 20; 
             marker3.Height = 34; 
             marker3.YOffset = -17; 
             marker3.Click += new EventHandler(marker_Click); 
             markerOverlay.Markers.Add(marker3); 
  
             winformsMap1.Overlays.Add("MarkerOverlay", markerOverlay); 
  
             winformsMap1.Refresh(); 
  
         } 
  
         void marker_Click(object sender, EventArgs e) 
         { 
             System.Diagnostics.Debug.WriteLine("marker_Click"); 
         }

Hi,Jean-marie 



Your code is absolutely right. And what cause you feel it doesn’t work? It’s because the real point of a marker is very small, you need clicked the point exactly right, then the event will be fire. You can try it by click the marker’s bottom many times. 



And because our marker’s event is inherit from Microsoft, so we can’t change it, then we have a workaround to resolve this problem. You can try Scott’s code as below: 


  private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);

            WorldMapKitWmsDesktopOverlay worldMapKitOverlay = new WorldMapKitWmsDesktopOverlay();
            winformsMap1.Overlays.Add(worldMapKitOverlay);
            InMemoryFeatureLayer inmemoryFeatureLayer = new InMemoryFeatureLayer();
            inmemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(new GeoImage(yourMarkerImageFilePath)); 
            inmemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay markerOverlay = new LayerOverlay();
            markerOverlay.Layers.Add(inmemoryFeatureLayer);
            winformsMap1.Overlays.Add("MarkerOverlay", markerOverlay);
            winformsMap1.Refresh();
        }

        private void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            LayerOverlay markerOverlay = (LayerOverlay)winformsMap1.Overlays["MarkerOverlay"];
            InMemoryFeatureLayer inmemoryFeatureLayer = markerOverlay.Layers[0] as InMemoryFeatureLayer;

            MultipolygonShape buffer = e.WorldLocation.Buffer(350, GeographyUnit.DecimalDegree, DistanceUnit.Kilometer);

            Collection<Feature> deleteMarkers = inmemoryFeatureLayer.QueryTools.GetFeaturesWithin(buffer, ReturningColumnsType.NoColumns);
            if (deleteMarkers.Count > 0)
            {
                inmemoryFeatureLayer.InternalFeatures.Remove(deleteMarkers[0]);
            }
            else
            {
                inmemoryFeatureLayer.InternalFeatures.Add(new Feature(e.WorldLocation));
            }

            winformsMap1.Refresh();
        }



Any more questions please feel free to let me know. 



Thanks, 



Gary