ThinkGeo.com    |     Documentation    |     Premium Support

SimpleMarkerOverlay Refresh Issue

I am populating a simple marker overlay via a timer in an update panel.  However, the markers are not refreshing on the client side.  I found a post which says to use mapControl.GetMapParser().sendMarkersRequest(); although I get a Javascript exception when doing this.  Below is the code from my page.  If I force a redraw then the markers show up on the page.  Anybody have any idea what I am missing here?  My other layers from the javscript method updateVehicles are updating fine.


 


Thanks
Curtis


 



<%@ Page Title="" Language="C#" MasterPageFile="~/Template.master" AutoEventWireup="true" CodeFile="LiveMap.aspx.cs" Inherits="LiveMap" %>

<%@ Register Assembly="WebEdition" Namespace="ThinkGeo.MapSuite.WebEdition" TagPrefix="cc1" %>
<%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %>
<%@ Register assembly="Telerik.OpenAccess, Version=2009.3.1119.2, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342" namespace="Telerik.OpenAccess" tagprefix="telerik" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    <title>EPIC Works - Live Map</title>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    [script removed]
        var olMap;
        document.body.onresize = pageSizeChanged;
        
        function OnMapCreated(map) {
            olMap = map;
            pageSizeChanged();
        }

        function updateVehicles() {
            var vehicleOverlay = olMap.getLayer("vehiclesOverlay");
            vehicleOverlay.redraw(true);
            mapControl.GetMapParser().sendMarkersRequest();
        }        

        function pageSizeChanged() {
            var scrollHeight = parseInt((self.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight)));
            var pageContainer = document.getElementById("pageContainer");
            var newHeight = (scrollHeight - 26) + 'px';
            pageContainer.style.height = newHeight;
        }
    [script removed]

    
        <telerik:RadSplitter ID="RadSplitter1" runat="server" Width="100%" Height="100%" Skin="Windows7">
           <telerik:RadPane ID="LeftPane" runat="server" Width="22px" Scrolling="none" Height="100%">
                <telerik:RadSlidingZone ID="SlidingZone1" runat="server" Width="22px">
                    <telerik:RadSlidingPane ID="RadSlidingPane1" Title="Truck Configuration" runat="server" Width="200px" CssClass="radSlidingPane">
                        [script removed]
                            <DataBindings>
                                <telerik:RadTreeNodeBinding Expanded="true" />
                            
                        </telerik:RadTreeView>
                    </telerik:RadSlidingPane>
                    <telerik:RadSlidingPane ID="Radslidingpane2" Title="Selected Point Data" runat="server" Width="330px" CssClass="radSlidingPane">
                        <telerik:RadGrid ID="pointDataGrid" runat="server" AutoGenerateColumns="False" 
                            GridLines="None" Height="400px" Width="300px">
                            <MasterTableView>
                                <RowIndicatorColumn>
                                    <HeaderStyle Width="20px" />
                                
                                <ExpandCollapseColumn>
                                    <HeaderStyle Width="20px" />
                                
                                <Columns>
                                    <telerik:GridBoundColumn HeaderText="Parameter" ReadOnly="True" 
                                        UniqueName="parameter" DataField="Key">
                                    </telerik:GridBoundColumn>
                                    <telerik:GridBoundColumn HeaderText="Value" ReadOnly="True" UniqueName="value" DataField="Value">
                                    </telerik:GridBoundColumn>
                                
                            
                        </telerik:RadGrid>
                    </telerik:RadSlidingPane>
                </telerik:RadSlidingZone>
            </telerik:RadPane>
            <telerik:RadSplitBar ID="Radsplitbar1" runat="server"></telerik:RadSplitBar>
            <telerik:RadPane ID="MiddlePane1" runat="server" Scrolling="None" Height="100%">
                [script removed]
                <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                    <ContentTemplate>
                        [script removed]
                        </asp:Timer>
                    
                </asp:UpdatePanel>
            </telerik:RadPane>
        </telerik:RadSplitter>
    
</asp:Content>


Hi, Curtis


