ThinkGeo.com    |     Documentation    |     Premium Support

Get Marker of InMemoryMarkerOverlay

Hello,


I want to display a lot of markers in a map so I decided to use the InMemoryMarkerOverlay.


Via the feature collection of the overlay I added some markers.


The InMemoryMarkerOverlay also has a context menu with one menu item.


If the user clicks on the menu item I want to know the related marker and to execute some javascript code.


Is this possible?


Thanks for your help.


 


Regards,


Marcus



Hello Marcus, 
  
 Thanks for your post, I think you can refer HowDoISamples—>Markers—>Marker with ContextMenu, and Add Projected Markers, in these two sample, you can find how to show some information of marker on shows on it, also how to execute the javascript. 
  
 Regards, 
  
 Gary

Hello Gary,



If the user clicks on a context menu item I execute my own javascript function. How can I find out on which marker the context menu was invoked?

Here a sample of my code:



ContextMenu markerMenu = new ContextMenu();
ContextMenuItem showInfosItem = new ContextMenuItem("Click me!");
markerMenu.MenuItems.Add(showInfosItem);
showInfosItem.InnerHtml = "<div onClick='ShowInfoWindow()'>Click me!";
//showInfosItem.OnClientClick = "ShowInfoWindow";

Sorry the code view doesn't display the value of the InnerHtml correct. It's a DIV with an onClick event which calls the javascript function ShowInfoWindow().


I tried it with a DIV and the OnClientClick event but I don't know how to get the marker.


I added a sample. Hope you unterstand what I mean.



Regards,

Marcus



004_003_002_001_Sample.zip (1.59 KB)

No idea?

Hello Marcus,


Sorry you can't get the Marker Id directly by Context menu, the menu is hooked with InMemoryMarkerOverlay not each markers.


Here I wrote a workaround for you, when the menu click event raise, find the nearest marker where your mouse click, then get that marker's id.


Please check the code below:



ContextMenu menu = new ContextMenu();
                ContextMenuItem item = new ContextMenuItem("Click me!");
                item.Click += new EventHandler<ContextMenuItemClickEventArgs>(item_Click);
                menu.MenuItems.Add(item);


void item_Click(object sender, ContextMenuItemClickEventArgs e)
        {
            InMemoryMarkerOverlay markerOverlay = (InMemoryMarkerOverlay)Map1.CustomOverlays["markers"];
            markerOverlay.FeatureSource.Open();
            Collection<Feature> clickedMarker = markerOverlay.FeatureSource.GetFeaturesWithinDistanceOf(e.Location, GeographyUnit.Meter, DistanceUnit.Kilometer, 10, ReturningColumnsType.AllColumns);
            markerOverlay.FeatureSource.Close();
            if (clickedMarker.Count > 0)
            {
                var id = clickedMarker[0].Id;
            }

        } 

Regards,


Gary



Hi Gary,



thanks for your reply. I tried your code.

Unfortunately, I always got the same ID when several markers are close together.

So I decided to use the following code:



Javascript code

var markerId; // Holds the identifier of the marker

// Add onMouseDown-event to each marker
var OnMapCreating = function (map) {
OpenLayers.Layer.Markers.prototype.addMarker = function (marker) {
var parser = MyMap.GetMapParser();
var markerOverlay = parser.map.getLayer('Marker');

this.markers.push(marker);

if (this.opacity != null) {
marker.setOpacity(this.opacity);
}

if (this.map && this.map.getExtent()) {
marker.map = this.map;
this.drawMarker(marker);
}

marker.events.registerPriority('mousedown', marker, markerClick);
}
}

function markerClick(e) {
if (e.button == 2) {
markerId = this.id;
}
}

function ShowInfoWindow(e) {
HideContextMenus();
// Access to markerId
}


C# Code

ContextMenu markerMenu = new ContextMenu();
ContextMenuItem showInfosItem = new ContextMenuItem("Click me!");
showInfosItem.OnClientClick = "ShowInfoWindow";
markerMenu.MenuItems.Add(showInfosItem);



Hello Marcus, 
  
 Thanks for share your experience and code. I’m glad it’s working now. 
  
 Also for  
  
 Collection<Feature> clickedMarker = markerOverlay.FeatureSource.GetFeaturesWithinDistanceOf(e.Location, GeographyUnit.Meter, DistanceUnit.Kilometer, 10, ReturningColumnsType.AllColumns); 
  
 You can change the distance parameter to make sure you find the real marker you want. 
  
 Please feel free to let us know your problems. 
  
 Regards, 
  
 Gary 
  
 You can