ThinkGeo.com    |     Documentation    |     Premium Support

GoogleMapOverlay WebProxy does not load map

            I work in an environment where our development machines are not connected to the internet.  We have a separate server set up with Google Map Server in our environment.  I would like to access the Google Map Server from a MapSuite application to display the Google base map for the application.  I have downloaded the "ShapeFileToGoogleMap" sample from the community website for MapSuite.  I modified the code to set the WebProxy URI for our Google Map Server.  The code looks something like that shown below.


            GoogleMapsOverlay googleOverlay = new GoogleMapsOverlay();


            googleOverlay.WebProxy = new System.Net.WebProxy(dev-google-dev.com/default.map);


            googleOverlay.MapType = GoogleMapsMapType.Hybrid;


            winformsMap1.Overlays.Add("googleOverlay", googleOverlay);..


            winformsMap1.Refresh(); 

 


The URI shown above for our Google Map Server displays the Google default map in Internet Explorer but in the sample application it always returns


"WebException was unhandled"


"The remote server returned an error: (404) Not found"


Can you tell me why it will not access the Google Map server using WebProxy? 


I have seen a lot of discussion concerning a "key" that is required to access the google map.   I know nothing of such a key in our own Google Map Server.   How would I go about determining a "key" or "clientId"?


 


Thank you for any assistance you can provide.


 


Richard


 


 



Hi Richard, 
  
 Do you means you have a Google Map server yourself and you want to access that using GoogleMapsOverlay? 
  
 If so, I think that’s not related with WebProxy, when you try to access to Google’s server via a proxy that’s need be set. 
  
 And for GoogleMapsOverlay we default connect to Google’s server, that’s cannot be changed. 
  
 If you own a Google Map server, you can try to connect your server using GoogleMapsLayer. But the API should be the same as Google’s. 
  
 Regards, 
  
 Don

Don,


 


Thank you for the response.


Yes I do mean that we have our own Google Map server in our own lab on an intranet.  We are not allowed to connect to the public internet at this location.


I was not aware of the GoogleMapsLayer.  I only came across the GoogleMapsOverlay and some sample applications using it.  I will attempt to use the GoogleMapLayer.   Hopefully it will be obvious how you reference our own local server.


Thank you for the information. I will let you know how I make out.


Richard


 


 



Richard, 
  
 Thanks for your update. 
  
 Please feel free to let we know your problem. 
  
 Regards, 
  
 Don

Well, I tried GoogleMapLayer but I'm still totally lost.   I don't see anything about GoogleMapLayer that allows me to specify the Google Map Server URI.  If I don't set the WebProxy,  the error is always "Unable to connect to the remote server"  which I assume is trying to find the Google Map Server using the "default" via the  internet. 


If I try to set the WebPrioxy which seems to be the only property that takes a URI, the same error I originally reported occurs "Object reference not set to an instance of an object" on the call to winformsMap1.Refresh.


From Don's statement "And for GoogleMapsOverlay we default connect to Google's server, that's cannot be changed."  it sounds as though I'm out of luck here.  If the server URI cannot be changed, then I don't see how I can use the GoogleMapOverlay.  

 


Any help here is greatly appreciated.


Thanks


Richard


 


 


 


 



Hi Richard, 
  
 Sorry I think our GoogleMapsLayer hard code the “maps.google.com”, and it looks that’s hard to override. 
  
 I think the WebProxy unuseful for your requirement, and here I think maybe we can try like this: 
  
 Just set your intranet server ip to “maps.google.com” in the hosts file of your local machines. 
  
 I am not sure whether that can works for you because I cannot find a intranet google server for test, but I think that should be a workaround, theoretically. 
  
 Locate hosts file: 
 Windows 95/98/Me c:\windows\hosts 
 Windows NT/2000/XP Pro  c:\winnt\system32\drivers\etc\hosts 
 Windows XP Home c:\windows\system32\drivers\etc\hosts 
 (you may need administrator access for Windows NT/2000/XP) 
  
 Add item like this format: 
 192.168.0.100 maps.google.com 
  
 Notice: 
 Our query url in GoogleMapsOverlay always like this: 
 “maps.google.com/maps/api/staticmap?xxxx&xxxx&xxxx” 
 Please make sure the part which need be replaced. 
  
 Regards, 
  
 Don

