Re[mapguide-users] nderingService and DPI (How to change DPI before rendering)

simon hope simonh at geobiz.co.nz
Tue Nov 13 14:39:27 EST 2007


Scott,

I was looking at creating PDF's a couple of months back and I used a couple
of methods -  both the rendering service and the direct call to mapagent via
http - i ended up using the direct call to mapagent as my preferred method -
here is some sample code that i used (c#)

Method 1 - rendering service

        //method for getting extent
        int dpi = map.GetDisplayDpi();
        double metPerUnit = 100000;
        double metPerPxl = 0.0254 / dpi;
        double sesMapScale = map.GetViewScale();
        int sesScrnW = map.GetDisplayWidth();
        int sesScrnH = map.GetDisplayHeight();
        double midX = map.GetViewCenter().GetCoordinate().GetX();
        double midY = map.GetViewCenter().GetCoordinate().GetY();

        double sesLLX = midX - ((sesMapScale * sesScrnW * metPerPxl) /
metPerUnit) / 2;
        double sesURX = ((sesMapScale * sesScrnW * metPerPxl) / metPerUnit)
/ 2 + midX;
        double sesLLY = midY - ((sesMapScale * sesScrnH * metPerPxl) /
metPerUnit) / 2;
        double sesURY = ((sesMapScale * sesScrnH * metPerPxl) / metPerUnit)
/ 2 + midY;


        //get the map envelope
        MgEnvelope env = new MgEnvelope(sesLLX, sesLLY, sesURX, sesURY);

        //set the selection
        MgSelection sel = new MgSelection(map);

        //set the rendering service
        MgRenderingService renderingSrvc =
siteConnection.CreateService(MgServiceType.RenderingService) as
MgRenderingService;

        //set the colour
        MgColor bgcolor = new MgColor(0, 0, 0, 0);

        MgByteReader byteReader = renderingSrvc.RenderMap(map, sel, env,
sesScrnW, sesScrnH, bgcolor, "png");
        MgGeometryFactory gFactory = new MgGeometryFactory();
        MgCoordinate coord =
gFactory.CreateCoordinateXY(map.GetViewCenter().GetCoordinate().GetX(),
map.GetViewCenter().GetCoordinate().GetY());

        long byteReaderSize = byteReader.GetLength();
        //Create an MgByteSink and save to the file system
        MgByteSink byteSink = new MgByteSink(byteReader);
        string fileName = "c:\\temp\\RenderMap.png";
        byteSink.ToFile(fileName);

Method 2 - http request

call.....

System.Drawing.Image bmp =
GetImageFromURL("http://localhost/mapguide/mapagent/mapagent.fcgi?OPERATION=GETMAPIMAGE&VERSION=1.0.0&SESSION="
+ tbSessionID.Text + "&MAPNAME=" + tbMapName.Text + "&LOCALE=en&FORMAT=" +
format + "&SETVIEWCENTERX=" + Convert.ToString(x) + "&SETVIEWCENTERY=" +
Convert.ToString(y) + "&SETVIEWSCALE=" + Convert.ToString(scale) +
"&SETDISPLAYDPI=" + strDpi + "&SETDISPLAYWIDTH=" + dispW +
"&SETDISPLAYHEIGHT=" + dispH);

method....

    private System.Drawing.Image GetImageFromURL(string strURL)
        {

            System.Drawing.Image retVal = null;

            try
            {

                HttpWebRequest request =
(HttpWebRequest)HttpWebRequest.Create(strURL);
                //request.Timeout = 15000; // 5 seconds in milliseconds
                //request.ReadWriteTimeout = 20000; // allow up to 20
seconds to elapse

                // execute the request
                HttpWebResponse response =
(HttpWebResponse)request.GetResponse();
                retVal =
System.Drawing.Image.FromStream(response.GetResponseStream());

            }

            catch (Exception)
            {
                retVal = null;
            }
            return retVal;

        }

I can't remember quite where i was experiencing problems with the rendering
service but could looki again if you need more help

Cheers

Simon



Kenneth, GEOGRAF A/S wrote:
> 
> I see your point.
> The runtime map has a DisplayDPI property, but it is readonly.
> I also assumed that the API had the same parameters as the actual 
> service call, but not in this case.
> You can use the "SETDATAEXTENT" call to set the DPI, but it does change 
> current DPI.
> 
> You should be able to save a copy of the runtime map though.
> 
> Regards, Kenneth, GEOGRAF A/S
> 
> 
> 
> Scott Hameister skrev:
>>
>> That is true...But that is using an FCGI call and not the Rendering 
>> Service API...The API has no mention of DPI...I would think the API 
>> would have all the same capabilities that an FCGI call has?
>>
>>  
>>
>> I started using the FCGI calls...but it became annoying because 
>> changing the FCGI DPI...caused the Current maps DPI to change...
>>
>> If I created a new Session to call the FCGI on, then my selection XML 
>> from the original Sessions map didn't work in the New Session, because 
>> the Layer ID changed...etc.
>>
>>  
>>
>> *From:* mapguide-users-bounces at lists.osgeo.org 
>> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of 
>> *Kenneth, GEOGRAF A/S
>> *Sent:* Monday, November 12, 2007 1:21 PM
>> *To:* MapGuide Users Mail List
>> *Subject:* Re: [mapguide-users] RenderingService and DPI (How to 
>> change DPI before rendering)
>>
>>  
>>
>> I have no used the ColdFusion stuff that you are using, but the call 
>> to GetMapImage does have a DPI parameter, that you can use.
>> I have no trouble getting the images as I want, although the PDF 
>> format usually reduces quality a bit.
>>
>> Try looking at the code in the viewer for "Printable Page", as it 
>> shows how to use the calls.
>>
>>
>> Regards, Kenneth, GEOGRAF A/S
>>
>>
>>
>> Scott Hameister skrev:
>>
>> I can send anyone interested sample PDFs of the same map stream at 
>> different screen resolutions
>>
>>  
>>
>> *From:* mapguide-users-bounces at lists.osgeo.org 
>> <mailto:mapguide-users-bounces at lists.osgeo.org> 
>> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of *Scott 
>> Hameister
>> *Sent:* Monday, November 12, 2007 12:00 PM
>> *To:* 'MapGuide Users Mail List'
>> *Subject:* [mapguide-users] RenderingService and DPI (How to change 
>> DPI before rendering)
>>
>>  
>>
>> How do I change the DPI that The  Rendering Service Uses when Creating 
>> a map...
>>
>> The Streamed Image from the rendering service is being poured into a 
>> PDF file...the problem is that the quality of the PDF varies based on 
>> the Resolution my Screen is at when I render the Stream, instead of 
>> being consistent in the PDF. If I'm at 1024 x 768 the PDF map is 
>> grainier than if I'm at 1920x1200 resolution when  I stream the image 
>> How can I address this to make the PDF quality the same for all users?
>>
>>  
>>
>> <cfset newMap = 
>> renderingSrvc.rendermap(map,mgselection,realCenter,Javacast("DOUBLE",SesMapScale),Javacast
>>
>> ("INT",SesScrnW),Javacast("INT",SesScrnH),mapcolor,"PNG")>
>>
>>  
>>
>> Above Is my Coldfusion call...
>>
>>  
>>
>>  
>> ------------------------------------------------------------------------
>>
>>
>>   
>>  
>> _______________________________________________
>> mapguide-users mailing list
>> mapguide-users at lists.osgeo.org <mailto:mapguide-users at lists.osgeo.org>
>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>   
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> mapguide-users mailing list
>> mapguide-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>   
> 
> _______________________________________________
> mapguide-users mailing list
> mapguide-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-users
> 
> 

-- 
View this message in context: http://www.nabble.com/RenderingService-and-DPI-%28How-to-change-DPI-before-rendering%29-tf4792763s16610.html#a13733070
Sent from the MapGuide Users mailing list archive at Nabble.com.



More information about the mapguide-users mailing list