[Geoserver-devel] [jira] (GEOS-4965) Fix DPI param

Krunoslav Hrnjak created GEOS-4965:
--------------------------------------

             Summary: Fix DPI param
                 Key: GEOS-4965
                 URL: https://jira.codehaus.org/browse/GEOS-4965
             Project: GeoServer
          Issue Type: Bug
          Components: WMS
    Affects Versions: 2.1.3
         Environment:
Test environment info:
General information about GeoServer
    Build Information
        Version 2.1.3
        Subversion Revision 16668
        Build Date 21-Dec-2011 11:55
        GeoTools Version 2.7.4 (rev 38443)
    
WMS request:
http://arpis-dev01-aio03.arpis.local:8080/geoserver/wms/reflect?layers=sf:Restricted_Line&BBOX=598534.854774036,4917029.553902023,598544.854774036,4917039.553902023&width=1181&format_options=layout:foo;dpi=300
    
Tomcat log:
Request: reflect
        Time = null
        Filter = null
        Format = null
        Buffer = 0
        Height = 0
        Width = 1181
        Layers = [org.geoserver.wms.MapLayerInfo@anonymised.com]
        Transparent = false
        Filters = null
        SRS = null
        Styles = [StyleImpl[ name=line]]
        Legend = false
        MaxFeatures = null
        Bbox = ReferencedEnvelope[598534.854774036 : 598544.854774036, 4917029.553902023 : 4917039.553902023]
        RemoteOwsType = null
        RemoteOwsURL = null
        Env = {}
        FormatOptions = {DPI=300=true, LAYOUT=foo}
        Angle = 0.0
        CQLFilter = null
        Elevation = NaN
        FeatureId = null
        Palette = null
        Sld = null
        SldBody = null
        StartIndex = null
        ViewParams = null
        FeatureVersion = null
        Tiled = false
        Crs = null
        BgColor = java.awt.Color[r=255,g=255,b=255]
        ValidateSchema = false
        SldVersion = null
        TilesOrigin = null
        Exceptions = SE_XML
        KMScore = 40
        KMattr = true
        Version = null
        Request = GetMap
        RawKvp = {BBOX=598534.854774036,4917029.553902023,598544.854774036,4917039.553902023, FORMAT_OPTIONS=layout:foo;dpi=300, LAYERS=sf:Restricted_Line, WIDTH=1181}
        Get = true
        BaseUrl = http://arpis-dev01-aio03.arpis.local:8080/geoserver/
        RequestCharset = UTF-8
  
            Reporter: Krunoslav Hrnjak
            Assignee: Andrea Aime
         Attachments: DPI.xls, Restricted_Line.zip

Dear geo folks,

I would like to state few questions regarding DPI WMS vendor parameter and make some proposal how to enhance WMS output in this case.
It seems to me that DPI parameter does not have any kind of effect on WMS output. Any kind of value can be submitted to DPI parameter, even alphanumerical one.

For this discussion I suggest to publish new sample data on GeoServer. I have attached Restricted_Line.shp (produced in EPSG:26713) that has several rectangles of different lengths: 1km, 0.5km, 100m, 10m, 1m, 10cm. On these rectangles it is possible to check how to produce print out and verify scale.

Let's begin with rectangle 10mx10m rectangle. I will print out this rectangle on the paper and print out will be 10cm and use printer with 300dpi resolution. In this case scale ratio is 1:10m/10cm = 1:100. Since printer resolution is 300 dpi I have to request picture that is 10cm/2,54cm/inch*300d/inch=1181 dots (pixels) width.

WMS decorations scaleline and scaleratio will be used.
cd $GEO-SERVER-DATA-DIR
mkdir layouts
cd layouts
vi foo.xml
and paste:
<layout>
    <decoration type="scaleline" affinity="bottom,left" offset="36,6"/>
    <decoration type="scaleratio" affinity="top,left" offset="6,6" size="auto"/>
</layout>

So let's create the WMS request:
1. First let's grab the BBOX over WFS: http://arpis-dev01-aio03.arpis.local:8080/geoserver/wfs?request=GetFeature&version=1.1.0&typeName=sf:Restricted_Line&outputFormat=text/xml;%20subtype=gml/3.2&CQL_FILTER=NAME=‘10m’
2. Let's get object's picture http://arpis-dev01-aio03.arpis.local:8080/geoserver/wms/reflect?layers=sf:Restricted_Line&BBOX=598534.854774036,4917029.553902023,598544.854774036,4917039.553902023&width=1181&format_options=layout:foo;dpi=300
3. Save picture to your hard disk
4. I have opened picture in IrfanView and set DPI to 300 (it would be nice if this value would already be encoded in picture).
5. After printing on paper, object size was 10 cm, but scaleratio is not calculated on the right way. Instead of 1:100 it is written 1:30, and also scale line representing 1m length was only 0.8cm long, instead of 1cm. Both should be fixed.

From this discussion it is obvious that dpi parameter does not have any impact on scale line and scale ratio parameters. And I am not sure how it is connected with DPI Scaling announcement http://blog.geoserver.org/2010/09/04/geoserver-21-beta-released/ where it is written:
"By default GeoServer renders images at a resolution of 90 DPI. While this is acceptable for the standard screen it is not acceptable for print which requires a higher resolution. Now it is possible to supply a format option to a WMS request on the fly that controls the DPI setting."

By my opinion expected behavior would be the following:
BBOX, HEIGHT or WIDTH and DPI params should be used to calculate scale ratio:
1. First calculate distance between maxx and minx to get object size in some unit (I suggest meters)
2. Divide WIDTH/DPI*2,54*100 to get print out size in meters
3. Calculate scale ratio as object-size/print-size
(in case of HEIGHT param received this procedure should be done with maxy and miny)

I am not sure will dpi param have some influence on how picture is printed out. There is a huge problem in double styling, one made for screen and one for print out. Usually layer that looks good on screen but if the same styling is used during printing lines are usually too narrow, and also scalline is too small in this case. I believe dpi params should made some kind of changes on print out when high dpi resolution is used since if there is not any change on styling lines are too narrow. So dpi should do some king of magic here.

As I can see it is possible to send anything as DPI param and no error is received like:
http://arpis-dev01-aio03.arpis.local:8080/geoserver/wms/reflect?layers=sf:Restricted_Line&BBOX=598534.854774036,4917029.553902023,598544.854774036,4917039.553902023&width=1181&format_options=layout:foo;dpi=Tihana

I understand why it takes value 'Tihana' since this is name of one beautiful young lady, but why it takes words like War or Kill?

Looking forward to hear from you.

  Recommended readings:
    Maybe to some people this is well known but it can set rigt was of thinking regarding DPI param encoded in digital picture: http://www.scantips.com/no72dpi.html

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira