ThinkGeo.com    |     Documentation    |     Premium Support

Overlay Askew When Exporting to Bitmap With Google Background

I am having a problem with an export of a map with a Google Maps background and a single overlay.


The map control has a Google Overlay and a Google Layer. I use the Google Overlay to allow the user to interactively explore the map. When they click the export button I switch the active overlay to the Google Layer and do the export. This will include the Google Maps background since a Google Overlay is client-side and will not be included.


When the user is seeing the interactive map, the screen shot looks like this:



...but when the click the export button the resulting bitmap looks like this:



As you can see, the overlay is askew in relation to the Google Maps background. Can anyone tell me why that might be?


Here is the code that produces the bitmap export:



ctlMap.CustomOverlays(GOOGLELAYERNAME).IsVisible = True
ctlMap.ActiveBaseOverlay = ctlMap.CustomOverlays(GOOGLELAYERNAME)
Dim bmp As System.Drawing.Bitmap = ctlMap.GetBitmap(ctlMap.Width.Value, ctlMap.Height.Value)
ctlMap.ActiveBaseOverlay = ctlMap.CustomOverlays(GOOGLEOVERLAYNAME)
ctlMap.CustomOverlays(GOOGLELAYERNAME).IsVisible = False

Dim jpgEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
Dim qualityEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
Dim jpgEncoderParms As New System.Drawing.Imaging.EncoderParameters(1)
Dim jpgQualityParm As New System.Drawing.Imaging.EncoderParameter(qualityEncoder, 90)
jpgEncoderParms.Param(0) = jpgQualityParm
bmp.Save(Server.MapPath(tempFileName), jpgEncoder, jpgEncoderParms)

Any assistance is greatly appreciated.



Bob Mc.



Bob, 
  
 I think the issue is caused by the width and height you passed in get GetBitmap. Because Google’s image is cached while the shapes are drawned dynamically. So that the dynamic shapes are stretched when overlap on a specified extent, width and height. 
  
 Please debug the width and height you are using; it may be the value in percentage. If I’m right, please use WidthInPixels and HeightInPixels instead.  
  
 On the other hand, if it doesn’t work, please provide the following message and we’ll check for you. 
 1, the ShapeFile which is overlaping on the Google’s map; 
 2, Map1.CurrentExtent; 
 3, Map1.ActualWidthInPixels and Map1.ActualHeightInPixels 
  
 Thanks, 
 Howard

Howard,


When attempting to use ActualWidthInPixels and ActualHeightInPixels an exception is thrown that states:

    "ActualWidth and ActualHeight property can be used after PostBack."

...which I find a bit confusing. When can I use these properties?


FYI, my export method is called from within an UpdatePanel so the page has already been rendered at least once.


Attached is the shape file, as per your request.


The current extent is

    Height: 68266.852827795781

    LowerLeftPoint. X: -9628619.9877783377

    LowerLeftPoint.Y: 4040075.0648792414

    LowerRightPoint.X: -9572862.5038687848

    LowerRightPoint.Y: 4040075.0648792414

    UpperLeftPoint.X: -9628619.9877783377

    UpperLeftPoint.Y: 4108341.9177070372

    UpperRightPoint.X: -9572862.5038687848

    UpperRightPoint.Y: 4108341.9177070372


And I can't supply the ActualWidthInPixels and ActualHeightInPixels, as noted above. However, Map1.Width = 640 and Map1.Height = 480 when I step through in debug.


Bob Mc.


 



1539-Shape001010.zip (11.6 KB)

Bob, 
  
 The ActualWidthInPixels and ActualHeightInPixels cannot be used in the first time page load. Because the width and height are critical properties needed in the GetBitmap API. But the problem is that if you set width and height to 100%, we cannot get actual width and height in pixel. 
  
 We can only synchronize the actual width and height after a postback. If you want to GetBitmap at first time page load, please raise an asynchronize function to call the GetBitmap method. 
  
 Please let me know if you have any questions. 
  
 Thanks, 
 Howard

Howard,


I'm not attempting to access the properties before postback. I've attached a sample web site application that illustrates the problem that I'm having.


The map control is in a panel on the page that is part of a table control. At page load the tab that the map is on is not seen - it's on tab number two. The user clicks tab two and the map is seen. The user then clicks the "Export JPEG" link under the map and the error occurs.


Bob Mc.



1542-ThinkGeo_Map_Export_Skew_Issue.zip (197 KB)

Bob, 


We notice that you placed the map control in a Web User Control, so you couldn’t use the WidthInPixels and HeightInPixels. However, you could use the width and height properties of map control, and in order to avoid stretching map picture, you should use Drawing Extent and set it to Current Extent of map. The code is as following:

ctlMap.CurrentExtent = ExtentHelper.GetDrawingExtent(ctlMap.CurrentExtent, ctlMap.Width.Value, ctlMap.Height.Value).

Any more questions please let me know. 
Thanks,
Sun

Sun,


Thanks very much. That improves the situation dramatically!


However, it's still not quite right. Here's the resulting JPEG now:


 


As you can see, it's much better, but still slightly off. Is there any way to improve this further?


The revised lines of code now look like this:



ctlMap.CurrentExtent = ExtentHelper.GetDrawingExtent(ctlMap.CurrentExtent, ctlMap.Width.Value, ctlMap.Height.Value)
Dim bmp As System.Drawing.Bitmap = ctlMap.GetBitmap(ctlMap.Width.Value, ctlMap.Height.Value)

I've attached the revised project just in case you need it.


Thanks,


Bob Mc.



1549-ThinkGeo_Map_Export_Skew_Issue_2.zip (197 KB)

Bob,



We guess the problem lies in the scale of the map; please snap the zoom level to get the exact extent for the current scale. The code is as following: 


'ctlMap.CurrentExtent = ExtentHelper.GetDrawingExtent(ctlMap.CurrentExtent, ctlMap.Width.Value, ctlMap.Height.Value)
ctlMap.CurrentExtent = ExtentHelper.SnapToZoomLevel(ctlMap.CurrentExtent, ctlMap.MapUnit, ctlMap.Width.Value, ctlMap.Height.Value, New ZoomLevelSet())



Any more questions please let me know. 



Thanks,

Howard



BINGO!!! 
  
 Thanks very much to both Howard and Sun. 
  
 Bob Mc.

Bob, 
  
 You are welcome; please feel free to let us know if you have more questions. 
  
 Thanks, 
 Howard