ThinkGeo.com    |     Documentation    |     Premium Support

Adding in GoogleMapsOverlay

I have a program using shapefiles in WRS 1980.  I want to be able to add in a GoogleMapsOverlay.  I could not find a good example of how to do this.  I am using MapSuite Desktop 3. 


All I am looking for is a simple way to be able to add Google Maps into our program so that the user can find missing/incorrect roads in our own data.  


Thanks.


Elisa



Did you mean WGS 84, the standard projection reference for most modern geographic data? en.wikipedia.org/wiki/WGS84 If yes, I would point you out to some projects in the Code Community that deals to problem similar to what you are facing with lining up data with GoogleMapOverlay:


code.thinkgeo.com/projects/show/gpstogoogledesktop


code.thinkgeo.com/projects/show/shapefiletogooglemap


If you still meant "WRS 1980", please give us info on that projection as I am not familiar with that. And with the shapefile attched, it would help. Thank you.


 


 


 


 



Thanks for the input. 
  
 code.thinkgeo.com/projects/show/shapefiletogooglemap 
  
 I implemented the code from 
  
 and now every time I zoom in, I get the following error: 
 The remote server returned an error: (403) Forbidden. 
  
 What am I missing? 
  
 Elisa

Elisa, 
  
 Thanks for your post and questions. 
  
 This problem is thrown out by the Google Map Server when we are requesting tiles from Google Sever. Normally, there are two possible reasons for this exception, please try to have a check: 
 1) Network is not stable, for example, when you are using the wireless network in your application environment. The exception will be thrown when the network is off. 
 2) The server seems have set some limitations to the unlicensed user, only 1000 tiles are permitted to get from the server for every IP every day. So, if too many tiles are requesting as an unlicensed user, this exception is probably going to be throw out. 
  
 Any more questions just feel free to let me know. 
  
 Thanks. 
  
 Yale 


Yale: 
  
 What I would like to be able to do is: 
 1.  Project my current shapefile into the Google Maps format 
 2.  Have a checkbox whereby the user could turn the GoogleMaps Overlay on and off 
  
 Additionally: 
 How do I get a license for use in the MapSuite?  We have an API license for our web site.  Is this the same type of license?  Additionally, this program is run on our computers in the office, not off of the net.  
  
 Elisa

Yale: 
 I got the checkbox part to work.  However, when I zoom in and out, the shapefile and google maps overlay sometimes don’t line up.  When I zoom to an extent, they are close.  It would appear from there that every other zoomin/zoomout with the mouse wheel or double clicks line up.  Is this a google zoom level issue?  How do I correct for this? 
 Elisa

Yale:


I am attaching my coe of how I am invoking the connection.  I have switched to using a checkbox to toggle the google overlay on and off, and I am still getting the The remote server returned an error: (403) Forbidden error.  I have verified that the network connection is correct, and I have only loaded less than 25 view of the google map overlay.


How do I trap this error, and how to I correct for it?


