ThinkGeo.com    |     Documentation    |     Premium Support

A better example of printing map with some customization capability?

is there a pure MVC version of printing/exporting map to printer/images of different formats? 



all I saw are desktop/wpf, using these PrinterLayer things.



Do I have to use these again?



I do want the capability to specify if i export scaleline, compass, zoombar, legend, …,



Thanks,



Guangming




i got this error: 
  
 {"Printer layer supports Feet or Meter only\r\nParameter name: mapUnit"} 
  
 my map is decimaldegree. is there any way to convert that?

Hi guangming,



We don’t have a pure printer sample with Mvc, but we have a web sample and I think this is very similar with Mvc. Please refer to it and let me know if it helps. wiki.thinkgeo.com/wiki/File:WebPrinterSample.zip



For the error, would you attach any codes you are using?

Thanks,

Troy




It is this line I believe: 
  pgc.BeginDrawing(printDoc, prl.GetBoundingBox(), GeographyUnit.Meter); 
 (with this line, i got an empty image) 
  
 If i changed it to be: 
  pgc.BeginDrawing(printDoc, prl.GetBoundingBox(), map.MapUnit);, the problem came. 
  
 Like i said, my map is DecimalDegree. The printing demo does say as the error that printing requires unit in meter or feet. Does this mean i have to convert all my shape files to meter/feet when I load the layers? 
  
 also, I noticed this line from the demo, which i did not include in my codes: 
 Map1.ZoomLevelSet = new PrinterZoomLevelSet(Map1.MapUnit, PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit)); 
 should I? 
  
 can we have a document explaining the whole process so that i can customize the process? so far i feel i did not get the whole picture. 
 LayerOverlay mapOverlay = map.CustomOverlays[0] as LayerOverlay; //CustomOverlayName
            try
            {
                //an empty PagePrinterLayer
                PagePrinterLayer prl = new PagePrinterLayer(PrinterPageSize.AnsiA, PrinterOrientation.Landscape);

                PrintDocument printDoc = new PrintDocument();
                printDoc.DefaultPageSettings.Landscape = prl.Orientation == PrinterOrientation.Landscape; // sync orientation
                printDoc.DefaultPageSettings.PaperSize = new PaperSize("AnsiA", 850, 1100);

                PrinterGeoCanvas pgc = new PrinterGeoCanvas();
                pgc.DrawingArea = new Rectangle(0, 0, Convert.ToInt32(printDoc.DefaultPageSettings.PrintableArea.Width),
                    Convert.ToInt32(printDoc.DefaultPageSettings.PrintableArea.Height));
                prl.Open();
                pgc.BeginDrawing(printDoc, prl.GetBoundingBox(), GeographyUnit.Meter);
                prl.Close();

                // draw each map layer throug MapPrinterLayer
                Collection<SimpleCandidate> labelsInAllLayers = new Collection<SimpleCandidate>();
                MapPrinterLayer mpl = new MapPrinterLayer();
                mpl.MapUnit = GeographyUnit.Meter;
                mpl.MapExtent = map.CurrentExtent;
                foreach (Layer l in mapOverlay.Layers)
                {
                    mpl.Layers.Add(l);
                }
            
                // draw this map PrinterLayer to GeoCanvas
                mpl.Open();
                mpl.IsDrawing = true;
                mpl.Draw(pgc, labelsInAllLayers);
                mpl.IsDrawing = false;
                mpl.Close();

                // stop all drawing
                pgc.EndDrawing();

            } 


I got the same example. 
  
 Two parts specifically I do not understand: 
  
 1, in function SetupMapWithBlankPage: why Map1.ZoomLevelSet = new PrinterZoomLevelSet(Map1.MapUnit, … 
 I have my own ZoomLevelSet customized. 
  
 2, in function AddMapLayer() 
 why this? 
 worldMapLayer.FeatureSource.Projection = new Proj4Projection(Proj4Projection.GetDecimalDegreesParametersString(), Proj4Projection.GetGoogleMapParametersString()); 
             worldMapLayer.FeatureSource.Projection.Open(); 
  
 also this line: Collection<Feature> features = worldMapLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns); 
  
 features never be used later in the function. 


Hi guangming,



For the exception, like the exception mentioned, all the printerLayer are not fit for decimal degree.



As for the two questions, I replied them in your other thread and do some explanations on the printing sample, please refer to it  thinkgeo.com/forums/MapSuite…fault.aspx



Any questions, please feel free to let us know.

Thanks,

Troy