ThinkGeo.com    |     Documentation    |     Premium Support

Marker Labels?

I must be missing something.


I have a simple loop that finds Lat and Lon in database and adds a marker. I want to add label to each marker (LocID), but all markers come up witha same text (LocID)


Ultimately I need to be able to add an Onclick event that queries database based on the LocID and retrieves additional infor that is put into Popup. I have a code that woked on Google map but does not work here. What is the proper syntax to do that?


Here is the code that does not populate the markers with unique IDs


 


 


Do While dtrMark.Read()"LocID").ToString()


   


LocID = dtrMark("LocID").ToString()



  


 


inMemoryMarkerOverlay.Features.Add(New Feature(CDbl(dtrMark("Longitude")), CDbl(dtrMark("Latitude"))))


  inMemoryMarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.Popup.ContentHtml = LocID 


  inMemoryMarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.Popup.AutoPan =True


Loop 


 




Jakub,


ContentHtml is a string set on all the markers which are added in the InMemoryMarkerOverlay. On the other hand, it has a function to help you binding to feature’s column values.

Here are three things we need to be aware of, please see the comments on the following code.
' 1, FeatureSourceColumn is an important property which used for connect the the column value on the feature. 
inMemoryMarkerOverlay.Columns.Add(New FeatureSourceColumn("LocID")) 
Dim feature As New Feature(lon, lat) 

' 2, Add the value for the column you set. 
feature.ColumnValues.Add("LocID", locIDValue) 
inMemoryMarkerOverlay.Features.Add(feature) 

' 3, [#LocID#] is a format of Map Suite Web Edtion, it formats the column value automatically. 
inMemoryMarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.Popup.ContentHtml = "[#LocID#]" 

If you have any questions please let me know.


Thanks,

Howard



Hi Howard, 
 Sorry for delay, I was on vacation. 
 The code above works great for ONE marker, not so good for 10 thousand markers. I get a Javascript error. My suspicion is that it has to do with setting all markers as the same feature. When I comment out item 3 from above code, markers display fine, but no Popup. What do i need to do to be able to display disctinct popup for each of my Markers? 
 Samer issue seem to happen with ContextMenu. Although I set a custom contextmenu HTML link on each marker (confirmed with breakpoint in code) all of them show the same link. 
 How can I fix that? 
 Thanks 
 Jakub 
  


Jakub,



Could you uncheck the “Disable script debugging (Internet Explorer)” and “Disable script debugging (Other)” in IE? Just like the following screenshot. Then run your app again and provide me the detail JavaScript error information.





I guess that it causes by thousands of markers. You know marker and context menu are complicate DOM tree node on the IE browser. If the count is too many, it makes the IE crush.



I did a test on our installed sample at “Samples\Markers\AddProjectedMarkers.aspx”, it works fine in both Popup and ContextMenu. Here is our online sample of it.

websamples.thinkgeo.com/webe...rkers.aspx



Also, please replace the same file in our installed sample with the attached file and see how it works.



Please feel free to ask if you have any queries. 



Thanks,

Howard

 



894-AddProjectedMarkers.aspx.cs (2.84 KB)

Hi,


The error actually breaks into my Visual Studio as Microsoft JScript Compilation Error: Syntax Error on opl_GeoResource.axd


on line



try



{(this.options['on'+state]||OpenLayers.Ajax.emptyFunction)(response);OpenLayers.Ajax.Responders.dispatch('on'+state,this,response);}catch(e){this.dispatchException(e);}

When I let the debugger pass the exception to the program it displays all overlays except the Markers.


Can you send the sample code in VB instead of C#, please. It will save me the time to convert. But As I checked it it look pretty any much the same as I am using it, only you load markers from the shapefile and I load them from the recordset one by one.


Any suggestions?


 


Thanks,


Jakub


 




Hi Jakub,



This issue definitely causes by the marker. But we can tell the reason by this information. Could you provide me the version you are using; you can easily find the version by the static property of Map control.



The attached VB code are binding data from ShapeFile and Recording data one by one. Please have a look at it, hope it make sense.



Thanks,

Howard