Elisa




        public GoogleMapsOverlay googleoverlay;

        public InMemoryFeatureLayer highlightDistance;

        public InMemoryFeatureLayer highlightPoint;

        public InMemoryFeatureLayer highlightNext;

        public InMemoryFeatureLayer highlightLine;

        public InMemoryFeatureLayer highlightAdd;

        public InMemoryFeatureLayer highlightRemove;

        public ShapeFileFeatureLayer roadsLayer;

        public ShapeFileFeatureLayer highwayLayer;

        public ShapeFileFeatureLayer resourceLayer;

        public ShapeFileFeatureLayer errorLayer;

        public GoogleMapsOverlay googleMapsOverlay;

        public RectangleShape backExtent = new RectangleShape();

        public RectangleShape roadextent = new RectangleShape();


        public void LoadLayers()

        {

            //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.

            googleMapsOverlay = new GoogleMapsOverlay();

            googleMapsOverlay.MapType = GoogleMapsMapType.Hybrid;

            winformsMap1.Overlays.Add("google",googleMapsOverlay);



            //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.BuildIndexFile(shapedir + "\\" + roadfile, shapedir + "\\" + roadfile.Replace(".shp", ".idx"),

                                  "MAPVIEW", "OTHER", BuildIndexMode.Rebuild);

            ShapeFileFeatureLayer.BuildIndexFile(shapedir + "\\" + viewfile, shapedir + "\\highway.idx", 

                                  "MAPVIEW", "HWY", BuildIndexMode.Rebuild);

            ShapeFileFeatureLayer.BuildIndexFile(shapedir + "\\" + viewfile, shapedir + "\\resource.idx",

                                  "MAPVIEW", "RESOURCE", BuildIndexMode.Rebuild);

            roadsLayer = new ShapeFileFeatureLayer(shapedir + "\\" + roadfile, shapedir + "\\" + roadfile.Replace(".shp", ".idx"),ShapeFileReadWriteMode.ReadWrite);

            roadsLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.MediumBlue, 2, false));

            roadsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            roadsLayer.FeatureSource.Projection = proj4;



            highwayLayer = new ShapeFileFeatureLayer(shapedir + "\\" + viewfile, shapedir + "\\highway.idx");

            highwayLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Black, 3, false));

            highwayLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            highwayLayer.FeatureSource.Projection = proj4;



            resourceLayer = new ShapeFileFeatureLayer(shapedir + "\\" + viewfile, shapedir + "\\resource.idx");

            resourceLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.DarkGray, 1, false));

            resourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            resourceLayer.FeatureSource.Projection = proj4;



            ShapeFileFeatureLayer.BuildIndexFile( shapedir + "\\errors.shp", shapedir + "\\errors.idx",BuildIndexMode.Rebuild);

            errorLayer = new ShapeFileFeatureLayer(shapedir + "\\errors.shp", ShapeFileReadWriteMode.ReadWrite);

            errorLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Red), new GeoPen(GeoColor.StandardColors.Black), 6);

            errorLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level10;

            errorLayer.ZoomLevelSet.ZoomLevel11.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Red), new GeoPen(GeoColor.StandardColors.Black), 8);

            errorLayer.ZoomLevelSet.ZoomLevel11.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level13;

            errorLayer.ZoomLevelSet.ZoomLevel14.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Red), new GeoPen(GeoColor.StandardColors.Black), 10);

            errorLayer.ZoomLevelSet.ZoomLevel14.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            errorLayer.FeatureSource.Projection = proj4;



            highlightLine = new InMemoryFeatureLayer();

            highlightLine.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Green, 5, false);

            highlightLine.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightAdd = new InMemoryFeatureLayer();

            highlightAdd.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Blue, 6, false);

            highlightAdd.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightRemove = new InMemoryFeatureLayer();

            highlightRemove.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Red, 6, false);

            highlightRemove.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightPoint = new InMemoryFeatureLayer();

            highlightPoint.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Green), new GeoPen(GeoColor.StandardColors.Black), 11);

            highlightPoint.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightDistance = new InMemoryFeatureLayer();

            highlightDistance.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Orange), new GeoPen(GeoColor.StandardColors.Black), 6);

            highlightDistance.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightNext = new InMemoryFeatureLayer();

            highlightNext.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Orange, 4, false);

            highlightNext.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            staticOverlay.Layers.Add("roads", roadsLayer);

            staticOverlay.Layers.Add("highway", highwayLayer);

            staticOverlay.Layers.Add("resource", resourceLayer);

            staticOverlay.Layers.Add("errors", errorLayer);

            highlightOverlay.Layers.Add("HighlightNext", highlightNext);

            highlightOverlay.Layers.Add("HighlightPoint", highlightPoint);

            highlightOverlay.Layers.Add("HighlightLine", highlightLine);

            highlightOverlay.Layers.Add("HighlightAdd", highlightAdd);

            highlightOverlay.Layers.Add("HighlightRemove", highlightRemove);

            highlightOverlay.Layers.Add("HighlightDistance", highlightDistance);



            winformsMap1.Overlays.Add(staticOverlay); winformsMap1.Overlays.Add(highlightOverlay);

            //Sets the extent of the map as the bounding box of the shapefile layer as projected (Google Map Spherical Mercator).

            roadsLayer.Open(); roadextent = roadsLayer.GetBoundingBox(); roadsLayer.Close();

            winformsMap1.CurrentExtent = roadextent;

            backExtent = roadextent;

            winformsMap1.Overlays.Remove(googleMapsOverlay);

            winformsMap1.Refresh();

        }


        private void ckbGoogle_Click(object sender, EventArgs e)

        {

            if (ckbGoogle.Checked == true)

            {

                ckbGoogle.Text = "Remove Google Maps Overlay";

                winformsMap1.Overlays.Add("google", googleMapsOverlay);

                winformsMap1.Overlays.MoveToBottom(winformsMap1.Overlays.IndexOf(googleMapsOverlay));

                winformsMap1.Refresh();

            }

            else

            {

                ckbGoogle.Text = "Add Google Maps Overlay";

                winformsMap1.Overlays.Remove( googleMapsOverlay);

                winformsMap1.Refresh();

            }

        }





