ThinkGeo.com    |     Documentation    |     Premium Support

Does Map Suite Silverlight Work with Google Maps and Bing Maps?

Hi,


I'm trying my first Silverlight project out with Map Suite and have some questions regarding the support of Google Maps as an overlay.


I see some code examples in the How Do I Samples under Overlays Folder called UseGoogleMaps but when I run the How Do I samples I don't see this sample active in the menu on the right so I'm not sure if it's fully supported or not.  Nonetheless I went ahead and tried using the code in the How Do I Samples and got some of it working but with some of the issues below:


When I use the client side GoogleOverlay it sort of works but I get a Google logo for each tile instead of once in the lower right corner.


I then tried to using the GoogleMapsLayer object on the Server side and addomg it to the SilverlightMapConnector and using it, this seemed to work better once I changed it to SingleTile mode but the Google Logo was showing up randomly on the map instead of in the lower right corner.  Also the speed seemed very slow compared to the Map Suite Web Edition support for Google maps and overall I like the Multi Tile better than Single Tile so would rather use that if possible.  Attached is a screen shot of what I mean by the misplaced Google Logo.



With all that said I guess my main question is does Map Suite Silverlight have support for Google Maps?  If so do you have a best practices sample on how to do it?  


Also does the Silverlight Edition have support for Bing Maps?   Ideally in my application I would like to switch back and forth between Google and Bing and then display my shapefile on top of these base maps (I have a question about this too which I will be posting soon :)).


Thanks!


 



 


Clint,
 
We used Google Maps Static API to request images in SilverlightEdition, but in webedition, the Google Maps JavaScript liberary is used. Here are some reasons:
 


        
  1. Google Maps JavaScript liberary can be used to embed Google Maps in your web pages. It uses javascript to validate the “Key” and requires tiles from pre-generated images server, so webEdition is very fast when loading GoogleOverlay, but it’s hard to use it in Silverlight. Firstly, it bases on the HTML DOM instead of Silverlight DOM; Secondly, requiring images and filling them into DOM like “” are built in logic, and it’s hard to modify.

  2.     
  3. Google Maps Static API also let us embed a Google Maps images on your Webpage without requiring JavaScript or any dynamic page loading. You can think it as a webService which just is used to reqiure the map as an image you can display on the page based on URL parameters sent through a standard HTTP request. 


There are two kinds of Licenses, Standard and Premier. Standard user just needs to input a normal “Key” registered at code.google.com/apis/maps/signup.html , and the use is subject to a query limit of 1000 unique(different) image requests per viewer per day. It will be a Google Logo at the right-bottom cornor for each image.  Premier user registered a “Client ID” and “Private Key” from Google can require images without Goolge Logo.
 
The Google Maps Static API requires images from Google data server, which draws the images on the fly, so it will slower than the WebEdition.
 
 
Currently, we don’t support Bing map, but we have added it into our worklist and will work on it in the future. Please keep an eye on our website. 
 
I hope the above can give you an explanation clearly. Any question please let us know, thanks.
 
Johnny

Thanks Johnny,


I think I might have found a way to make the Silverlight Edition work with Bing Maps but I'm having some troubles.


I added a reference to the MicrosoftMapLayerExtension that comes with the Desktop edition to my web application in my Silverlight solution.  Then on the load of the aspx page I do the following code which should create a server side layer for me to then use on the client.


 


 




            if (!Page.IsPostBack)
            {

                ServerLayerOverlay veRoadOverlay = new ServerLayerOverlay("NativeServerWithVERoadMap");
                VirtualEarthLayer veRoadLayer = new VirtualEarthLayer("141151", "46g@Pr5cUv5", "24.124.55.50");
                veRoadLayer.MapType = VirtualEarthMapType.Road;
                veRoadOverlay.Layers.Add(veRoadLayer);
                SilverlightMapConnector1.ServerLayerOverlays.Add(veRoadOverlay);
  }

But when I implement the following code in the Silverlight Client the map is blank.




            ServerLayerOverlay veroadOverlay = new ServerLayerOverlay("NativeServerWithVERoadMap", "SilverlightMapConnector1");
            veroadOverlay.Name = "VE Road (Server Side)";
            veroadOverlay.TileType = TileType.SingleTile;
            
            Map1.Overlays.Add(veroadOverlay);
            Map1.MapTools.OverlaySwitcher.SingleSelectedOverlays.Add(veroadOverlay);



 




Do you think this approach will work?  If so what am I doing wrong?



Thanks!



 


Clint,
 
That’s a good idea. I did a test with the code you post, and all works fine. Please make sure you set the mapUnit as Meter. Below is my test code and screenshot:
 
Server Side:
 


   if (!Page.IsPostBack)
            {
                // Native Server 1
                ServerLayerOverlay veRoadOverlay = new ServerLayerOverlay("NativeServerWithVERoadMap");
                VirtualEarthLayer veRoadLayer = new VirtualEarthLayer("141151", "46g@Pr5cUv5", "218.6.242.108");
                veRoadLayer.MapType = VirtualEarthMapType.Road;
                veRoadOverlay.Layers.Add(veRoadLayer);
                SilverlightMapConnector1.ServerLayerOverlays.Add(veRoadOverlay);
            }



 
Client-side:
 


    Map1.MapUnit = GeographyUnit.Meter;
            Map1.CurrentExtent = new RectangleShape(-10000000, 10000000, 10000000, -10000000);

            ServerLayerOverlay serverLayerOverlay = new ServerLayerOverlay("NativeServerWithVERoadMap", "SilverlightMapConnector1");
            Map1.Overlays.Add(serverLayerOverlay);

            Map1.Refresh();


 
 
Screenshot:

 



 
 
Any question let us know, thanks,
 
Johnny

Thanks Johnny, 
  
 I got my application working with Bing Maps today too, not sure what was going on with it yesterday. 
  
 Now that I have it working the performance seems very slow, I have tried switching between Single Tile mode and MultipleTile mode and Single Tiie seems better but it’s still pretty slow sometimes taking up to 10 seconds to load.  If I use the mouse scroll wheel to zoom in and out it’s so slow that it really bogs down. 
  
 Do you have any suggestions to speed up the performance? 
  
 If not is there any way to but a progress status indicator on top of the map while the user is waiting similar to the web edition?  Currently the map goes blank and the user doesn’t know what happened and may try zooming in and out which will just cause it to take longer. 
  
 Thanks for all your help! 
  


 Clint,


 
The MicrosoftMapLayer assembly uses APIS of Bing Maps Web Service to require tile images, which is much slower than requiring from Bing map cached image server. On the other hand, the process is single thread in MicrosoftMapLayer, so it must wait all the images required, and then draw the images using Map Suite logic on bitmap. It also cost sometime. We will add the Bing map logic in Silverlight with multi-threads. Maybe that will be faster than using MicrosoftMapLayer, anyway, we will have a try in the future. 
 
Please using the ServerCache property of ServerLayerOverlay to speed up performance is a good solution we can choose now. See the code below:
 


ServerLayerOverlay veRoadOverlay = new ServerLayerOverlay("NativeServerWithVERoadMap");
veRoadOverlay.ServerCache.CacheDirectory = @"c:\imageCache";
veRoadOverlay.Layers.Add(veRoadLayer);
 
 

We doesn’t support the loading image for indicator directly, but it allows us to define the custom Overlay inherited from ServerLayerOverlay, which can supply a LoadingCanvas property that can be used add anything we want during requiring images from server. Please try the attached sample.
 
Any question please let us know, thanks.
 
Johnny

1844-ClientSide.zip (1.78 KB)
1845-ServerSide.zip (2.04 KB)