ThinkGeo.com    |     Documentation    |     Premium Support

403 Forbidden error with Google Map server

 continuing this from earlier thread.


Ref: gis.thinkgeo.com/Support/Dis...fault.aspx


single tile mode does reduce the problem, I'm guessing because I do not hit the 1k tile limit as quick since I'm not pre-fetching tiles. Which license would I need to allow more tile fetches? Does it require the expensive Premier license or would the Google Earth Pro license work for the Static Maps API?



It seems I’m getting these errors before I even hit the 1000 tile limit. For some reason the API does not seem to be handling the server errors gracefully. It seems that when Map Suite receives an error back it gets stuck and no longer attempts to fetch tiles. Why not handle the error by requesting the tile again or ignoring it, instead it seems to just get stuck.

 


Hi Ben,
In fact, the tile limit has nothing to do with the Google Earth Pro license; it requires the Premier license to remove the 1k tiles limit.
As for your second concern, firstly, if you care about the requests for tiles made for Google Map, you can handle the DrawTile event or the DrawingTile event in your application, it will be rose for each time a tile is drawn or begin to be drawn, secondly, I can tell you that MapSuite handles tile requests in multiple threads, one tile doesn’t have effect on others. Somehow, if one of the requests made is considered illegal by Google Map, the server will block other requests for a while. So either ignoring the error or request again immediately doesn’t help much in this case.
Thanks for your advice, further questions please let me know.
James

I'm attaching my evaluation code in hopes that you can find some area where I'm going wrong.  The code is short so if you could please just look and let me know if the error is on my part that would be great!


Thanks


Ben



MapSuite.xaml.cs (11.4 KB)
MapSuite.xaml (1.8 KB)

 I'm certain this is a throttling issue on Googles end. I feel like Google has set a request/second limit and the MapSuite control is requesting data too fast causing further request to get rejected for a set period of time. My question is, would a Premier license from Google lift this throttle limit? If not, is there any way to add request throttling when using Google overlay in MapSuite?



Ben,  
  
 I was not able to download your .cs files to take a look at your code. You will need to zip it up before it attaching it to the post.

 


Hi Ben,
Sorry for the late response.
Glad to hear that you’ve found the reason for your issue. Frankly speaking, I’ve never tested the throttling issue with the Google Maps API Premier License, I’m afraid I can’t be of more help on this issue. Somehow, you can control the tiling request easily by handling the DrawingTile event of the LayerOverlay that GoogleMapsLayer is added to, since each tile is requested after this event is raised, you can add a counter and timer in your application, in order to get the tile count requested during the timer’s interval. If the count is beyond the tiling request limit you set in the program during this interval, you can stop the current thread for a while to avoid the requests being considered as a potential attack to the Google Maps API Server.
Further questions please let me know
Thank you very much.
James

I've tried what you suggested, but this does not always work.  I am also handing the zoom event since this would also cause request to be sent. Here is my test code:


 



private void LoadGoogleMapOverlay(Int32 zoomLevel, RectangleShape recShape)
{
//add the Google Map overlay
        map1.MapUnit = GeographyUnit.Meter;
        map1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 0, 0, 66));            

        map1.MapZoomed += OnMapZoom;

ExtendedGoogleMapOverlay gLayer = new ExtendedGoogleMapOverlay();
        
gLayer.MapType = GoogleMapsMapType.Hybrid;
        gLayer.CacheDirectory = @"C:\MapImages";
        gLayer.TransitionEffect = TransitionEffect.Stretch;
        gLayer.DrawingExceptionMode = DrawingExceptionMode.ThrowException;

        gLayer.DrawingTile += OnTileDrawing;
.
.
.
}

private void OnTileDrawing(object sender, DrawingTileTileOverlayEventArgs e)
{
CheckTileFetchAvailable();
}

private void OnMapZoom(object sender, MapZoomEventArgs e)
{
    CheckTileFetchAvailable();
}

