ThinkGeo.com    |     Documentation    |     Premium Support

Google Maps Pink Background

My web-based map application has been working fine for several months using v3.1.16 of MapSuite Web Edition. The map displays a Google Map background with an overlay of a custom shape file. This has been working well for several months.


Within the last week or so the maps are now no longer displayed. All I get is a pink background with a red "X" image in the upper left corner. Any other subsequent ASP.Net AJAX calls on the page result in a server error.


I downloaded the latest release, v3.1.182, and ran it in development mode. When I do this the map control displays a missing background with the text "The remote server returned and error: (403) Forbidden" in each Google Maps tile. My custom shape file displays properly over this background.


Did something change with the Google Maps API that has broken MapSuite? There have been no changes in my code so it has to be something external.


Bob Mc.



Hi Bob, 
  
 What Google map are you using? GoogleOverlay or GoogleMapsLayer? Could you please try to make a simple sample to see whether is works? If not, please send the sample to us so that we can check it for you. 
  
 Any questions please let me know. 
  
 Thanks, 
 Howard

I'm using a GoogleMapsLayer. Will try to put together a small sample that recreates the problem.


However, here is the initialization code for the map control, which is in an ASP.Net web control that is then placed on the page:



ctlDirMap.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"))
ctlDirMap.CurrentExtent = New RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962)
ctlDirMap.MapUnit = GeographyUnit.Meter
ctlDirMap.MapTools.Logo.Enabled = False
ctlDirMap.MapTools.PanZoomBar.Enabled = True

'Create the google map overlay
Dim googleMap As New GoogleMapsLayer("Google Map")
If ConfigurationManager.AppSettings("googleMapKey") IsNot Nothing Then
    googleMapKey = ConfigurationManager.AppSettings("googleMapKey")
End If
googleMap.LicenseKey = googleMapKey
googleMap.MapType = GoogleMapsMapType.RoadMap
ctlDirMap.StaticOverlay.Layers.Add(googleMap)
ctlDirMap.StaticOverlay.ClientCache.CacheId = "GoogleMapCache"
ctlDirMap.StaticOverlay.ClientCache.Duration = TimeSpan.FromDays(1)


Further information:


It appears to be a problem with the GoogleMapsLayer object. If I use a GoogleOverlay object the problem does not occur. Here is the snippet of code that I used to test this theory



Imports ThinkGeo.MapSuite.Core
Imports ThinkGeo.MapSuite.WebEdition

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            ctlMap.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"))
            ctlMap.CurrentExtent = New RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962)
            ctlMap.MapUnit = GeographyUnit.Meter
            ctlMap.MapTools.Logo.Enabled = False
            ctlMap.MapTools.PanZoomBar.Enabled = True

            'Using Google API string from ThinkGeo samples - we have our own for production
            Dim googleMapKey As String = "maps.google.com/maps?file=api&v=2&key=ABQIAAAAoxK_HcqphMsnUQHEwLwHlRSavkNJi0NVTgm4UDidoiIU5dUJpRQW88FufPCp0aTPraxZgZFAIUHn3Q"

            'This doesn't work - causes "The remote server returned an error: (403) Forbidden"
            'Dim googleMap As New GoogleMapsLayer("Google Map")
            'googleMap.LicenseKey = googleMapKey
            'googleMap.MapType = GoogleMapsMapType.RoadMap
            'ctlMap.StaticOverlay.Layers.Add(googleMap)
            'ctlMap.StaticOverlay.ClientCache.CacheId = "GoogleMapCache"
            'ctlMap.StaticOverlay.ClientCache.Duration = TimeSpan.FromDays(1)

            'This works
            Dim googleLayer As New GoogleOverlay("Google Map")
            googleLayer.JavaScriptLibraryUri = New Uri(googleMapKey)
            googleLayer.GoogleMapType = GoogleMapsMapType.RoadMap
            ctlMap.CustomOverlays.Add(googleLayer)
        End If
    End Sub
End Class


I recall that I used the GoogleMapsLayer object because I wanted to be able to export a JPEG of the rendered map that included the Google background, and at the time that wasn't possible with the GoogleOverlay object. Is that limitation still in place?


Bob Mc.


 



Bob, 
  
 I have recreated your issue. GoogleOverlay and GoogleMapsLayer is different. GoogleOverlay is using Google JavaScript Library and they response for generating the query string; while GoogleMapsLayer is using Google static API which we response to generate the request string. I guess there may be some reasons for this.  
  
 1, When your map is Multi-Tile and request an image from google, we’ll get a big tile and split a specific area we needed; then transfer back to client. If some tiles are very close together and we attempt to get the same image for several times; Google server may think it’s a virus and forbid us. 
  
 2, Google Static API address may be changed. When I search 403 error on Google, there are a lot of information about it. 
  
 Currently, please try to set the tile to SingleTile temporary. At the mean time, we’ll check the addresses. 
  
 We’ll let you know when we have an update. 
  
 Thanks, 
 Howard

I appreciate the acknowledgement that there is an issue to be addressed. However, I don’t quite understand the suggested workaround. 
  
 Are you suggesting that I convert my code to use GoogleOverlay instead of GoogleMapsLayer? What did you mean by “try to set the tile to SingleTile temporary?” 
  
 If I change to GoogleOverlay (not an insignificant undertaking since my map control is fairly involved) will I lose thea ability to export the map to a JPEG file? 
  
 Bob Mc.

Bob, 



Sorry, Bob. I didn't express my suggestion clearly. I mean you can still use GoogleMapsLayer and set the LayerOverlay to SingleTileType. Here is the code.

