ThinkGeo.com    |     Documentation    |     Premium Support

Google Maps Enterprise

Hello,



I am having a very difficult time trying to figure out how to implement Map Suite with our Google Maps Enterprise license.  I have combed through the forums trying some of the suggested methods, to no avail.  I know that Google has made some changes to their API recently and I’m wondering if that could be part of the problem.



We are created our map in the controller and passing it as the model with the view.  This works perfectly when we create a standard GoogleMapsLayer.






map.MapUnit = GeographyUnit.Meter;

 
GoogleOverlay googleOverlay = new GoogleOverlay(“Google”, GoogleMapType.Hybrid);
googleOverlay.IsBaseOverlay = true;
googleOverlay.IsVisibleInOverlaySwitcher = true;
               
map.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);
map.CustomOverlays.Add(googleOverlay);
 
map.Width = 820;
map.Height = 400;
 
return View(map);

However, we get a (403) Forbidden error when we try to user our CientId and our PrivateKey.




map.MapUnit = GeographyUnit.Meter;
  
GoogleOverlay googleOverlay = new GoogleOverlay(“Google”);
googleOverlay.IsBaseOverlay = true;
googleOverlay.IsVisibleInOverlaySwitcher = true;
 
GoogleMapsLayer googleLayer = new GoogleMapsLayer();
googleLayer.ClientId = “{OUR_CLIENTID}”;
googleLayer.PrivateKey = “{OUR_KEY}”;
googleLayer.MapType = GoogleMapsMapType.Hybrid;
googleOverlay.Layers.Add(googleLayer);
                
map.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);
map.CustomOverlays.Add(googleOverlay);
  
map.Width = 820;
map.Height = 400;
  
return View(map);

With the new Google Static Maps API, a signature must be generated and sent with the ClientId, so the PrivateKey is not used as a parameter.  I followed the tutorial, provided by Google, to create a signature from the PrivateKey using HMAC-SHA1 encryption.  Using our ClientId and signature as parameters on a static map url, I was able to obtain a response so I know they are correct.  Has the MapSuite API been updated to allow for this signature parameter or is your API decoding and encoding the PrivateKey for the signature? What is the proper way to integrate Google Maps Enterprise with MapSuite?



Thanks in advance for any insight you can provide!






Hi Travis, 
  
 Here I found a post looks with the same problem thinkgeo.com/forums/MapSuite/tabid/143/aft/11809/Default.aspx 
  
 Troy said it should have been fixed after 194 daily build package. 
  
 Could you please download latest daily build package and let us know whether that works for you? 
  
 Regards, 
  
 Don

Hi Don,



Thank you for your reply and I apologize for the delay in getting back to you.  I did download the latest build and tried that but didn’t have any luck.  Any other thoughts?

Hi Travis, 
  
 Thanks for update this, could you please add a function SendingWebRequest like this: 
  
 googleMapsLayer.SendingWebRequest += new EventHandler<SendingWebRequestEventArgs>(layer_SendingWebRequest); 
  
 void layer_SendingWebRequest(object sender, SendingWebRequestEventArgs e) 
 { 
             string url = e.WebRequest.RequestUri; 
 } 
  
 You can read the link I mentioned in floor 2 for some more information. 
  
 If you get this url, you can copy it to browser and make sure whether it can directly get the tile succeed there. 
  
 If it’s not correct, please send the url to us so we can find the problem in it. 
  
 Regards, 
  
 Don

Hi Don,



We have it sorted out.  For starters, I updated to the 7.0.307.0 dlls.  I then used the following code:




ThinkGeo.MapSuite.MvcEdition.Map map = new ThinkGeo.MapSuite.MvcEdition.Map(“Map1”,
                   new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage),
                   new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage));
 
map.MapUnit = GeographyUnit.Meter;
map.MapTools.MouseMapTool.Enabled = true;
map.MapTools.Logo.Enabled = false;
map.MapBackground = new BackgroundLayer(new GeoSolidBrush(GeoColor.FromHtml("#FFFFFF")));
 
LayerOverlay staticOverlay = new LayerOverlay(“StaticOverlay”);
 
GoogleMapsLayer googleLayer = new GoogleMapsLayer();
googleLayer.ClientId = “gme-[OUR ID]”;
googleLayer.PrivateKey = “[OUR KEY]”;
googleLayer.MapType = GoogleMapsMapType.Hybrid;
staticOverlay.Layers.Add(googleLayer);
 
map.CustomOverlays.Add(staticOverlay);
 
return View(map);

Everything seems to function properly now.



I did notice however that there are a large amount of static maps requested from Google.  In just a few tests I was up to over 2,600 “page views” from Google.  This is going to be an issue in production because an enterprise license grants us 250,000 page views (static map requests).  Is there a better way to be doing this?  Is there a way to use the Google JavaScript API instead of the Static Map API?  I’m wondering if we create the map in the view rather than the controller if it will use the JavaScript API.  



Thanks for your help!




Hi Travis, 
  
 Each tile will request from Google one time, so if you want to reduce request times, please use bigger tile size like 512 x 512 or just use single tile. 
  
 If you want to use Google JavaScript API, please choose GoogleOverlay instead of GoogleMapsLayer. 
  
 GoogleOverlay overlay = new GoogleOverlay(); 
 overlay.JavaScriptLibraryUri = "Your uri"; 
  
 The link should be helpful to generate your uri: 
  
 developers.google.com/maps/documentation/javascript/tutorial?csw=1 
  
 Regards, 
  
 Don

That works perfectly Don, I really appreciate your prompt responses.



Thanks again!

Hi Travis, 
  
 We are glad to hear that works for you. 
  
 Any question please let us know. 
  
 Regards, 
  
 Don