ThinkGeo.com    |     Documentation    |     Premium Support

Google Maps Layer Tile Request Process

I am using a GoogleMapsLayers to draw two types of Google Maps basemaps and had some questions concerning the process that TG uses to get the tiles.  We have noticed that 8 days into the month, we already had a huge amount of hits to our Google Maps account.  We had a couple of users come online and start building their tile caches this past week, but we do not believe it is enough to justify our high numbers of requests.



We are looking to see if we can get an idea of how the GoogleMapsLayers works behind the scenes as we try to track down where our large request amounts are coming from.  We share our API access account through our WPF application and a couple of web applications so we are trying to narrow down all possible sources of excess requests.



The code I am using to create the GoogleMapsLayers is below.  It builds a tile cache for each of our users, and they are usually only in smaller areas so the cache generation should not be too great.  We are only using the Hybrid and Terrain basemaps from Google.  There is a toggle elsewhere in our program to switch them and the tile cache ID.  It does everything very similar to what is below so I didn’t include it.



We are curious if each tile is requested individually or if TG requests an extent’s worth of tiles.  Basically, we would like to know how many requests a typical map view will do.  Also, we are assuming once there is a tile cache built for a particular view, there are not requests going to Google for tiles in that particular view.



Thanks for any info…




’ load in the google maps base layer
Dim googleOverlay As New LayerOverlay
googleOverlay.Name = "GoogleMapsOverlay"
googleOverlay.DrawingExceptionMode = DrawingExceptionMode.DrawException
googleOverlay.TileCache = New FileBitmapTileCache(cacheDirectory)
googleOverlay.TileCache.CacheId = “Terrain”
 
Dim googleLayer As New GoogleMapsLayer
googleLayer.DrawingExceptionMode = DrawingExceptionMode.DrawException

googleLayer.MapType = GoogleMapsMapType.Terrain
googleLayer.TileMode = GoogleMapsTileMode.SingleTile
googleLayer.TileCache = New FileBitmapTileCache(cacheDirectory)
 
'credentials for google account
googleLayer.PrivateKey = "MYKEY"
googleLayer.ClientId = “MYID”
 
'add the google layer to the overlay and the overlay to the map
googleOverlay.Layers.Add(“GoogleMapsLayer”, googleLayer)
WpfMap_Main.Overlays.Add(“GoogleMapsOverlay”, googleOverlay)


Hi Brandon,



I did a test to count how many the request tiles on an extent, but I got the expect result. When I test an extent (-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962) covering the whole US, I got 4*4 tile count and when I check the cached tiles which the count is also 16, all of them can match without the useless tiles. The below is my test code:


Private Sub WpfMap_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        Map1.MapUnit = GeographyUnit.Meter
        Map1.CurrentExtent = New RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962)
 
        Dim googleOverlay As New LayerOverlay
        googleOverlay.Name = “GoogleMapsOverlay”
        googleOverlay.DrawingExceptionMode = DrawingExceptionMode.DrawException
        googleOverlay.TileCache = New FileBitmapTileCache(“C:\temp”, “google”)
 
        Dim googleLayer As New GoogleMapsLayer
        googleLayer.DrawingExceptionMode = DrawingExceptionMode.DrawException
        googleLayer.MapType = GoogleMapsMapType.Terrain
        googleLayer.TileMode = GoogleMapsTileMode.SingleTile
 
        AddHandler googleLayer.SendingWebRequest, AddressOf google_SendingWebRequest
 
        'credentials for google account
        'googleLayer.PrivateKey = “MYKEY”
        'googleLayer.ClientId = “MYID”
 
        'add the google layer to the overlay and the overlay to the map
        googleOverlay.Layers.Add(“GoogleMapsLayer”, googleLayer)
        Map1.Overlays.Add(“GoogleMapsOverlay”, googleOverlay)
 
        Map1.Refresh()
 
    End Sub
 
    Private Sub google_SendingWebRequest(ByVal sender As Object, ByVal e As SendingWebRequestEventArgs)
        Console.Out.WriteLine(e.WebRequest.RequestUri.AbsoluteUri)
    End Sub

Cache folder:









However, I think we can enable the single tile to reduce the request count. With single tile, each view will needs to request only one tile if the tile size is allowed. As the following:


Dim googleOverlay As New LayerOverlay
googleOverlay.TileType = TileType.SingleTile

If the issue persists, please let us know which version you are referring or would you try the new version?

Thanks,

Troy

Btw, with single tile mode, caching the tiles would be not useful any more. 
  


Troy… thanks for the information.  We were wondering if there is another way for the WPF application to request tiles or if the static API version is the only way.  I am not sure if we would be able to request in another manner or not.  I am not sure enough what happens during the drawing process to intercept the static API request and possibly route it via a web request to the JavaScript version of the API.  From what I understand from our talks with Google, using the JavaScript request method is a little more forgiving. 
  
 We understand the single tile mode would request in less requests, but we are looking to keep a cache of tiles in case our collectors are out of a cellular/wifi coverage zone. 
  
 Any suggestions would be great.  Thanks!

Hi Brandon, 
  
 I think if you want to use JavaScript API 3, you should want to modify the request URL in SendingWebRequest event. 
  
 You can get the extent and zoomlevel then build new URL to access JavaScriptAPI library or any other server. 
  
 Wish that’s helpful for you. 
  
 Regards, 
  
 Don

Thanks for the info Don…  I have looked into switching the inner web request around.  However, I am wondering if there is a way to feed back an extent’s tiles rather than single tiles?



Would it be best to raise the OnSentWebRequest event and try to pass in individual tiles or is there a better way to feed multiple tiles into it?  



We are trying to avoid avoid multiple request sessions.  From what I understand, using the static API each time is basically a new session each time, but we might be able to open a session with the JS API and keep the extent’s requests within that session.  So, instead of something like 16 ‘request sessions’ in an extent, it would be 1 ‘request session’.  Hopefully that makes sense.

Hi Brandon, 
  
 We have only two event here, and OnSentWebRequest should be fired many times just the same like SendingWebRequest. 
  
 If you don’t want to fire too many times, I think there are two ways: 
  
 1. Use single tile mode. 
  
 2. Create your web service to get a big tile from Google, then change code in event to get separated tiles from your service. (Or save a big tile in disk and split that manual) But it’s not easy to implement I think. 
  
 Wish that’s helpful. 
  
 Regards, 
  
 Don