ThinkGeo.com    |     Documentation    |     Premium Support

Multiple Popups displaying same data

Hello,


  I have some hover popups that show data relating to a point on the map.  The problem is that each popup shows  the same data, which is not what I want.  It should display that particular data for the individual point.  The data is coming from a DataRowView instance from a DataTable.  Code follows;



 



private void DrawMarkerOverlays(DataTable dt, ValueMarkerStyle myValueStyle)DataView dv = dt.DefaultView;//Assertion does not fail so they are the same.

 


 


 


System.


 


 


 


 


 


 


 


{


drv = (


lon = drv.Row[


lat = drv.Row[


 


{


dlon =


dlat =


desc = drv.Row[


 


AppendFeatures(Map1.MarkerOverlay,state.ToString(),dlon,dlat); 


}


}


Debug.Assert(dv.Count == dt.Rows.Count);IEnumerator iterator = dv.GetEnumerator();DataRowView drv;Int32 i = 0;string lon = string.Empty;string lat = string.Empty;Double dlon = 0.0;Double dlat = 0.0;string desc = string.Empty;int state = 0;while (iterator.MoveNext())DataRowView)iterator.Current;"lLongitude"].ToString();"lLatitude"].ToString();if (VerifyLatLon(lat, lon))Convert.ToDouble(drv.Row["lLongitude"]);Convert.ToDouble(drv.Row["lLatitude"]);"szSiteDesc"].ToString();CreateValueMarker(state,myValueStyle,dlon,dlat,desc);i++;

 


{


 


{


 


vmStyle.ValueItems.Add(


 


CreatePopup(CreateKey(lat), lon, lat, hoverText),


CreateContext(CreateKey(lat), lon, lat))));


 


 


vmStyle.ValueItems.Add(


 


CreatePopup(CreateKey(lat), lon, lat, hoverText),


CreateContext(CreateKey(lat), lon, lat))));


 


 


vmStyle.ValueItems.Add(


 


CreatePopup(CreateKey(lat), lon, lat, hoverText),


CreateContext(CreateKey(lat), lon, lat))));


 


 


 


}


}