895-AddProjectedMarkers.aspx(UseFeatureSourceMarker.vb (2.7 KB)
896-AddProjectedMarkers.aspx(UseInMemoryMarkerOverl.vb (3.41 KB)

I am using version Map Suite Web Edition 3.1.124  
 The code you sent is pretty much what I am using - the inMemoryMarkerOvelay 
  
 Although evidently in order to prin to PDF in need some other way of putting markers on the custom overlay 
  
 thanks, 
 jakub 
  


Jakub, 
  
 Do you mean the issue still exists when you copy the code using AddProjectedMarkers.aspx.vb to our installed sample? 
  
 Also, marker overlay actually renders on the client side and only its data algorithm is on the server side. That means we cannot handle its rendering on the server side, so we cannot print markers as PDF. Only LayerOverlay runs on the server side which you can print anything in the LayerOverlay. 
  
 I recommend using LayerOverlay with InMemoryFeatureLayer. The PointStyle setting on the InMemoryFeatureLayer supports image which you can imitate the markers and print it perfectly. 
  
 If you have any questions please let me know. 
  
 Thanks, 
 Howard

Ok Thanks.


Does LayerOverlay with InMemoryFeatureLayer allow for onclick event or a popup window?


I guess I need a little help to find the best way to achieve my goal using your application.


I am porting an existing project that uses Google Map and displays thousands of markers (loaded from database) on an large airport sized area.


each marker has an onclick event that loads multiple tables of data from database in a tabbed pop-up. (needs to be loaded during out-of-band onclick event as it is too much data to load into initial map for all markers)


The reason we purchased your application was to be able to overlay several shapefiles over the base google map and also display all markers with the on-click functionality mentioned above.


So my question: what is the best approach to achieve the above while providing adequate response and functionality?


 what should I use? inMemoryMarkerOverlay or LayerOverlay with InMemoryFeatureLayer 

Thanks,


Jakub


 




Hi Jakub,



First of all, I want to let you know if the markers’ count in the same viewport is too big, it really affects the performance for the client side. You know the IE browser maintains too many DOM tree nodes. Also the JSON String send to the client side might be too much.  It’s the deadly defect of the web application which every web developer needs to avoid. 



In this case, I have two options for you. One is setting “SuppressingGridSize” on the MarkerOverlay to suppress some markers which are too close to each other to reduce the DOM tree nodes and shorten the JSON String which is transferred to the client side. Or use InMemoryFeatureLayer instead of MarkerOverlay. It might be the easiest way to go.



Now, let’s take about LayerOverlay with InMemoryFeatureLayer. In this way, we don’t have marker click event when the user clicks on a specific area such as marker image. Also, we don’t support hovering popup on the LayerOverlay, but it gains a lot of performance. On the other hand, we can simulate the click event and popup. Please refer to the following posts to find how to use callback to implement the hover popup. 

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



Also the map has click event, in this event you also can find the feature you clicked if you put the map in an update panel and it feels the same as experience but more interactive with the server.



These two solutions have different work flow; and I cannot say which one is better because they both have some advantage and disadvantage. But if I'm the one to develop this application, I’ll choose the second solution with all AJAX stuff. 



Hope it helps and any questions please let me know.



Thanks,

Howard



Thanks for explanation. 
 So how would I go about determining what marker the Map click event clicked in LayerOverlay with InMemoryFeatureLayer 
 The markers are pretty dense. 


Jakub,


InMemoryFeatureLayer doesn’t know the concrete marker but bunch of data source (Here I mean features). Markers are the reflection of the data source and the marker style on the client side. So in the map click event, you can just find which data to use, not a concrete marker.


Use QueryTools to select the features which you click around is the best way. Please refer to the following post for how to use it.

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


It returns a collection of feature; you can choose the first feature or anyone of them.


If you have any questions please let me know.


Thanks,

Howard



I added the the LayerOverlay with Markers (blue) on the same google basemap as the MarkerOverlay (red markers).


The problem is that the location of the markers does not match. See attached image.


The two sets of markers should be exactly on top of each other as they are the same Lats and Longs loaded from the database twice.


The red markers appear to be in the right position, the blue markers are offset to NW.


How can I get them into proper position?


I am projecting them exactly the same as the MarkerOverlay




 Dim proj7 As New Proj4Projection
            proj7.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326)
            proj7.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString()
            markerLayer.FeatureSource.Projection = proj7

 


Also, the markers are clipped at the tile boundaries. Is there a way to fix that? 


Thanks,


Jakub


 



940-TGMapMarkers.jpg (63.5 KB)

Jakub,



It seems the offset x and y are different in your application. Please try to find if the two layer has different offset:worldLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.XOffsetInPixel = xOffset;
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.YOffsetInPixel = yOffset;



The clipped tile markers is a disadvantage of point style in multi-tile mode; I recommend using SingleTile type, That'll be fine also it has better performance.



If you have any questions please let me know.



Thanks,

Howard



Hi to all,


markers are very important for the project I'm developing. I purchased the Map Suite Web 3.0 and the poor performance of placing more than 100 markers with click handling is a big disadvantage for this solution (I'm using InMemoryMarkerOverlay).


Is it possible to increase the performance for Google Maps mashing up Map Suite Web 3.0 with the techniques described at the following link:


svennerberg.com/2009/01/handlin...ogle-maps/


Thanks in advance, I hope in a positive answer!!!


Fabio


 



Fabio,



Technically, it’s possible to refer Googles markers in MapSuite 3.0. But the disadvantage is that the order to overlap with the other layers. Markers should always be on the top of all the overlays. On the other hand, we don’t support server event and popup feature with their library.



For marker overlay, we have a property to suppress some of the markers which are close together.markerOverlay.SuppressingGridSize = 50;


It suppresses the marker but doesn’t cluster them to one big marker.



The cluster feature is now in designing for our future version.



Here is another post which has some tips for the marker performance.

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



Any questions please let me know.



Thanks,

Howard

 



With the cluster feature, will it be possible to click on a marker?  
 Will it be faster than the actual solution? 
 Have you an idea of the release date? 
  
 Thanks, 
 Fabio

Fabio, 
  
 Sure, it supports click event and popup on the marker. It’s just cluster markers into a big one and the other features are the same as markers.  
  
 Its performance is similar like the SuppressingGridSize property which depends on the grid size you set; the bigger the size is set the more markers will be clustered which means less markers will be added on the client side; at the meantime,  we gain more performance. 
  
 I cannot tell the exactly release date of this feature but it’s on our schedule currently; it may integrate in the next release. Please keep an eye on our website. 
  
 If you have any queries please let me know. 
  
 Thanks, 
 Howard

Yes the offset was the problem



Setting

markerLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.XOffsetInPixel = 0 markerLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.YOffsetInPixel = 0



made them match with other markers.


the clipping got resolved by SingleTile type.


Thanks.


 


Now I have to figure out how to pass the MarkerID when a specific marker is clicked (or the layer at the location of a specific marker).


 


 



Jakub, 
  
 I think feature id is the property you needed. For example, when click on the map, you buffer the click point to a multi-polygon; do a query to find the features which are interacted with it. You can get any information and edit the features in this way. 
  
 Hope it makes sense. 
  
 Any questions please let me know. 
  
 Thanks, 
 Howard