Don, 
  
 Thanks for the effort.   
  
 I made the entry in the Hosts file as you defined.   I verified that it was indeed using the alias by loading Internet explorer and entering the URI  
  
 maps.google.com/default_map 
  
 This displayed the google map from our intranet server just as the map displayed using the URIs 
  
 192.168.10.111/default_map 
 dev-test.dev.com/default_map 
  
 So I believe that the maps.google.com is being redirected to the intranet server.  However when I attempt to enter any part of the URI above 
  
 maps.google.com/maps/api/staticmap?xxxx&xxxxx&xxxx 
  
 I get the standard HTTP 404 Not Found response.  I guess to me this means that this server does not have the same web service defined or permissions have not been granted to access these web services. 
  
 I do not know how to debug these error messages from the web server nor do I know how to query the google map server.  I believe I am at a dead end on this. 
  
 Thanks for trying. 
  
 Richard 
  


Richard, 
  
 Sorry I cannot help you with your server debug because I don’t know how you create your internal map server. 
  
 But I think you can get the request url like this: 
  
 GoogleMapsLayer googleMapsLayer = new GoogleMapsLayer(); 
             googleMapsLayer.CreatingRequest += new EventHandler<CreatingRequestGoogleMapsLayerEventArgs>(googleMapsLayer_CreatingRequest); 
  
  
 void googleMapsLayer_CreatingRequest(object sender, CreatingRequestGoogleMapsLayerEventArgs e) 
         { 
             string requesturl = e.RequestUri.AbsoluteUri; 
         } 
  
 Then you can test your server directly use the url. 
  
 And I just find maybe you can directly replace your url in this function but not need change the hosts file. 
  
 BTW, I don’t think this related with web service, it looks we just call the url by HttpWebRequest and Google’s map return image file. 
  
 If you need any support please let me know. 
  
 Regards, 
  
 Don

Don,


Thanks againfor your help on this.


Sorry I am so new and inexperienced but I can't figure out how to use your sample code fromthe previous response.  I placed it in the sample application ("ShapeFileToGoogleMap")  but I do not know what is required to get it to fire the "creatingRequest" event.  If I leave the original code in the application which attempts to open the Googe Maps Overlay (or Layer) on the winformsMap control, the same errors above occur about not finding the server.  The event is not called before the exceptions.   If I remove the layer or overlay from the winformsMap, the Application does not error but it still does not reach the event for CreatingRequest..  I  do not know how to get the URI or where it is ecpected to be used.


Richard Styer


 


 



Hi Richard, 

  

You created the "ShapeFileToGoogleMap" project yourself or you meant this project "wiki.thinkgeo.com/wiki/File:DesktopEditionSample_ShapefileToGoogleMap_CS_100609.zip" ? 



Could you make sure that you have close all cache in code? 



What the version of your using dlls? 



I want to test the CreatingRequest event local for you, so I need some of your detail project information. 



Regards, 



Don



Don, 
  
 Yes I was using the  
 "wiki.thinkgeo.com/wiki/File:DesktopEditionSample_ShapefileToGoogleMap_CS_100609.zip"  
 example as sample code to access a google map.   
  
 The DLLs I am using are  
 DesktopEdition.dll  5.0.89.0 
 GeoAPI.dll   1.1.0.0 
 MapSuiteCore.dll  5.0.89.0 
 NetTopologySuite.dll 1.7.3.31740 
 FdoExtensions.dll 5.0.89.0 
  
 These DLLs were from the latest patch build downloaded and installed on 8/10/2011. 
  
 Richard 


Hi Richard, 
  
 Thanks for your information. 
  
 Sorry today I am focus on some other things and cannot get time to handle your question. 
  
 I will work for it tomorrow. 
  
 Regards, 
  
 Don

 Richar,


