ThinkGeo.com    |     Documentation    |     Premium Support

Version 7 breaks metafile generation (GraphicsGeoCanvas)?

The GraphicsGeoCanvas example (wiki.thinkgeo.com/wiki/Map_S...us_Samples) has been very useful, enabling us to export maps in vector format for insertion into Word, etc.


However, the new version 7 seems somehow to break this functionality. Below are two images, one showing the map layers as they are displayed on screen and the other showing the resulting EMF file. The red frame is the critical part here; it indicates the intended limits of the final image.


Evidently, not all lines and polygons are clipped to the given frame. The clipping are done using these statements:




GraphicsGeoCanvas canvas;

RectangleShape frame;

...

canvas.EnableCliping = true;

canvas.ClipingArea = frame;

In version 7 these statements are marked as "deprecated", to be replaced by:




GraphicsGeoCanvas canvas;

RectangleShape frame;

...

canvas.ClippingArea = frame;


However, neither of these seems to work as expected. 


Is this a bug in the new version, or do I just need to adjust my code a little?






P.S. My full code for generating metafiles can by found in this old post: thinkgeo.com/forums/MapSuite/tabid/143/aft/10844/Default.aspx



Hi Rolf, 



Thanks for your post. 



I found code changed here,  I need some time to make sure the change reason with our developer. 



I will update this post after that. 



Regards, 



Don

Hi Rolf 
  
 We have made a sample for it, would you please download it from the site and try it again: wiki.thinkgeo.com/wiki/File:ServicesEditionSample_UsingGraphicsGeoCanvas_CS_120911.zip 
  
 if you have any more question , please feel free to let us know. 
  
 Best Regards 
  
 Summer

Hi Rolf 
  
 We have made a sample for it, would you please download it from the site and try it again: wiki.thinkgeo.com/wiki/File:ServicesEditionSample_UsingGraphicsGeoCanvas_CS_120911.zip 
  
 if you have any more question , please feel free to let us know. 
  
 Best Regards 
  
 Summer

Hi,



Thanks for your effort, but unfortunately this still do not work as one would expect. It seems that now the (shown) layers are clipped to the given frame/rectangle (more or less), but the final image is not



For your convenience, I have modified your sample program (see below) to include clipping to a region covering major parts of Africa and Europe (Latitude 0…80, Longitude 0…40). This is the resulting image:





(I have added a blue border around the image to show the real extent).



As you can see, the layers seems to be clipped more or less to the given frame (but I wonder where is England and Norway?). However, the image extends far outside the desired frame.



I hope you can take another look into this problem.



Regards,

Rolf Tore



Code from GraphicsGeoCanvasSample:




private void btnGenerateEmf_Click(object sender, EventArgs e) {
ShapeFileFeatureLayer countryLayer = mapEngine.StaticLayers[“countryLayer”] as ShapeFileFeatureLayer;
Metafile metaFile = new Metafile(“result.emf”, Graphics.FromImage(new Bitmap(1, 1)).GetHdc());
GraphicsGeoCanvas graphicGeoCanvas = new GraphicsGeoCanvas();
Graphics graphic = Graphics.FromImage(metaFile);
RectangleShape frame = new RectangleShape(0, 80, 40, 0); // added
graphicGeoCanvas.ClippingArea = frame; // added
countryLayer.Open();
//graphicGeoCanvas.BeginDrawing(graphic, 4000, 4000, mapEngine.CurrentExtent, GeographyUnit.DecimalDegree);
graphicGeoCanvas.BeginDrawing(graphic, 4000, 4000, frame, GeographyUnit.DecimalDegree);
countryLayer.Draw(graphicGeoCanvas, new System.Collections.ObjectModel.Collection<simplecandidate>()); // modified
graphicGeoCanvas.EndDrawing();
countryLayer.Close();
metaFile.Dispose();
MessageBox.Show(String.Format(“The map has been saved as EMF to {0}\{1}”, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), “result.emf”));
}






Hi Rolf



Thanks for reporting this, we tried to recreate the problem, but it didn’t show up with our test dll(7.0.27.0), would you please get 7.0.27.0 and try it agian, following is a result image of our test, would you please check it?





if you have any more question , please feel free to let us know.



Best Regards



Summer

Hi Summer,


Well, actually your test confirms that there is a problem; your image is very similar to mine! Below is a comparison of the results of the current version and the previous version (6.0) (*). As shown by the red frames, the problem with the current version is that the image is NOT clipped to the same area as the shape layers are clipped.



It seems that the new version and/or the revised GraphicsGeoCanvas class is currently unable to reproduce the functionality we had in the previous version. I hope you are able to fix this, as it is somewhat critical to us.


Best Regards,


Rolf Tore


(*) Beyond the change of versions and GraphicsGeoCanvas code, the only difference between the two images is the use of "canvas.ClippingArea = frame" instead of "canvas.ClipingArea = frame", as noted in my first post.



Hi Rolf



Thanks for reporting this would you please use the attached code and try it again? it should work now.



if you have any more question , please feel free to let us know.



Sorry for the inconvenience



Summer

Post11383.txt (1.19 KB)

Hi Summer,

 

Well, we are almost there, but there is still something "fuzzy" here...As discussed below, I think the problem is somehow related to the DPI values 72 and 96 being used in different steps of the process.

 

Your proposed code is unfortunately dependent on the extent and size of the map shown on-screen. We need to be independent of any displayed map. To summarize, this is how we have used MapSuite until version 7:



        
  1. Define a region/frame (in world coordinates), to be included in the final map. This is usually a subset of the total extent of the map layer(s).

  2.     
  3. Define a width and height (in millimeters) of the final map image as it will appear when inserted into Microsoft Word.

  4.     
  5. Create Metafile, Graphics and GraphicsGeoCanvas objects, with size and clipping set according to (1) and (2).

  6.     
  7. Draw layer(s) to the canvas

  8.     
  9. Insert metafile into Microsoft Word



I have tried to adapt your proposed code to get the size, content and text labels of the final image correct, according to the steps 1..4 above (see attached code).



As can be seen from the attached Word-file:



        
  • Assuming 72 DPI gives a correctly sized image, whereas 96 DPI gives an image which is 33% too large.  

  •     
  • The text size is independent of the DPI value, and is wrong in both cases. The text seems to be about 33% too large. 


Can you please check if you are able to reproduce this behaviour using the attached code? Is this an error in Map Suite's handling of text size?



P.S. I should add that we of course may work around this remaining error, by assuming 96 DPI and then resize the too-large-image by a factor of 0.75. This works (gives correct image size and text size), but does not seems to be the proper solution...



Best Regards,



Rolf Tore



ScalingProblem.docx (781 KB)
002_001_samplecode.txt (2.66 KB)

Hi Rolf:

Thanks for your query, the font size is decided by “pt”, so, it can’t be measured with “pixel” unit or the resolution, so, following code should work.


float fontSize = GetPreferFontSize(96);

textLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("text", "Verdana", fontSize, DrawingFontStyles.Regular, GeoColor.StandardColors.Black);

textLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



    private float GetPreferFontSize(float p)

    {

        float orientSolution = 96f;

        float orientFontSize = 12.0f;

        float percent = p / orientSolution;

        return orientFontSize * percent;

    }



Attahced is the sample we tested, would you please try it?

Hope it helps

Summer



It seems to be working OK now.



Thanks for all your help!



Regards,

Rolf Tore

Hi Rolf 
  
 Great to hear it helped, if you have any more question, please feel free to let us know. 
  
 Best Regards 
  
 Summer