Ellisa,


I am sorry to say that I cannot read your code pasted clearly. Could you do that again? I think when you paste code, you have to replace the <> into other symbol like[], otherwise it will cause some problem.


Just make sure, are you using the following constructor with privateKey passed in? This privateKey should be from Google service.



public GoogleMapsOverlay(string cacheDirectory, string clientId, string privateKey)
public GoogleMapsOverlay(string cacheDirectory, string clientId, string privateKey, WebProxy webProxy)

Any more information would be appricated.


Thanks.


Yale

 



Yale:


How do I get a key from Google?  We have a key for the API for our website, but this program is running on the computers in our office, not on the web.  I tried using that key, but it made no difference - I still go the same error.


Below is the code:


        public GoogleMapsOverlay googleoverlay;

        public InMemoryFeatureLayer highlightDistance;

        public InMemoryFeatureLayer highlightPoint;

        public InMemoryFeatureLayer highlightNext;

        public InMemoryFeatureLayer highlightLine;

        public InMemoryFeatureLayer highlightAdd;

        public InMemoryFeatureLayer highlightRemove;

        public ShapeFileFeatureLayer roadsLayer;

        public ShapeFileFeatureLayer highwayLayer;

        public ShapeFileFeatureLayer resourceLayer;

        public ShapeFileFeatureLayer errorLayer;

        public GoogleMapsOverlay googleMapsOverlay;

        public RectangleShape backExtent = new RectangleShape();

        public RectangleShape roadextent = new RectangleShape();





        public void LoadLayers()

        {

            //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.

            googleMapsOverlay = new GoogleMapsOverlay();

            googleMapsOverlay.MapType = GoogleMapsMapType.Hybrid;

            winformsMap1.Overlays.Add("google",googleMapsOverlay);



            //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.BuildIndexFile(shapedir + "\\" + roadfile, shapedir + "\\" + roadfile.Replace(".shp", ".idx"),

                                  "MAPVIEW", "OTHER", BuildIndexMode.Rebuild);

            ShapeFileFeatureLayer.BuildIndexFile(shapedir + "\\" + viewfile, shapedir + "\\highway.idx", 

                                  "MAPVIEW", "HWY", BuildIndexMode.Rebuild);

            ShapeFileFeatureLayer.BuildIndexFile(shapedir + "\\" + viewfile, shapedir + "\\resource.idx",

                                  "MAPVIEW", "RESOURCE", BuildIndexMode.Rebuild);

            roadsLayer = new ShapeFileFeatureLayer(shapedir + "\\" + roadfile, shapedir + "\\" + roadfile.Replace(".shp", ".idx"),ShapeFileReadWriteMode.ReadWrite);

            roadsLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.MediumBlue, 2, false));

            roadsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            roadsLayer.FeatureSource.Projection = proj4;



            highwayLayer = new ShapeFileFeatureLayer(shapedir + "\\" + viewfile, shapedir + "\\highway.idx");

            highwayLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Black, 3, false));

            highwayLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            highwayLayer.FeatureSource.Projection = proj4;



            resourceLayer = new ShapeFileFeatureLayer(shapedir + "\\" + viewfile, shapedir + "\\resource.idx");

            resourceLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.DarkGray, 1, false));

            resourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            resourceLayer.FeatureSource.Projection = proj4;



            ShapeFileFeatureLayer.BuildIndexFile( shapedir + "\\errors.shp", shapedir + "\\errors.idx",BuildIndexMode.Rebuild);

            errorLayer = new ShapeFileFeatureLayer(shapedir + "\\errors.shp", ShapeFileReadWriteMode.ReadWrite);

            errorLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Red), new GeoPen(GeoColor.StandardColors.Black), 6);

            errorLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level10;

            errorLayer.ZoomLevelSet.ZoomLevel11.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Red), new GeoPen(GeoColor.StandardColors.Black), 8);

            errorLayer.ZoomLevelSet.ZoomLevel11.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level13;

            errorLayer.ZoomLevelSet.ZoomLevel14.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Red), new GeoPen(GeoColor.StandardColors.Black), 10);

            errorLayer.ZoomLevelSet.ZoomLevel14.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            errorLayer.FeatureSource.Projection = proj4;



            highlightLine = new InMemoryFeatureLayer();

            highlightLine.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Green, 5, false);

            highlightLine.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightAdd = new InMemoryFeatureLayer();

            highlightAdd.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Blue, 6, false);

            highlightAdd.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightRemove = new InMemoryFeatureLayer();

            highlightRemove.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Red, 6, false);

            highlightRemove.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightPoint = new InMemoryFeatureLayer();

            highlightPoint.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Green), new GeoPen(GeoColor.StandardColors.Black), 11);

            highlightPoint.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightDistance = new InMemoryFeatureLayer();

            highlightDistance.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle,

                new GeoSolidBrush(GeoColor.StandardColors.Orange), new GeoPen(GeoColor.StandardColors.Black), 6);

            highlightDistance.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            highlightNext = new InMemoryFeatureLayer();

            highlightNext.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Orange, 4, false);

            highlightNext.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



            staticOverlay.Layers.Add("roads", roadsLayer);

            staticOverlay.Layers.Add("highway", highwayLayer);

            staticOverlay.Layers.Add("resource", resourceLayer);

            staticOverlay.Layers.Add("errors", errorLayer);

            highlightOverlay.Layers.Add("HighlightNext", highlightNext);

            highlightOverlay.Layers.Add("HighlightPoint", highlightPoint);

            highlightOverlay.Layers.Add("HighlightLine", highlightLine);

            highlightOverlay.Layers.Add("HighlightAdd", highlightAdd);

            highlightOverlay.Layers.Add("HighlightRemove", highlightRemove);

            highlightOverlay.Layers.Add("HighlightDistance", highlightDistance);



            winformsMap1.Overlays.Add(staticOverlay); winformsMap1.Overlays.Add(highlightOverlay);

            //Sets the extent of the map as the bounding box of the shapefile layer as projected (Google Map Spherical Mercator).

            roadsLayer.Open(); roadextent = roadsLayer.GetBoundingBox(); roadsLayer.Close();

            winformsMap1.CurrentExtent = roadextent;

            backExtent = roadextent;

            winformsMap1.Overlays.Remove(googleMapsOverlay);

            winformsMap1.Refresh();

        }



        private void ckbGoogle_Click(object sender, EventArgs e)

        {

            if (ckbGoogle.Checked == true)

            {

                ckbGoogle.Text = "Remove Google Maps Overlay";

                winformsMap1.Overlays.Add("google", googleMapsOverlay);

                winformsMap1.Overlays.MoveToBottom(winformsMap1.Overlays.IndexOf(googleMapsOverlay));

                winformsMap1.Refresh();

            }

            else

            {

                ckbGoogle.Text = "Add Google Maps Overlay";

                winformsMap1.Overlays.Remove( googleMapsOverlay);

                winformsMap1.Refresh();

            }

        }