private void CreateValueMarker(Int32 state, ValueMarkerStyle vmStyle, double lon, double lat, string hoverText)switch (state)case 0:new MarkerValueItem(state.ToString(),new PointMarkerStyle(new WebImage("/CrossingsMap/theme/default/img/marker_green.gif", 25, 25, -11.5F, -25F),break;case 1:new MarkerValueItem(state.ToString(),new PointMarkerStyle(new WebImage("/CrossingsMap/theme/default/img/marker.gif", 25, 25, -11.5F, -25F),break;case 2:new MarkerValueItem(state.ToString(),new PointMarkerStyle(new WebImage("/CrossingsMap/theme/default/img/marker_grey.gif", 25, 25, -11.5F, -25F),break;default:break;

 


{


 


private CustomPopup CreatePopup(string key, double lon, double lat, string hoverText)try

{


 


 


 


CustomPopup popup = new CustomPopup();StringBuilder contentHtml = new StringBuilder();//contentHtml.Append("")

contentHtml.Append(


.Append(hoverText)


.Append(


popup.ContentHtml = contentHtml.ToString();


popup.AutoSize =


popup.BorderWidth = 1;


popup.IsVisible =


popup.AutoPan =


Map1.MarkerOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =


 


}


 


"")"");true;false;true;ApplyUntilZoomLevel.Level20;return popup;catch

{


 


}


}


return null;


{


 


 



 


Hi Steven,
We notice that there is one statement which is used to set the value of ContentHtml of the popup:


popup.ContentHtml = contentHtml.ToString();


 
But we didn’t find out where you set the value of contentHtml from the code you pasted on this post. So could you please paste your code to a txt file and upload it to this post? That will help a lot.
Any more information is appreciated.
Thanks,
Sun

HI,


  I can understand your confusion.  I never previewed the post, it is unreadable.  Please find my attached file.  The function DrawMarkerOverlay calls CreateValueMarker with the param desc (from desc = drv.Row["szSiteDesc"].ToString();) where drv is a DataRowView derived from a DataTable), which contains the string value for the ContentHtml of the popup.


Regrds,


  Steven



1309-CreatePopup.txt (3.9 KB)

Hi Steven,


The Map1.MarkerOverlay is an InMemoryOverlay, which we designed to bind the feature’s data to some specific style. So when you are using a value style on it, one value item (containing many features) is corresponding to one kind of marker, which has the same image, context menu and popup, this leads to multi popup shows the same data. In one word, the InMemoryOverlay manages the features but not markers. 
To solve this problem, we have two solutions: one is that the popup can be bind to a column of a feature source like this:


markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.Popup.ContentHtml = "[#AREANAME#]";


 
So you need to add a column which should be “szSiteDesc” in your DataTable to the Map1.MarkerOverlay.Columns, and add the specific value of this column to each feature, then bind the popup to this column.
The other solution is to use SimpleMarkerOverlay which manages each marker in it but not feature. You need to specify every marker’s style and popup, then add the marker to this overlay. The code could be like this:


private void DrawMarkerOverlays(DataTable dt)
{
    SimpleMarkerOverlay simpleMarkerOverlay = new SimpleMarkerOverlay();
    Map1.CustomOverlays.Add(simpleMarkerOverlay);

    DataView dv = dt.DefaultView;

    //Assertion does not fail so they are the same.
    Debug.Assert(dv.Count == dt.Rows.Count);
    IEnumerator iterator = dv.GetEnumerator();

    DataRowView drv;
    System.Int32 i = 0;

    string lon = string.Empty;
    string lat = string.Empty;
    Double dlon = 0.0;
    Double dlat = 0.0;
    string desc = string.Empty;
    int state = 0;

    while (iterator.MoveNext())
    {
        drv = (DataRowView)iterator.Current;

        lon = drv.Row["lLongitude"].ToString();
        lat = drv.Row["lLatitude"].ToString();

        if (VerifyLatLon(lat, lon))
        {
            dlon = Convert.ToDouble(drv.Row["lLongitude"]);
            dlat = Convert.ToDouble(drv.Row["lLatitude"]);
            desc = drv.Row["szSiteDesc"].ToString();

            Marker simpleMarker = CreateValueMarker(state, dlon, dlat, desc);
            simpleMarkerOverlay.Markers.Add(simpleMarker);

            AppendFeatures(simpleMarkerOverlay, state.ToString(), dlon, dlat);
        }
        i++;
    }
}

private Marker CreateValueMarker(Int32 state, double lon, double lat, string hoverText)
{
    Marker simpleMarker = new Marker(lon, lat);
    simpleMarker.Popup = CreatePopup(CreateKey(lat), lon, lat, hoverText);
    simpleMarker.ContextMenu = CreateContext(CreateKey(lat), lon, lat))));

    switch (state)
    {
        case 0:
            simpleMarker.WebImage = new WebImage("/CrossingsMap/theme/default/img/marker_green.gif", 25, 25, -11.5F, -25F);
            break;
        case 1:
            simpleMarker.WebImage = new WebImage("/CrossingsMap/theme/default/img/marker.gif", 25, 25, -11.5F, -25F);
            break;
        case 2:
            simpleMarker.WebImage = new WebImage("/CrossingsMap/theme/default/img/marker_grey.gif", 25, 25, -11.5F, -25F);
            break;
        default:
            break;
    }

    return simpleMarker;
}


Any more questions please let me know.
Thanks,
Sun

Sun, 

Thank you for your reply.  I decided to go with the second suggestion.  I am not sure how to implement the binding of a column to a feature.  I have looked at several examples but they are with Google maps and do not make sense to me.  Anyway, regarding the second method, my AppendFeatures function is defined as: 



private void AppendFeatures(InMemoryMarkerOverlay markerOverlay, string val, double lon, double lat) 





Feature feature = new Feature(lon, lat); 

feature.ColumnValues.Add("Crossings", val); 

markerOverlay.Features.Add(feature); 







Note that the first param, markerOverlay, is defined as InMemoryMarkerOverlay.  The 2nd method changes the type to SimpleMarkerOverlay.  When changing the type to SimpleMarkerOverlay, the line 'markerOverlay.Features.Add(feature);' throws and error.   There is no Features.Add method for a SimpleMarkerOverlay.  How How could I accomplish the AppendFeatures functionality with the SimpleMarkerOverlay?  Also note that I am using the World Map Kit.


 


Regards,


  Steven


 Addendum:  When running the 2nd method, I get this error:  "If you use the CustomOverlays collection you may not at the same time use the following properties:  BackgroundOverlay, StaticOverlay, DynamicOverlay or MarkerOverlay.  CustomOverlays was designed to replace these so that you can implement as many overlays as you need in any order.  Trying to use CustomerOverlays and one of the properties above is not allowed as there is not a definitive logical order we could draw them in.  Please reference to the documentation of CustomOverlays property for more information."


What do I need to do to correct this?  Do I have to make all layers as CustomOverlays?  If this is the case, I may need to try the first method since I do not know how to convert all layers to CustomOverlays.



Steven,


I think you’d better use the first solution, because you want to store the features and some column values in the marker overlay, while the simple marker overlay doesn’t support this functionality, it can manage the markers only.
So I think the code could be like this:
1. Add a column to the MarkerOverlay of the map control:


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


2. Append all the features to the MarkerOverlay, and specify the value the new column “szSiteDesc”. You also could set the value of the column “Crossings” at the same time:


private void AppendFeatures(InMemoryMarkerOverlay markerOverlay, string val, string szSiteDescValue, double lon, double lat)
{
    Feature feature = new Feature(lon, lat);
    feature.ColumnValues.Add("Crossings", val);
    feature.ColumnValues.Add("szSiteDesc", szSiteDescValue);
    markerOverlay.Features.Add(feature);
}


 
3. Set the value style like your code:


CreateValueMarker(state, myValueStyle, dlon, dlat, desc);


4. Make some change to the CreatePopup method, some parameters are not needed:


private CustomPopup CreatePopup()
{
    try
    {
        CustomPopup popup = new CustomPopup();

        StringBuilder contentHtml = new StringBuilder();
        contentHtml.Append("")
            .Append("[#szSiteDesc#]")
            .Append("");

        popup.ContentHtml = contentHtml.ToString();
        popup.AutoSize = true;
        popup.BorderWidth = 1;
        popup.IsVisible = false;
        popup.AutoPan = true;
        Map1.MarkerOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
        return popup;
    }
    catch
    {
        return null;
    }



 
Please have a try and any more questions please let me know.
Thanks,
Sun

Sun, 
   Thank you!  Works very well. 
  
 Regards, 
   Steven

OK, please feel free to let me know if you have any more questions. 
  
 Thanks, 
  
 Sun