private void CheckTileFetchAvailable()
{
    lock(_LastTileFecthLock)
    {
//Google allows 5 request/second free license and 10 request/second premier license
        while((DateTime.Now - _LastTileFetchTime).TotalMilliseconds <= 300)
        {
            Thread.Sleep(10);
        }
        _LastTileFetchTime = DateTime.Now;
    }
}

 This test code above did not solve the problem. It seems as if the tile request is being sent before the DrawingTile event is fired. The ideal solution to this problem would be to receive an event just before the actual request to the server is sent. Would it be possible for an event to be added which would fire before the tile request is sent so that we could perform throttling?



 


Hi Ben,
If you want to control the request before it being sent precisely, you can handle another event, that’s RequestCreating event of GoogleMapsLayer. This event is raised exactly before each tile is requested.
It will be more accurate than handling TileDrawing event to handle this event, since TileDrawing event is raised actually before the tile is to be drawn (that’s after the tile requested is sent back from the server).
Further questions please feel free to let me know.
Thanks.
James

Is there a way to get to the GoogleMapsLayer from the GoogleMapsOverlay?

 


Ben,
For now, GoogleMapsOverlay is almost a wrapper for GoogleMapsLayer, and it’s got some performance issue. We’re trying to improve it, so we can’t expose the GoogleMapsLayer of it at the moment, in order to avoid breaking change in future.
Here I advise you to try to use GoogleMapsLayer, add the layer to an instance of LayerOverlay, and then add the Overlay to the Map control, just that simple.
Thanks.
James

Found a working solution for this problem ?



Hi Martin, 
  
 Currently this issue hasn’t been fixed. Sorry for the inconvenience, please keep an eye on this thread, will let you know if we have any progress. 
  
 Regards, 
  
 Ivan

Bumping here again, any chance this will be sorted in upcoming may release ?


 


Big issue for us evaluating map suite.


 


/Martin



Hi Martin, 
  
 Thank you for your attention on ThinkGeo products. This issue has been added to our issue list but we’re preparing the May Main Release, hopefully we’ll fix it in the near future. 
  
 Regards, 
  
 Ivan

Found a working solution for this problem so far in version 5 even?

Amila, 
  
 I think the problem is still existing in V5. 
  
 Sorry for inconvenience. 
  
 James

Is this problem now resolved? I get the 403 error all the time in V6

Phil, 
  
   Just to be clear on this the problem exists on the Google side of things.  We have customer using this with a paid license key and there are no issues.  In talking with people who work more closely with Google Maps licensing than we do there seems to be in inequality to using their JavaScript client, as our Web Edition does, as opposed to their web API.  The inequality is that on the JavaScript client side it seem like you get a nearly unlimited number of free tiles while on the web API it throttles the heck out of you.   
  
   We have no control or visibility into the throttling mechanism and it may have changed over time and could change at any moment.  Reading various articles over time I think Google has had licensing issues with the and has been required to tighten the data access.  I know that the 1,000 tile limit floating around is not a straightforward 1,000 limit per day but a heuristically and time based throttling from some test we did a few eyars back.  The problem is that as you think you figured it out they can change it and they don’t publish anything related to when it fails.  I am confident that the way we are using the Google web API is correct and I believe this is a tactic by Google to promote web based application over desktop ones.  In any event I do not believe there is anything we can do and I don’t want to give you a false ideas that with some code changes we will have a trial key version that work unlimited or to your expectation of what Google could provide. 
  
   Having said all of that we have had great success using OpenStreetMap maps as well as Bing Maps.  It seems like both of these third parties are more developer focused and user unlimited or very liberal limits while testing.  I suggest you try one of these vendors for raster imagery. 
  
 David

David, 
  
 Thanks for your in-depth reply. According to the google website, both the static and javascript API’s have the same limits: 
  
 developers.google.com/maps/faq#usage_pricing 
  
 What is this 1000 tile limit? 
  
 I have also tried adding an API key to the current version so I can monitor my tile requests but cant get this working. Do i use the clientID or PrivateKey property? 
  
 thanks 
  
 Phil