Thanks.


Elisa



Elisa,


Thanks for your code; I noticed that when Google Overlay was created, no private key was passed in. That is what I was talking as an unlicensed free user instead of a premier user. Probably you need to contact Google service to see how to get into a premier user, for more details see following website:
code.google.com/apis/maps/documentation/premier/
 
Following code community show how to use the Google Map which should work fine if no limitations were set, could you download it and have a run against it?
code.thinkgeo.com/projects/s...ogooglemap
 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale

Yale:


I am now using v4 of MapSuite.


In the API it lists:


public GoogleMapsLayer(string cacheDirectory, string clientId, string privateKey)


Do you have an example of how to implement this (shapefiletoGooglemap rewritten using this)?  I am unclear about the cacheDirectory.


Thanks.


Elisa



Elisa,


Thanks for your post.


Following code snippet shows how to use the privateKey to construct GoogleMapsLayer or GoogleMapsOverlay.



GoogleMapsLayer googleMapLayer = new GoogleMapsLayer(@"C:\temp", "GoogleCaches", privateKey);
GoogleMapsOverlay googleMapsOverlay = new GoogleMapsOverlay(@"C:\temp","GoogleCaches",privateKey);

The cacheDirectory and clientId passed into the constructor will form a directory to store those tiles from Google Map Services, after those tiles cached in local directory, we can use it offline. For example, in the code snippet, we should found tiles in the directory “C:\temp\GoogleCaches”.