Dim googleMap As New GoogleMapsLayer("Google Map")
googleMap.LicenseKey = googleMapKey
googleMap.MapType = GoogleMapsMapType.RoadMap
Map1.StaticOverlay.Layers.Add(googleMap)
Map1.StaticOverlay.TileType = TileType.SingleTile



On the other hand, GoogleOverlay cannot be exported because it generates on the client only. But you still can use GoogleOverlay to display the base map and export it to JPEG with GoogleMapsLayer. The solution is that there a GoogleOverlay which is for displaying; and another LayerOverlay which maintains a invisible GoogleMapsLayer. When you click to export, set the GoogleMapsLayer's visibility to true and it'll be rendered; after rendering, reset the GoogleMapsLayer's visibility to false again; and everything goes back to normal.



Hope it makes sense.



If you have any questions please let me know.



Thanks,

Howard

 



Thanks for you quick reply Howard. 
  
 However, setting the TileType had no effect on the problem, either in the sample code I provided in yesterday’s post or in my production application code. I still receive the “403” error. 
  
 Also, I started trying to convert my application to use GoogleOverlay. Now when I try to display the map I receive a JavaScript error in file “eval code [dynamic]” claiming that “Microsoft JScript runtime error: ‘G_NORMAL_MAP’ is undefined”. Any insight on this? 
  
 I may have to escalate this to a trouble ticket, since it’s causing me problems in production and customers are getting restless. 
  
 Bob Mc. 


Attached is a sample that recreates the "Microsoft JScript runtime error: 'G_NORMAL_MAP' is undefined" problem. I'll post it to the trouble ticket as well.


Bob Mc.


 



1100-ThinkGeo_Google_Map_Issue.zip (115 KB)

Bob, 



I see from your application you are using a tab control in a update panel, and switch to the second tab to show the map. Here is the problem. In web edition, we'll register the JavaScript library for you; but when adding map dynamically, it cannot register the Google library successfully. So we need to register it manually. 



Please open the default.aspx and add the following code in the head tag to fix this issue. 

[script type="text/javascript" src="maps.google.com/maps?file=api&v=2&key=ABQIAAAAoxK_HcqphMsnUQHEwLwHlRSavkNJi0NVTgm4UDidoiIU5dUJpRQW88FufPCp0aTPraxZgZFAIUHn3Q"][/script]



Also we'll keep on tracking the GoogleMapsLayer issue. Please let me know if you have any questions.



Thanks,

Howard



OK, adding the script reference to the head tag corrects the runtime error. Now on to the next problem. 
  
 When the tab is clicked the map now displays properly. However, there is a grid with checkboxes in the user control where the map resides. When I click any of the check boxes a callback is invoked which throws a javascript exception. I trapped the exception in the ScriptManager_AsyncPostBackError event, which reveals the following: 
  
 Index was outside the bounds of the array 
 at ThinkGeo.MapSuite.WebEdition.Map.xd8262f22d29c57d5(String[] x2ad333ebea325bde) 
 at ThinkGeo.MapSuite.WebEdition.Map.x57b61acc3e039aed(String x96adbb16060a076f, NameValueCollection x13e9d0e2d3dc9cb2) 
 at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) 
 at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
  
 Bob Mc.

Hi Bob, 
  
 Could you tell me the version you are using? I think it’s an old bug of web edition which has been fixed.  
  
 Looking forward your feedback. 
  
 Thanks, 
 Howard

This is the version number I copied from the WebEdition.dll file in the bin folder of the application: 
  
 3.1.182.0 
  
 Bob Mc.

Bob,



This version has fixed this bug. Could you double check the version by the following code?
Dim version As String = Map.Version


Also I did a callback test which works fine; please see the attached file.



Please provide me more information how you work if possible.



Thanks,

Howard



1112-CallbackIssue.zip (4.68 KB)

The version returned is "MapSuiteCore:3.1.182;WebEdition:3.1.182".


I'm trying to recreate the index boundary overrun error by recreating part of my larger application, but now I'm getting a different error. When I run the attached application in VS2008 I get a "Microsoft JScript runtime error: 'theForm' is undefined" error. If you can get me past that error I'll try to finish recreating the first error.


Bob Mc.


 



1113-ThinkGeo_Google_Map_Issue.zip (131 KB)

Any update on this? My production maps are now inoperable and customers are complaining. 
  
 Bob Mc

Bob,  
  
 "theForm" error should be the environment problem. You can simply copy the web.config file in to the new project to fix this issue. 
  
 On the other hand, did you try my sample which works fine in my machine. If it works fine please send me your callback sample. 
  
 Thanks, 
 Howard 
  


Howard, 
  
 My apologies for the delay in replying. Got sidetracked. 
  
 I was able to get the sameple running. I clicked on the map and got a dialog box. 
  
 I’m not sure what you meant by “‘theForm’ error should be the environment problem. You can simply copy the web.config file in to the new project to fix this issue.” Can you elaborate? 
  
 Bob Mc.

Bob,  
  
 “theForm” is an object which registered by ScriptManager on the client side. If it doesn’t register successfully, it’ll have that issue. 
  
 I recommend to create a new project and see if there is any problem. Or just copy the web.config from our intalled sample to your application and try again. Or you can send us a simple sample and I’ll figure out a fix. 
  
 Let me know if you have any questions. 
  
 Thanks, 
 Howard

I created a new project and now I get the dreaded "mapParser undefined" issue. I've seen this one before, which requires the workaround of adding six script tags within the form tag on my page, but the problem persists.


I'm posting the sample application here for your review. This is closer to what my application architecture is like, with a master page, content page with tabs, and user control with the map control inside.


Bob Mc.


 



1184-ThinkGeo_mapParser_Undefined_Issue.zip (128 KB)