ThinkGeo.com    |     Documentation    |     Premium Support

Save google map background in an image

is it possible to save the google map background in an image? i tried to reproduce the sample i found with a GdiPlusGeoCanvas but i cant figure out the way to make it work. do you have a sample for that?


gis.thinkgeo.com/Support/Discussion...fault.aspx


 


thanks in advance.


sebastien



Hi sebastien,


To save the Google map background, you could use GoogleMapsLayer but not GoogleOverlay. The code could be like this:


Bitmap bitmap = null; 
GdiPlusGeoCanvas canvas = null;
try
{
    bitmap = new Bitmap((int)Map1.Width.Value, (int)Map1.Height.Value);
    canvas = new GdiPlusGeoCanvas();
    canvas.BeginDrawing(bitmap, Map1.CurrentExtent, Map1.MapUnit);
    canvas.Clear(Map1.MapBackground.BackgroundBrush);

    GoogleMapsLayer layer = new GoogleMapsLayer();
    layer.Open();
    layer.Draw(canvas, new System.Collections.ObjectModel.Collection<SimpleCandidate>());
    layer.Close();
}
finally
{
    canvas.EndDrawing();
    bitmap.Save(@"C:\temp\test.png");
}


And another solution is doing some research about the Google map static API, then you can call the static API to do this directly.
Any more questions please let me know.
Thanks,
Sun

ok  
 i thought it was impossible to ask directly a bounding box to the google map static api. 
 thanks 


OK, please have a try and any more questions please let me know. 
  
 Thanks, 
  
 Sun 


I had a look on the google map static api, and it is not possible to request an image using a bounding box, the only way is to specify the center of the image and the zoom level we want.



Sebastien, 
  
   I think you are correct.  That is why i think the best solution is to use the method Sun outlined above using the code he supplied.  I know this will work out, internally we work our the center point and all the other calculations. 
  
 David

 System.Collections.ObjectModel.Collection<simplecandidate> listSimpleCandidate = new System.Collections.ObjectModel.Collection<simplecandidate>();             Bitmap bitmap = null;             GdiPlusGeoCanvas canvas = null;             try             {                 bitmap = new Bitmap((int)Map1.Width.Value, (int)Map1.Height.Value);                 canvas = new GdiPlusGeoCanvas();                  string wkt = "POLYGON((3856893.8965224 3703052.43104992,3859640.8522259 3703052.43104992,3859640.8522259 3700759.32020178,3856893.8965224 3700759.32020178,3856893.8965224 3703052.43104992))";                 RectangleShape extend = BaseShape.CreateShapeFromWellKnownData(wkt).GetBoundingBox();                 canvas.BeginDrawing(bitmap, extend, Map1.MapUnit);                 canvas.Clear(Map1.MapBackground.BackgroundBrush);                  GoogleMapsLayer layer = new GoogleMapsLayer();                 layer.Open();                 layer.Draw(canvas, listSimpleCandidate);                 layer.Close();                    string binaryImageFilePath = MapPath(@"~\Temp\Images\test\Field_1250.png");                  GdiPlusRasterLayer gdiPlusImageLayer = new GdiPlusRasterLayer(binaryImageFilePath);                 gdiPlusImageLayer.UpperThreshold = double.MaxValue;                 gdiPlusImageLayer.LowerThreshold = 0;                  gdiPlusImageLayer.Open();                 gdiPlusImageLayer.Draw(canvas, listSimpleCandidate);                 gdiPlusImageLayer.Close();              }             finally             {                 canvas.EndDrawing();                 bitmap.Save(@"E:\test2.png");              }  


 


I tried to run this piece of code to get the google map and superpose an image (i enclose my image as well) but the result of the image i store in e:\test2.png does not have the google map because the image covers the google map. (the transparency is not handled properly)


do you have an idea?



1477-MyImage.zip (4.19 KB)

Sebastien,



We render the WKT that you give us, and request the Google image directly from Google’s Static API by the center point of your provided WKT. We found the map center is on the sea which you can find by screenshots below; while we zoom out to higher levels, you will see the feature data clearly and the center of BaseShape is still on the sea; so the WKT or the word file for Field_1250.png has some issue so that you cannot match the Google maps.



Figure 1:  Google Maps with the center: (3858267.37437415, 3701905.87562585) and level 5:

maps.google.com/maps/api/staticmap?center=3858267.37437415,3701905.87562585,0&zoom=5&size=512x512&maptype=roadmap&sensor=false&key=ABQIAAAAX_L0oJKT0IU2n0u0qxcr3BR3rCYD_eVzP3e6DX1YTr2ah9RbohStaDJYLxi99hL16CJfmL4rjnw9wA





Figure 2: Google Maps with the same center as above; but the zoom level is 4:

maps.google.com/maps/api/staticmap?center=3858267.37437415,3701905.87562585,0&zoom=5&size=512x512&maptype=roadmap&sensor=false&key=ABQIAAAAX_L0oJKT0IU2n0u0qxcr3BR3rCYD_eVzP3e6DX1YTr2ah9RbohStaDJYLxi99hL16CJfmL4rjnw9wA





Please let me know if you have any questions.



Thanks,

Howard

 



ok i get it right, actually the google api works with geographic projection. 


How did you manage to transform a bounding box to a center/zoomlevel to request google static api map?


Is it possible to get an image with virtual earth (bing) ? i did not find VirtualEarthLayer.


 


thanks for your help.


sebastien



Hi, Sebastien, 
  
 You could get the center point through GetCenterPoint method of Rectangle Shape. If you want to get the LatLon in decimal degree map unit, so you must project the center point. As far as we know, every zoom level in Google Maps has different precision in both horizontal and vertical dimensions, and zoom levels vary depending on location. So, if you send a request at the same center value but at different zoom, you will get different precision map image with the same center value. For your another question about Virtual Earth, if you want to get images with Virtual Earth, please refer to the MicrosoftMapLayerExtension.dll manually and use VirtualEarthLayer. 
  
 Any more questions please let me know.  
  
 Thanks, 
 Howard