Don is working the other projects, so I work on this post temporarily for you. Actually the CreatingRequest event will be fired when getting GoogleMaps images, so it will be fired when loading the GoogleMaps layer. Here is my code below:


 



   private void TestForm_Load(object sender, EventArgs e)
        {
            //We need to set the map unit to meter because we are using Google Map Spherical Mercator projection.
            winformsMap1.MapUnit = GeographyUnit.Meter;
           
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 198, 255, 255));

            //Sets Google Map as the background map.
            GoogleMapsLayer googleMapsOverlay = new GoogleMapsLayer();
            googleMapsOverlay.CreatingRequest += new EventHandler<CreatingRequestGoogleMapsLayerEventArgs>(googleMapsOverlay_CreatingRequest);
            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(googleMapsOverlay);
            winformsMap1.Overlays.Add(overlay);

            //Projection to go from Geodetic (Longitude/Latitude) to Google Map projection (Spherical Mercator).
            Proj4Projection proj4 = new Proj4Projection();
            proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); //Geodetic projection (Longitude/Latitude).
            proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();

            ShapeFileFeatureLayer schoolShapeLayer = new ShapeFileFeatureLayer(@"..\..\Data\austinschools.shp");
            schoolShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.StandardColors.Red,GeoColor.StandardColors.Black, 9);
            schoolShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateMaskTextStyle("NAME", new GeoFont("Arial", 10, DrawingFontStyles.Bold), 
            new GeoSolidBrush(GeoColor.StandardColors.Black), new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.LightGoldenrodYellow)), 13, 0);
            schoolShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            //Sets the projection to the shapefile layer.
            schoolShapeLayer.FeatureSource.Projection = proj4;
            
            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("SchoolShapeLayer", schoolShapeLayer);
           
            winformsMap1.Overlays.Add(staticOverlay);

            //Sets the extent of the map as the bounding box of the shapefile layer as projected (Google Map Spherical Mercator).
            schoolShapeLayer.Open();
            winformsMap1.CurrentExtent = schoolShapeLayer.GetBoundingBox();
            schoolShapeLayer.Close();

            winformsMap1.Refresh();
        }

        void googleMapsOverlay_CreatingRequest(object sender, CreatingRequestGoogleMapsLayerEventArgs e)
        {

            string requesturl = e.RequestUri.AbsoluteUri; 
        }
  You can set a breakpoint in the CreatingRequest event and check if it is fired. The event can be fired correctly and return the correct request url, here is the returned URL what I tested below:


maps.google.com/maps/api/staticmap?center=30.449858,-98.087311&zoom=10&size=512x512&maptype=roadmap&format=jpg-baseline&key=&sensor=false


When you used the web proxy to access the GoogleMaps layer you can watch the request URL correctly, the latest version of development branch is 5.0.119.0, there are not any exceptions occurred. Please use the code to try again,


Thanks,


Scott,


 



Scott,


Thank you for your help.


I had just upgraded to a recent build "5.0.118.0" on Friday last week for an entirely different reason (I was looking for the printing classes).


When I updated the sample application with your code, it is indeed firing the event for CreatingRequest.  My uri from the event matches the one you had shown in the bottom of your response.  It fires the event 4 times and each time the uri is as you had shown it.   Then I receive the "WebException was unhandled" with the error detail "The remote server retruned an error: (404) Not Found."  I also tried to use this uri in the address line of Internet Explorer and it also returns the HTTP 404 Not Found error.


I believe that the Google Maps Server in our lab has disabled this URI access or has not installed it to be accessed this way.  I tried to find out how our Google server was created/installed and was told that we had a consultatnt from Google come into our lab to setup the server.  I do not know how to contact this consultant so until my management decides to elevate this issue to Google I doubt that I will be able to resolve this.   This Google Maps server will return the maps when I use the maps.google.com/defaultmap/  but does not recognize any other Uri that I have attempted.  We currently use this Google Maps Server with JavaScript applications.  The JavaScript may be using additional Uri's but I do not know the internals on how it works.


Thanks for all your assistance.


 


Richard


 


I


 


 



 Richard,


 
I see your problem is that you are inside an internal network and blocks the any URLs except the maps.google.com/defaultmap/  url, so it always prompts the 404 error and I think your router blocked the request to Google Map Server. Actually the GoogleOverlay just wraps the GoogleMaps javascript so that the user can use it easily and directly. After the consultant of Google to check the issue out please let me know the result if there are any helps from us, also I think maybe the following two posts can help you, please have a look at them:
 
gis.thinkgeo.com/Support/Dis...fault.aspx
 
gis.thinkgeo.com/Support/Dis...fault.aspx
 
Thanks,
 
Scott,