sendMarkersRequest function is used for InMemoryMarkerOverlay, it gets markers in asynchronization mode. So if you use SimpleMarkerOverlay, you don't need to use that. Here is simple sample for your scenario, we have added a marker in the SimpleMarkerOverlay, and update it's position or add new markers, it's works well. 


If you still have any problems please let me know.


Thanks,


Johnny



1709-AutoRefresh.zip (1.41 KB)

Johnny,


This is exactly what I am doing.  The only difference that I can see is that I only have my timer in the update panel and my map is outside the update panel.  I don't believe that I really want my map in the update panel.  Is there a way to get the simple markers to update to the map via javascript?  I don't want to go to the InMemoryMarkerOverlay as I don't believe I can specify an image per marker with that.


The other thing is, the method that was given mapControl.GetMapParser().sendMarkersRequest() where mapControl is the ID of the map control is throwing an exception in IE.  Should that refer to something other than the ID of the control?  If I look in the debugger I see no methods called GetMapParser on the map object.  And yes, I realize that this is for the InMemoryMarkerLayer.


Webpage error details



User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

Timestamp: Tue, 2 Feb 2010 12:23:16 UTC





Message: 'mapControl' is undefined

Line: 95

Char: 13

Code: 0

URI: localhost/LiveMap.aspx



Thanks.


Curtis



Curtis,



Yes, you could get the simple markers to update in the map control via JavaScript using Callback mechanism, that means we won’t submit all the form data to server, and the server side will return the makers data using some specific data format such as Json and then client side update markers positions or images.



Another thing is that mapControl is the ID of map control definitely, your exception maybe is caused by that you call GetMapParser function of mapControl object before this object is instantiated. So, you could use GetMapParser function in OnMapCreated callback function. The code likes below:


        var OnMapCreated = function(map) {
            var parser = mapControl.GetMapParser();
        }



Thanks,



Khalil

 



Hi, 
  
 I actually have a function like you mentioned above which grabs the map object and stores it in a variable.  Then in another function I call the mapControl.GetMapParser() function.  The mapControl is an object in the debugger but the GetMapParser method does not exist as a method on the object.  Any ideas? 
  
 Curtis

Hi, Curtis



The problem is caused by that GetMapParser function of mapControl object is called before it has been initialized.



You have mentioned that mapControl.GetMapParser function is called in another function; I guess that’s the problem. Maybe you could refer to the screenshot below which shows the last lines of source code of “DisplayASimpleSample” sample,




you could see that the Map1 which is the ID of map control is initialized before the closing tag of form, so any code before it don’t know whether this object exists. So, you could call GetMapParser function in the body onload event or OnMapCreated function. The code likes below:




    function load() {
        var parser = Map1.GetMapParser();
        var parser1 = parserMap1;//parser+ID of Map Control
    }
    
    var OnMapCreated = function(map) {
        var parser = Map1.GetMapParser();
        var parser1 = parserMap1; //parser+ID of Map Control
    }



Another thing is that we have public released VehicleTracking product. Please contact our sales represents if you are interested about that.



Any more questions please let me konw.



Thanks,



Khalil



Hi, 
  
 I think you are missing the point here.  See my code in the first post above, if I understand this correctly and from what I can tell in debugging, OnMapCreated is called when the page loads which is when the map loads.  Function updateVehicles is called asynchronously from a timer because the timer is in an update panel which tells me it is using AJAX.  Thus, the object olMap should long have been initialized as the timer does not tick off for 30 seconds after the page has loaded which means that the function updateVehicles should not be called for 30 seconds as well which is what I am seeing via the debugger.  If the object has not been initialized then I should not see the object properties either in the debugger but yet I am still getting the exception. 
  
 Curtis

Curtis,



Sorry for misunderstanding your point in the first post above. The problem is maybe caused by that you place the map control in the content page, so the ID of map control has changed, and not mapControl any more now. You could get ID through the code below:


        function updateVehicles() {
            var parser = <%=mapControl.ClientID %>.GetMapParser();
        }  




The attachment is a simple sample for you, please refer to it. 

If you still have any more problems, please let me know.



Thanks,



Khalil

 



1738-Sample.zip (7.21 KB)