ThinkGeo.com    |     Documentation    |     Premium Support

RE: Add marker and remove marker by Kamal

Hello,


  Regarding   Add marker and Remove Marker by Kamal on Oct.14, 2009;  a zip file (6348.zip) was posted demonstrating how to add and remove a marker using client code (JavaScript).  The code works with a SimpleMarkerOverlay.  Is there a way to do the same with a Map1.MarkerOverlay (InMemoryOverlay)?  What I have is data coming from the database as a DataRow that updates a cached DataTable.  The map is totally redrawn from the DataTable when new data for a single location (point) comes in from the database.  I would like to add and remove only for a single location as shown in 6349.zip. 


Thank you


  Steven 



Steven,  
  
 Sorry, I’m afraid that we cannot implement this in InMemoryMarkerOverlay without changing our JavaScript core. Because the algorism of InMemoryMarkerOverlay is different from SimpleMarkerOverlay. Please see my tips. 
  
 1), InMemoryMarkerOverlay manages features on the server side; users use it for adding batch of markers. Actually, user doesn’t know markers in this way; they only know setting styles and maintain features. In this way, users may add too many markers on the client side even if they are not in the extent which may cause memory issue on the client side. To fix this issue, we designed to add markers only in the current extent; we’ll refresh markers asynchronizely whenever current extent changed. 
  
 That’s why I said impossible to implement your requirement. We only refresh the markers which are maintained on the server side. The markers which are added on the client side will be removed after the automatically refreshing. 
  
 2), SimpleMarkerOverlay allows user maintain their markers object by themselves. They’ll always exist on the client side even they are not in the extent. So SimpleMarkerOverlay is good choice. 
  
 3), We recommend adding overlays into CustomOverlays which accepts any kind of overlay such as LayerOverlay, SimpleMarkerOverlay, 3rd part overlay, etc. In this way, your code is a little much but it’s more extensible. 
  
 Hope it makes sense. Please let me know if you have any questions. 
  
 Thanks, 
 Howard

Howard,

  Thank you for your reply.  Actually, option 2 is not an option for me because I am using the World Map Kit.  It sets layers up as static and dynamic overlays.  If I understand correctly, CustomOverlay cannot be used with DynamicOverlay or StaticOverlay.  I am using Map1.MarkerOverlay to draw the initial markers.  When data comes from the backend, I would like to redraw those markers or add new markers.  I have written code this but I am getting a Javascript error the function DrawMapUpdate.  The function executes in the debugger but the IDE breaks in the axd file.  I am attaching the code.  If you could give some code examples on how to accomplish the redraw, please do so.


Regards,


  Steven



1335-Map.txt (23.4 KB)

Steven, 
  
 It’s not easy to find the issue through your attached code. Because we don’t have the data on our end. It’s better that you can send us a simple sample to help us to recreate your issue. Or provide us more information for your requirement so that we can recommend our better ideas. Also please send us the exception on the axd file. 
  
 Looking forward your information. 
  
 Thanks, 
 Howard

Howard,


  I did not send the aspx markup, maybe that is where your difficulty lies.  I will attach it.  The map loads data from an initial query (function SetUpDataSet) and the data is cached in a dataset.  The map code then accesses this dataset and draws the map.  This works fine.  The aspx markup contains a server side timer firing every x number of seconds; could be 5 or could be 10 seconds.  When the timer fires, the function UpdateTrackShape() is called.   UpdateTrackShape creates a proxy and calls a web service that may or may not have new data.  If it does not, nothing happens, but if it does, the new data DataRow.ItemArray (object[] values) is returned and cast as a DataRow.  The cached dataset is updated with this DataRow and DrawMapUpdate() is called with the new updated dataset.   The important field in ths dataset is State which controls which color marker icon is loaded.  DrawMapUpdate() should redraw the map reflecting the new data.  I would like to redraw only  the  point that have state change, but if I cannot do that, I suppose I could redraw the entire map by deleting the existing shape file and clearing the features.  That is what I am trying to do in the function DrawMapUpdate().  We are taking advantage of the World Map Kit to draw the map.  That presents a problem in that one cannot use CustomOverlays with StaticOverlays or DynamicOverlays that the WMK uses; therefore all the examples of redrawing or removing markers use CustomOveraly code to achieve the marker manipulation cannot be used.   Because of using the WMK, that is not an option.  I see two options, modify the WMK to load CustomOverlays ( I would not want to tackle that), or redraw the map, as I am trying to do.  Most likely there is another option that I don't know about.  I am hoping you can point that out and give some code, or better yet modify mine.  The axd error is 'Microsoft JScript compilation error: Syntax error'. on: 'on'+state,this,response);}catch(e)

the error is flagged on the } before the catch(e) in GeoResource.axd (line 627).  No error is flagged in the function DrawMapUpdate.  It may be difficult to set up an example, but I will look into that.  The map is only part of a larger system.  Hopefully you can figure this out from the information I am giving you now.


Regards,


  Steven                                                                                                                



OpenLayers.Ajax.Responders.dispatch(



1337-Map.txt (23.7 KB)

Steven, 



We glanced over your attached code and found one issue. We found that you added two same FeatureSourceColumn twice in the two methods which called "DrawMap(DataTable)" and "DrawMapUpdated(DataTable)"; please check the following two lines of code in your file.

Map1.MarkerOverlay.Columns.Add(new FeatureSourceColumn("Crossings"));
Map1.MarkerOverlay.Columns.Add(new FeatureSourceColumn("szSiteDesc"));



When we render images and markers, we need to do some specific check before querying features. In your application, you add these columns twice. I guess the exception will be gone if you remove the extra columns.



Please have a try and let me know how it works.



Thanks,

Howard



Howard, 
   Perfect!  You guys are better than you know.  I noticed this yesterday as well and added  the line 
  Map1.MarkerOverlay.Columns.Clear(); 
  in DrawMapUpdate() before the 2 lines             
  Map1.MarkerOverlay.Columns.Add(new FeatureSourceColumn("Crossings")); 
  Map1.MarkerOverlay.Columns.Add(new FeatureSourceColumn("szSiteDesc")); 
 and the javascript error is gone and the map redraws as it should.   Your answer raises a question for me.  You mentioned doing some specific check before querying features. Would this querying make it so I can replace only a specific  marker as opposed to redrawing them all as I am doing now?  Please expand on this.  How do you query? 
  
 Thanks, 
   Steven

Steven, 
  
 Good to know that you have fixed your issue. 
  
 Actually, InMemoryMarkerOverlay maintains features; not a concrete markers. To query and edit feature is the same as querying InMemroyFeatureLayer which uses QueryTool for querying and EditTool for editing.  
  
 In web application, when you do a post back, no matter whether the map is in an UpdatePanel, the whole page or some specific area in the UpdatePanel will refresh; so does our map control. You can replace some specific features to replace the markers on the server side. But on the client side, it refreshes when you panning around. 
  
 Please let us know if you have any questions. 
  
 Thanks, 
 Howard