We provided 2 classes to consume the Google Map, one is GoogleMapsOverlay used in DesktopEdition , the other is GoogleMapsLayer designed to be used in Service Edition, also GoogleMapsLayer can be used in DesktopEdition.

Any more questions just feel free to let me know.


Thanks.


Yale

 



Yale: 
  
 I am still uncertain about the privateKey.  We have a key for the Google Maps API.  Is this the same thing?  This one was free.  From what I have found, the clientID and its key for Google Maps Premier is not free.  We don’t want to go down the path of purchasing the key and then finding out it has not fixed the problem (error 403). 
  
 I added the code and created the required directory (c:\temp\GoogleCache).  After running the program the director is empty.  It this what is supposed to happen? 
  
 I guess what I am really looking for is a full explanation of: 
 1.  privateKey - what version of Google Maps API this refers to (the free one(s) or the purchased Google Maps Premier) 
                          If it is the purchased one, this really should be clearly stated in the MapSuite documentation. 
 2.  clientID - again what version of the Google Maps API does this refer to 
 3.  what version of the Google Maps API MapSuite connects to (Google Maps API, Google Static Maps API, etc.) 
 4.  how many tiles make up a map at a given zoom level.  This is necessary in calculating the daily maximum 
 5.  how and when are files written to the cache directory, and how can they be used later. 
  
 From the Forum I am not the only developer to run into this.  If the daily maximum is so easy to reach, perhaps this 
 should again be more clearly stated in the MapSuite documentation. 
  
 I appreciate your assistance with this. 
  
 Elisa

 


Elisa,
 
The client id  and private key is be used when you are the premier user of GoogleMap. The Google Maps API is useless for GoogleMapsLayer and GoogleMapsOverlay, because they both refer to Google Static Map API.
 
From the sample code, the cache directory should be “c:\temp”, you can find cached image at sub-folders of it, the sub folder’s name is numbers, it couldn’t be “GoogleCache”.
 
I found some official documents for your first two questions, I think they are better than my words because they’re from Google which create API name,
1.Private key:  the following link is about what is Private Key
code.google.com/apis/maps/documentation/webservices/#GettingKeys
2.client id: the following link is about what is Client ID.
code.google.com/apis/maps/documentation/premier/guide.html#Signup
3. MapSuite has many products connect to Google Map, ServicesEdition, DesktopEdition, WpfEdition, SliverlightEdition use Google Static Map API, WebEdition use Google Maps API.
4. how many tiles for each zoom level is depending on your map width and height in pixel and what size of tiles you set. Default, the size of tile is 256*256, so if your map size is 800*600, it could be 4*3 tiles or 4*4, 5*4 whatever fit all tiles inside your map.
5. When you play the map, it will change the extent and then get image of this extent to draw on the screen, so it will check if there is any cached image for this extent, if no it will request image from Google server and then save to cached folder, it yes, it will get image from disk and doesn’t request from server.
 
I think the daily maximum is controlled by Google, we don’t know if Google will change its policy whenever, we just follow Google’s document to create new API which can let users use Google Map integrate to our Map control, everything if you are not sure, you can find it at Google documentation, to solve the problem that we lack of documentation, we already have a plan for a big project to make user have another way to understand our products.
 
Please let me know if you have more question or someone you still not sure.
Thanks
 
James