ThinkGeo.com    |     Documentation    |     Premium Support

Popup for PointStyle markers

Hello,


I added markers on my map from a shapefile. I created 2 ShapeFileFeatureLayers for one marker - the 1st one is marker layer (PointStyle with icon), the 2nd one is a label layer.


I need to add this functionalities: (1) show a popup when user click on a marker , (2) got some information about this marker (label, id, coords).


How can I inplement this?


Thank you,


Igor


 


 


 



Hi Igor,


The attached is a demo for the scenario, please check it out.


Best Regards!


Johnny



PopupMarkerEvent.zip (140 KB)

Hi Johnny, 
  
 Thank you for you reply, but this example does not work for me. I use neither InMemoryMarkerOverlay, nor FeatureSourceMarkerOverlay. I create 2 ShapeFileFeatureLayers (icons and label). I need to get some popup when i click on icon. 
  
 My understanding that algorithm should be like this one: 
 1 - click on icon -> get coordinates 
 2 - loop through FeatureSource to find point by coordinates 
 3 - get point info (id, name) and show them in popup 
  
 Is it possible to implement this for ShapeFileFeatureLayer? Or maybe there is another solution? 
  
 Thank you, 
 Igor 
  


Hi lgor, 
  
 I think you can add a SimpleMarkerOverlay or InMemoryMarkerOverlay just for add popup, that’s the simplest way for implement that. 
  
 You can add click event for Map1, then you will get e.Position when click on map. 
  
 Call layer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns); for get all features on ShapeFileFeatureLayer, then loop it and find which feature.GetShape().GetCenterPoint() equal your click point. Or you can use layer.FeatureSource.GetFeaturesNearestTo function to find target point around your click point. 
  
 Then you can get everything from target feature, add them to your MarkerOverlay and show it. 
  
 I think this will works for you, please try it. 
  
 Regards, 
  
 Don

Thank you for idea, Don! I've tried it, but noticed couple disadvantages:


* page is posted back every time I click on the map and it slow down rendering. Also, it is looping through all my feature sources(10) to find any feature on every click. If feature have the same coordinates in different sources there is uncertainty.


*  When I used GetFeaturesNearestTo(), I got an popup on the map even I didn't click on a marker. It always shows the nearest feature. I didn't try GetCenterPoint(), my concern was that it is needed exactly click in the "center point".


Nevertheless, I worked out this situation by using different layer types for different zoom levels. I've added FeatureSourceMarkerOverlay for ZoomLevel06 and added click event on this marker overlay.


But I still have some questions left.


You guys mentioned that it is needed to use InMemoryMarkerOverlay. I use FeatureSourceMarkerOverlay because I read data from shapefiles. Is any advantages of using InMemoryMarkerOverlay? Is it faster rendering? If I have FeatureSourceMarkerOverlay, should I loop through it source and create InMemoryMarkerOverlay?


And I guess that 'show popup on click' have better rendering performance (when pan and zoom in-zoom out) than 'show popup on mouseover'. Is it correct? 


 



Hi lgor,  
  
 Don’t worry about InMemoryMarkerOverlay, there isn’t advantage in your scenario, so just keep your solution. 
  
 In inner logic, ‘show popup on click’ same with ‘show popup on mouseover’, but I think ‘on click’ can make everything undercontrol, if choose ‘on mouseover’, maybe get some unnecessary popup. And in future, we maybe will change render way for popup, and ‘on click’ will get better render performance. 
  
 Regards, 
  
 Don

Hi Don, 



Thank you for your reply. As far as I understood, 'show popup on mouseover' works 'on demand' and popups doesn't increase traffic and doesn't slow down rendering. Is it correct? 



When I added 'click event handler' to my marker overlay (markerOverlay.Click += new EventHandler<markeroverlayclickeventargs></markeroverlayclickeventargs>(markerOverlay_Click); ) I got blinking map. Every time I click on marker, the map is refreshed. Do you know if it is possible to implement 'show popup on click' without map blinking (with javascript). BTW, I use Updatepanel 



To display 'popup on mouseover', I had to create my own style and override GetMarkers. It works OK, but I got some issue with icon offset. I need to center icons by center point, not by top left corner. I tried to apply offset: m.WebImage.ImageOffsetX = -m.WebImage.ImageHeight / 2; but it doesn't work because WebImage.ImageHeigh is always = 0. And it looks like that I cannot use GeoImage. Of course, I can pass icon's width and height as parameter to my class constructor, but maybe there is another solution to get WebImage height and width? 



Thanks, 

Igor 



 




Hi Igor,


In Javascript, if we don't assign width and height to object, we cannot get these value from it. So we still suggest you pass width and height in as parameter.


If you want to click on map without blinking, I think you can find some related topic about this. Here is some sample code about how to communicate with server side without callback by map control.


    <script language="javascript" type="text/javascript">

        function _doCalc(evt) {

            var e = evt;

            var map = Map1.GetOpenLayersMap();

            var mapPoint = map.getLonLatFromViewPortPx(new OpenLayers.Pixel(evt.xy.x, evt.xy.y));


            WebForm_DoCallback('__Page', evt.layerX + ',' + evt.layerY, callback, null, null, false);

        }


        function callback(result) {

            alert(result);

        }

    </script>


Here is some client API:

gis.thinkgeo.com/Support/Dis...fault.aspx


I think the logic shoud be:

1. You get marker id client side, sent it back to server via callback, get popup information in client side, show it in marker.

2. You find marker client side, it should contains popup which had been added in server side, show it by Javascript.


Regards,


Don



Thank you very much, Don! I’ll try it

Hello Igor, 
  
 Feel free to let us know your problems. 
  
 Regards, 
  
 Gary