ThinkGeo.com    |     Documentation    |     Premium Support

Marker popups with column values?

Hi,


I want to display a series of markers, based on a TAB data set. Each marker should have an individual popup showing data from a column.


I've created a class "ColumnBasedMarkerStyle", with a constructor taken a column name as argument, and an overriden function GetMarkers().


But the marker layer doesn't display anything, but I'm not sure whether the error's in the class definition, or in the class invocation.


Any help is appreciated. My code is below.


 



Public Class ColumnBasedMarkerStyle
    Inherits MarkerStyle

    Private m_ColumnName As String

    Public Sub New(ByVal cn As String)
        m_ColumnName = cn
    End Sub

    Public Overrides Function GetMarkers(ByVal fts As System.Collections.Generic.IEnumerable(Of Feature)) _
                                                                As System.Collections.ObjectModel.Collection(Of Marker)
        Dim m As New Marker
        Dim mks As New System.Collections.ObjectModel.Collection(Of Marker)
        Dim msg As String = "Info:<ul>"

        If m_ColumnName = "" Then
            msg += "<li>NO information</li>"
        Else
            For Each ft In fts
                msg += "<li>" + ft.ColumnValues(m_ColumnName).ToString() + "</li>"
            Next
        End If

        msg += "</ul>"
        m.Popup.ContentHtml = msg
        mks.Add(m)

        Return mks
    End Function
End Class

-----

Dim mo As New InMemoryMarkerOverlay()
myDataset.FeatureSource.Open()
For Each ft In myDataset.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns)
    mo.Features.Add(ft)
Next
myDataset.FeatureSource.Close()

mo.Name = "My markers"
mo.IsVisible = False
mo.IsBaseOverlay = False
mo.IsVisibleInOverlaySwitcher = True

mo.ZoomLevelSet.ZoomLevel01.CustomMarkerStyle = New ColumnBasedMarkerStyle("NAME")
mo.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

Map1.CustomOverlays.Add(mo)


Lars I.,


     The reason of that the marker layer doesn’t display is that you didn’t give the position property to marker in class “ColumnBasedMarkerStyle”. The code you need is below:
 
Dim baseShape As BaseShape = ft.GetShape()
If TypeOf baseShape Is PointShape Then
         m.Position = TryCast(baseShape, PointShape)
End If

 
Add this code snippet to class “ColumnBasedMarkerStyle”, marker layer will display.
 
Thanks,

James



Hi James,


Hmm, it still doesn't render anything. I did actually try setting the "position" to a known value before, but also unsuccesfully.


The feature source (myDataset in the code) is a reprojected layer (.FeatureSource.Projection = New ManagedProj4Projection(..)), which display nicely on its own. Could that be the source of the problem ?


I've tried to add some code to transfer the column definitions form "myDataset" to "mo" (code below), but it still doesn't render.



Dim mo As New InMemoryMarkerOverlay("MyMarkers")
myDataset.FeatureSource.Open()
mo.FeatureSource.Open()
For Each c In myDataset.FeatureSource.GetColumns()
    mo.Columns.Add(New FeatureSourceColumn(c.ColumnName, c.TypeName, c.MaxLength))
Next
For Each ft In myDataset.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns)
    mo.Features.Add(ft) 'transfers column data ??
Next
mo.FeatureSource.Close()
myDataset.FeatureSource.Close()
...
 

I don't set the actual display type/image anywhere in the code. Will that use the default (blue balloon), or must I also add some form of "Draw" routine to my class definition ?


Please advise. TIA


 


 



Hi again,


I'm wondering whether I'm getting this proces completely backwards.


My custom class is of type MarkerStyle, and it's fed a collection of features. My intuitive understanding of the proces being markers being assigned a style seems to be wrong. Instead my class is a filter into which a collection of features is being fed to generate a collection of markers. Right ?


I've changed my class code to reflect this "opposite" approach, but alas, it still doesn't render anything :-(


 



Public Class ColumnBasedMarkerStyle
    Inherits ThinkGeo.MapSuite.WebEdition.MarkerStyle

    Private m_ColumnName As String = ""

    Public Sub New(ByVal columnName As String)
        m_ColumnName = columnName
    End Sub


    Public Overrides Function GetMarkers(ByVal fts As System.Collections.Generic.IEnumerable(Of Feature)) _
                                                                As System.Collections.ObjectModel.Collection(Of Marker)
        Dim mks As New System.Collections.ObjectModel.Collection(Of Marker)

        For Each ft In fts
            Dim m As New Marker

            m.IsVisible = True

            Dim baseShape As BaseShape = ft.GetShape()
            If TypeOf baseShape Is PointShape Then
                m.Position = TryCast(baseShape, PointShape)
            Else
                m.Position = TryCast(baseShape.GetCenterPoint, PointShape)
            End If

            If m_ColumnName = "" Then
                m.Popup.ContentHtml = "<b>NO information</b>"
            Else
                m.Popup.ContentHtml = "<b>INFO:</b><hr/>" + ft.ColumnValues(m_ColumnName).ToString()
            End If

            mks.Add(m)

        Next

        Return mks

    End Function
End Class



Hi again, 



It renders !!! :-) 



I finally got around to applying a value for the created marker's WebImage property i class ColumnBasedMarkerStyle, and now it shows on the map. 



And the marker popup shows the value from the feature column, just as I want. 



So this issue is now solved :-) 



 


Hi, Lars
Glad you got what you want. Thanks for the information you provided and we shall still have a look into this issue to see if there any other way that we can make it easier for you to use the CustomMarkerStyle.
Any updates we’ll let you know.
James