ThinkGeo.com    |     Documentation    |     Premium Support

OpenLayers .redraw Issue

Wondering if somebody could give me some insight into what could be going wrong with this and how to debug it.


I have a map that refreshes automatically every 30 seconds via an Timer, the timer calls a method on the backend that gets a vehicles overlay and then goes through each vehicle and updates the appropriate layers, 3 per vehicle.  I can see that the layers are updating successfully via debugging.  The method that does the updating has the following code:



private void UpdateVehicles(bool registerScript) {
Hashtable assets = (Hashtable)Session["liveMapAssets"];
Hashtable loadTimestamps = (Hashtable)Session["loadTimestamps"];
DateTime toTimestamp = DateTime.Now;

// Clear all the points from the global point layer.
LayerOverlay pointOverlay = (LayerOverlay)mapControl.CustomOverlays["points"];
((InMemoryFeatureLayer)pointOverlay.Layers["pointLayer"]).InternalFeatures.Clear();

// Now do the updating...
IEnumerator enumerator = assets.Values.GetEnumerator();
LayerOverlay overlay = (LayerOverlay)mapControl.CustomOverlays["vehicles"];
while(enumerator.MoveNext()) {
Asset asset = (Asset)enumerator.Current;
MapRenderingUtils.updateVehicle(asset, (DateTime)loadTimestamps[asset.AssetId], toTimestamp, mapControl);
}
overlay.Redraw();

if(registerScript) {
ScriptManager.RegisterStartupScript(this, this.GetType(), "UpdateVehicles", "updateVehicles()", true);
}
}

Then on the client I have this code:



[script removed]
        var olMap;
        document.body.onresize = pageSizeChanged;
        
        function OnMapCreated(map) {
            olMap = map;
            pageSizeChanged();
        }

        function updateVehicles() {
            var overlay = olMap.getLayer("vehicles");
            overlay.redraw(true);
        }        

        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]

The update vehicles method seems to be being called because I can see them being invoked in the debugger and the layer is retrieved successfully but nothing changes on the map.


Thanks.

Curtis



Anybody have any idea on what could be causing this?  I have went through the code and I see absolutely nothing wrong that I can tell.  This worked before when I had a separate overlay for each vehicle and the overlays just had 3 layers each.  I changed it to a single overlay with 3 layers per vehicle for performance reasons and now it does not show anything on the map. 
  
 Thanks. 
 Curtis

Hi, Curtis,



Your idea is right, every time you updates the appropriate InMemoryFeatureLayers related with vehicles, the overlay will be redraw if you call the ReDraw method on the server side in the postback. Another thing is that LayerOverlay is BaseOverlay, so please make OverlaySwitcher map tool enable, so you could check whether other LayerOverlays overlap this LayerOverlay. The code likes below:


                Map1.MapTools.OverlaySwitcher.Enabled = true;



If you still have any problem, could you provide us a simple sample, so we will address it quickly.



Thanks,


Johnny

Johnny, 
  
 Thanks.  Obviously I am missing something here.  I should be able to make the LayerOverlay a non-base overlay correct?  Or should I be using something different?  The problem is that for each vehicle I need to represent a track line for each of two different states plus a layer for the actual current vehicle position.  Thus I add an active layer, inactive layer and truck position layer, each with their own styles. 
  
 I enabled the overlay switcher and for some reason my vehicles overlay is the base overlay. 
  
 Curtis

Curtis, 
  
 Yes, maybe you should set LayerOverlay is a non-base overlay, otherwise you couldn’t see the changes on it. Another thing is that Our VehicleTracking product will be public released recently, so you could refer to it. 
  
 Any more question please let me know. 
  
 Thanks, 
  
 Johnny

Hi, unfortunately this is already done or at least I thought it was.  It is amazing how you miss the easy things.  I had originally had it set but then I changed the name of the overlay, well, I forgot to change the variable name where I set the baseOverlay property.


 



LayerOverlay vehicleOverlay = new LayerOverlay("vehiclesOverlay");
overlay.IsBaseOverlay = false;
mapControl.CustomOverlays.Add(vehicleOverlay);


Changed it to this and now it works as I expected.  Guess I needed a second set of eyes.



LayerOverlay vehicleOverlay = new LayerOverlay("vehiclesOverlay");
vehicleOverlay.IsBaseOverlay = false;
mapControl.CustomOverlays.Add(vehicleOverlay);


Thanks
Curtis



Curtis, 
  
 Very glad to see that you have solved this problem, if you still have any problem on it, please let me know. 
  
 Thanks, 
  
 Johnny