http://www.mapgears.com/en/blog/archive/2013-03-12-scribe<br><br>
<div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="padding: 4px; background-color: #c3d9ff;"><h3 style="margin:0px 3px;font-family:sans-serif">Sent to you by termal12 via Google Reader:</h3></div>
<div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="font-family:sans-serif;overflow:auto;width:100%;margin: 0px 10px"><h2 style="margin: 0.25em 0 0 0"><div class=""><a href="http://www.mapgears.com/en/blog/archive/2013-03-12-scribe">Scribe - A tool to facilitate the creation of Maps with MapServer</a></div></h2>
<div style="margin-bottom: 0.5em">via <a href="http://planet.osgeo.org" class="f">Planet OSGeo</a> by Charles-Éric Bourget on 3/12/13</div><br style="display:none">
<div><p>Creating a nice looking map that delivers efficiently its message is
not an easy task. Quite often we are dealing with large datasets that
shouldn’t be displayed at all scale levels or that should be
displayed, but, with a style that changes with the scale level. Every
single detail is important when defining the style of a map. The
process is generally an iterative one and requires a lot of
modifications to be made at each scale levels.</p>
<p>With <a href="http://www.mapgears.com/en/technologies/mapserver">MapServer</a>, <span>MINSCALEDENOM</span> and <span>MAXSCALEDENOM</span> tags in
the <span>LAYER</span> and <span>CLASS</span> objects are responsible for the scale
management. That means that as soon as an element of the style changes
for a given <span>LAYER</span> or <span>CLASS</span> at a given scale level, a new <span>LAYER</span> or
<span>CLASS</span> needs to be created. That way, we end up rewriting a lot of text
to modify only a single parameter. The task becomes more tedious if a
given parameter (the color of a road for example) is defined within
16 different LAYERs or so.</p>
<p>That’s where Scribe comes to the rescue.  It is a converter tool
written in python that we developed to facilitate the creation of
‘mapfiles’ by allowing for the use of variables as well as shortcuts
for managing scale levels. This approach is similar to that of
<a href="https://github.com/mapserver/basemaps/">Basemaps</a> but simpler to use and generally less verbose.</p>
<h3>Scale management</h3>
<pre><code>
LAYER {
    <span>1-16</span> {
        <span>NAME</span>: 'land'
        <span>TYPE</span>: <span>POLYGON</span>
        <span>@layerconfig</span>
        <span>DATA</span> {
            <span>1-4</span>: '110m_physical/ne_110m_land'
            <span>5-10</span>: '50m_physical/ne_50m_land'
            <span>11-16</span>: '10m_physical/ne_10m_land'
        }
        <span>CLASS</span> {
            <span>STYLE</span> {
                <span>COLOR</span> {
                    <span>1-6</span>: '#<span>EEECDF</span>'
                    <span>7-16</span>: '#<span>AAA89B</span>'
                }
                <span>OUTLINECOLOR</span>: 200 200 200
                <span>OUTLINEWIDTH</span>: <span>@land_ol_width</span>
            }
        }
    }
}
</code> 
</pre>

<p>In the above example, a <span>LAYER</span> named ‘land’ is created. With the ‘1-16’
tag, this <span>LAYER</span> will be displayed from scale level 1 to 16. Scribe
converts automatically those levels in terms of <span>MINSCALEDENOM</span> and
<span>MAXSCALEDENOM</span>. Furthermore, from level 1 to 4, the data (<span>DATA</span>) has a
resolution of 110m. From 5 to 10, it has a resolution of 50m and from
11 to 16 it has a resolution of 10m. The color (<span>COLOR</span>) changes
according to the scale level too. Using this syntax makes it very easy
to modify a given parameter for one or more scale levels without
having to rewrite or copy and paste a load of text and having to make
changes to a bunch of places.</p>
<h3>Defining and using variables</h3>
<p>Not only Scribe facilitates scale management, it also allows for
defining and using variables. In the above example, the variables
‘layerconfig’ and ‘land_ol_width’ are called with a ‘@’. Those
variables are defined in the following way:</p>
<pre><code>
VARIABLES {
    layerconfig {
        GROUP: 'default'
        STATUS: ON
        PROJECTION <span>{{</span>
            'init=epsg:4326'
        <span>}}</span>
        <span>PROCESSING</span>: 'LABEL_NO_CLIP=<span>ON</span>'
        <span>PROCESSING</span>: 'CLOSE_CONNECTION=<span>DEFER</span>'
    }
    land_ol_width: 1
}
</code>
</pre>

<p>The variable ‘layerconfig’ contains some parameters that are used in
the definition of most LAYERs. That means for each <span>LAYER</span>, writing
‘@layerconfig’ outputs all the parameters contained in the variable
and spares the writing of a few lines of text. The next variable
‘land_ol_width’ contains a single value.</p>
<p>Note that in the definition of the ‘layerconfig’ variable, the
<span>PROJECTION</span> tag is followed with two ‘{‘. This syntax is necessary for
tags like <span>PROJECTION</span>, <span>METADATA</span> <span>AND</span> <span>PATTERN</span> which contain no parameter,
only plain text.</p>
<h3>Comment blocks</h3>
<pre><code>
LAYER {
    1-16 {
        NAME: 'land'
        TYPE: POLYGON
        @layerconfig
        DATA {
            1-4: '110m_physical/ne_110m_land'
            5-10: '50m_physical/ne_50m_land'
            11-16: '10m_physical/ne_10m_land'
        }
        CLASS {
            STYLE {
                COLOR {
                    1-6: '#EEECDF'
                    7-16: '#AAA89B'
                }
                <span>##Comments preceded with ## appear
                ##in the resulting mapfile.
                ##Comment blocks between /* */
                ## do not appear in the resulting mapfile.</span>
                <span>/* 
                <span>OUTLINECOLOR</span>: 200 200 200
                <span>OUTLINEWIDTH</span>: @land_ol_width
                */</span>              
            }
        }
    }
}
</code>
</pre>

<h3>Run the script</h3>
<p>Finally, to run the script, a single command is required, configurable
with a few options:</p>
<pre><code>
python scribe.py
</code>
</pre>

<p>The result is a perfectly indented mapfile that includes scale
management and, more than often, way more lines of text than what had
to be written. Therefore, Scribe saves time and makes creating quality
maps easy and user friendly.</p>
<h3>Follow Scribe on GitHub</h3>
<p>Scribe is a work in progress. New functionnalities will be added in
the future. We invite you to follow its progress and start using it by
visiting its <a href="https://github.com/solutionsmapgears/Scribe">GitHub repository</a>. If you require any further
information, please feel free to
<a href="mailto:info@mapgears.com">contact us</a>.</p>
<p><em><strong><span>NOTE</span>: </strong>This article was originally posted in French on
<a href="http://simonmercier.net/blog/?p=1621">Simon Mercier’s blog</a></em></p></div></div>
<br>
<div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="padding: 4px; background-color: #c3d9ff;"><h3 style="margin:0px 3px;font-family:sans-serif">Things you can do from here:</h3>
<ul style="font-family:sans-serif"><li><a href="http://www.google.com/reader/view/feed%2Fhttp%3A%2F%2Fplanet.osgeo.org%2Fatom.xml?source=email">Subscribe to Planet OSGeo</a> using <b>Google Reader</b></li>
<li><a href="http://www.google.com/reader/?source=email">Get started using Google Reader</a> to easily keep up with <b>all your favorite sites</b></li></ul></div>
<div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>
<div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"> </div>