ThinkGeo.com    |     Documentation    |     Premium Support

Overriding GeRequestUriCode on WMSTileOverlay

Hi Guys. In version 4.0 of the desktop edition I was overriding GetRequestUriCore because I needed to add some parameters to the request string like so -


protected override Uri GetRequestUriCore(

        Uri serverUri,

        RectangleShape targetExtent)

        {

            // Convert extent back to decimal degrees for data compatibility and 

            // fit extent to tile grid

            RectangleShape tileGridExtent = FitExtentToTileGrid(_currentExtent);


            string mapExtentKey = GetMapExtentKey(tileGridExtent);


            AddEditParameters(Parameters, "MapExtent", mapExtentKey);

            AddEditParameters(Parameters, "RequestID", _requestID.ToString());

            AddEditParameters(Parameters, "FORMAT", "IMAGE/PNG");


            _requestID++;

            return base.GetRequestUriCore(serverUri, targetExtent);

        }


 


I see that in 4.5 the TiledWMSOverlay now has this method that appears to replace GetRequestUriCore -  virtual Collection<Uri> GetRequestUrisCore(RectangleShape requestExtent);

but I can't override this. Was this an oversight as far as not making this an override method or is there a better way to add parameters to the request now? Thanks.


Chris  



protected



 Hi Christopher,


 


The GetRequstUrisCore method is a virtual method and we can override it.


The following code compiles:


public class MyTiledWmsOverlay : TiledWmsOverlay


{


    protected override Collection<Uri> GetRequestUrisCore(RectangleShape requestExtent)


    {


        //add parameters


        return base.GetRequestUrisCore(requestExtent);


    }


}


 


We replaced the GetRequstUriCore with GetRequestUrisCore because we need to keep different Map Suite products compatible. This seems like a breaking change, but the version 4.0 is a beta version, so it’s not really a breaking change.


 


Hope this will be of help.


 


Regards,


Tsui



Hi Tsui - I did try that I should have been clearer - the issue is that GetRequestUrisCore isn’t getting called. 
  
 Thanks, 
 Chris

 Hi Christopher,


 


We tested the TiledWmsOverlay, but did not succeed in reproducing the issue you reported.


We tested like this:


We wrote a subclass of TiledWmsOverlay:


public class TestTiledWmsOverlay : TiledWmsOverlay


{


    public TestTiledWmsOverlay(IEnumerable<Uri> uris)


        : base(uris)


    { }


 


    protected override Collection<Uri> GetRequestUrisCore(RectangleShape requestExtent)


    {


        var urisFromBase = base.GetRequestUrisCore(requestExtent);


        var uris = new Collection<Uri>();


 


        foreach (var uri in urisFromBase)


        {


            uris.Add(new Uri("thinkgeo.com/"));


        }


 


        return uris;


    }


}


It replaces all the results with the Uri of ThinkGeo.


Then we use this subclass like this:


TestTiledWmsOverlay overlay = new TestTiledWmsOverlay(new Uri[] { new Uri("google.com/"), new Uri("bing.com/") });


var result = overlay.GetRequestUris(new RectangleShape(-180, 90, 180, -90));


If we add a breakpoint here, then we can see the result contains two Uris of ThinkGeo.


So it seems like the override method in the subclass did get called.


 


Is this case similar to your scenario? If not, please let us know more details about how you encountered the problem. It would be ideal if you can provide some sample code that demonstrates the problem you are having.


 


Regards,


Tsui



Tsui I have added a sample project zipped up on on your ftp site which is called WMSWPFClient(12). I am using the same TestTiledWmsOverlay class above and then i am adding that overlay to the overlays collection. The overlay is getting rendered but not correctly because the GetRequestUrisCore is not getting called the way I have it set up - but it worked in the prior version and I can’t seem to find anything about the way the overlay is set up now that would prevent this from getting called. - Actually I just noticed I never changed the code you put in the GetRequestUrisCore function and that will break it if it actually does get called but that’s fine - I should be fine if i can just get this method to be invoked. 
  
 Thanks, 
 Chris

Hi Christopher, 
  
 Thanks for your reporting, we just found out we made a mistake when we were changing the API.  
 We changed the public API to plural, but we are still calling the old private singular method somewhere internally. 
 We’ve fixed this bug, it’ll be available in the next build (version 4.5.0.38 or later). 
  
 We are sorry for the inconvenience.  
 Please let us know if you have any other questions. 
  
 Regards, 
 Tsui

Great. Thanks for your help.


Chris



You are welcome, Christopher. 
 Please let us know if you have any other questions. 
  
 Regards, 
 Tsui