.. index::
   simple: CGI controls

.. _cgi_controls:

*****************************************************************************
 MapServer CGI Controls
*****************************************************************************

Variables
=========

Variable names are not case sensitive.

.. index::
   pair: CGI; buffer

BUFFER [distance]
    A distance, in the same coordinate system as the map file, used in
    conjunction with MAPXY to create an new map extent.

.. index::
   pair: CGI; classgroup

CLASSGROUP [name]
    The name of a :ref:`LAYER` CLASSGROUP.  Set the :ref:`LAYER`
    `CLASSGROUP` to `name` for all layers that have at least one
    :ref:`CLASS` that is using the given CLASSGROUP `name`.

.. index::
   pair: CGI; context

CONTEXT [filename]
    Path to a context file. Path is relative to the map file to be used, or
    can also be a URL path (See the section "Map Context Support Through
    CGI" below for more details).

.. index::
   pair: CGI; icon

ICON [layername],[classindex]
    Used in MODE=legendicon to generate a legend icon for a layer.  The
    class index value is optional and defaults to 0.

.. index::
   pair: CGI; id

ID [id-string]
    By default MapServer generates a unique session id based on system time
    and process id. This parameter overwrites the default.

.. index::
   pair: CGI; img

IMG
    The name associated with the inline map image used to record user clicks.
    What actually is passed are two variables, img.x and img.y.

    For the CGI Applications this is an essential variable, see the examples
    for sample usage.

.. index::
   pair: CGI; imgbox

IMGBOX [x1] [y1] [x2] [y2]
    Coordinates (in pixels) of a box drag in the image. Most often used in
    conjunction with Java based front ends to the MapServer.

.. index::
   pair: CGI; imgext

IMGEXT [minx] [miny] [maxx] [maxy]
    The spatial extent of the existing inline image, that is, the image the
    users can see in their browser.

.. index::
   pair: CGI; imgshape

IMGSHAPE [x1 y1 x2 y2 x3 y3 ...] | [WKT]
    An arbitrary polygon shape (specified using **image coordinates**)
    to be used for query purposes.

    The polygon is specified by listing its coordinates (multiple
    instances simply add parts to the shape so it is possible to
    construct a shape with holes) or by specifying the WKT (Well
    Known Text) representation.

    Used with the NQUERY mode.

.. index::
   pair: CGI; imgsize

IMGSIZE [cols] [rows]
    The size (in pixels) of the exiting inline image.

.. index::
   pair: CGI; imgxy

IMGXY [x] [y]
    Coordinates (in pixels) of a single mouse click. Used most often in
    conjunction with Java based front ends to the MapServer.

.. index::
   pair: CGI; layer

LAYER [name]
    The name of a layer as it appears in the map file. Sending mapserv a layer
    name sets that layer's STATUS to ON.

.. index::
   pair: CGI; layers

LAYERS [name name ...]
    The names of the layers to be turned on. Layer names must be separated by
    spaces.

    Version 4.4 and above: passing 'LAYERS=all' will automatically turn on all
    layers.

.. index::
   pair: CGI; map

MAP [filename]
    Path, relative to the CGI directory, of the map file to be used.

.. index::
   pair: CGI; mapext

MAPEXT [minx] [miny] [maxx] [maxy] , MAPEXT (shape)
    The spatial extent of the map to be created.

    Can be set to shape as an alternative option. In this case mapextent is
    set to the extent of a selected shape. Used with queries.

.. index::
   pair: CGI; mapshape

MAPSHAPE [x1 y1 x2 y2 x3 y3 ...] | [WKT]
    An arbitrary polygon shape (specified using **map coordinates**)
    to be used for query purposes.

    The polygon is specified by listing its coordinates (multiple
    instances simply add parts to the shape so it is possible to
    construct a shape with holes) or by specifying a WKT (Well Known
    Text) representation of the polygon.

    Used with the NQUERY mode.

.. index::
   pair: CGI; mapsize

MAPSIZE [cols] [rows]
    The size (in pixels) of the image to be created. Useful for allowing users
    to change the resolution of the output map dynamically.

.. index::
   pair: CGI; mapxy

MAPXY [x] [y] , MAPXY (shape)
    A point, in the same coordinate system as the shapefiles, to be used in
    conjunction with a buffer or a scale to construct a map extent.

    Can be set to shape as an alternative option. In this case mapextent is
    set to the extent of a selected shape. Used with queries.

.. index::
   pair: CGI; minx

.. index::
   pair: CGI; miny

.. index::
   pair: CGI; maxx

.. index::
   pair: CGI; maxy

MINX | MINY | MAXX | MAXY [number]
    Minimum/Maximum x/y coordinate of the spatial extent for a new map/query.
    This set of parameters are the pieces of MAPEXT.

.. index::
   pair: CGI; mode

MODE [value]
    Mode of operation. The following options are supported:

    .. index::
       triple: CGI; mode; browse

    BROWSE
        Fully interactive interface where maps (and interactive pages) are
        created. This is the default mode.

    .. index::
       triple: CGI; mode; coordinate

    COORDINATE
        Returns a string of map coordinates based on a user click on an image. 

        ::

          mapserv.exe?map=/mapfiles/gmap75.map&MODE=coordinate&IMGEXT=0 0 100 100&IMGXY=10 10

    .. index::
       triple: CGI; mode; featurenquery

    FEATURENQUERY
        A spatial search that uses multiple features from SLAYER to query
        other layers.

    .. index::
       triple: CGI; mode; featurequery

    FEATUREQUERY
        A spatial search that uses one feature from SLAYER to query other
        layers.

    .. index::
       triple: CGI; mode; indexquery

    INDEXQUERY
        Looks up a feature based on the values of SHAPEINDEX and TILEINDEX
        parameters. SHAPEINDEX is required, TILEINDEX is optional and is only
        used with tiled shapefile layers.

    .. index::
       triple: CGI; mode; itemfeaturenquery

    ITEMFEATURENQUERY
        A text search of attribute data is triggered using a QSTRING. Returns
        all matches. Layer to be searched is defined using slayer parameter.
        The results of this search are applied to other searchable layers
        (which can be limited using the QLAYER parameter).

    .. index::
       triple: CGI; mode; itemfeaturequery

    ITEMFEATUREQUERY
        A text search of attribute data is triggered using a QSTRING. Returns
        first match. Layer to be searched is defined using slayer parameter.
        The results of this search are applied to other searchable layers
        (which can be limited using the QLAYER parameter).

    .. index::
       triple: CGI; mode; itemnquery

    ITEMNQUERY
        A text search of attribute data is triggered using a QSTRING.
        Returns all matches.

    .. index::
       triple: CGI; mode; itemquery

    ITEMQUERY
        A text search of attribute data is triggered using a layer QSTRING.
        Returns 1st match.

    .. index::
       triple: CGI; mode; legend

    LEGEND
        The created legend is returned. Used within an <img ... > tag.

    .. index::
       triple: CGI; mode; legendicon

    LEGENDICON
        A legend icon is returned.  The ICON parameter must also be used
        to specify the layername and a class index.  Class index value is
        optional and defaults to 0.  For example:

        ::

          mapserv.exe?map=/mapfiles/gmap75.map&MODE=legendicon&ICON=popplace,0

    .. index::
       triple: CGI; mode; map

    MAP
        The created map is returned. Used within an <img ... > tag.

    .. index::
       triple: CGI; mode; nquery

    NQUERY
        A spatial search (finds all) is triggered by a click in a map or by
        user-define selection box.

    .. index::
       triple: CGI; mode; query

    QUERY
        A spatial search (finds closest) is triggered by a click in a map.

    .. index::
       triple: CGI; mode; reference

    REFERENCE
        The created reference map is returned. Used within an <img ... > tag.

    .. index::
       triple: CGI; mode; scalebar

    SCALEBAR
        The created scalebar is returned. Used within an <img ... > tag.

    .. index::
       triple: CGI; mode; tile

    TILE
        Generate a map tile. See :ref:`tile_mode` for details. 

    .. index::
       triple: CGI; mode; zoomin

    ZOOMIN
        Switch to mode BROWSE with ZOOMDIR=1

    .. index::
       triple: CGI; mode; zoomout

    ZOOMOUT
        Switch to mode BROWSE with ZOOMDIR=-1

    .. note::
       The previously available map-only query modes, e.g.
       ITEMQUERYMAP, are no longer supported.  The `QFORMAT` parameter
       is now used instead.

.. index::
   pair: CGI; qformat

QFORMAT [outputformat | mime/type] (optional)
    The `OUTPUTFORMAT` name or mime/type to be used to process a set
    of query results (corresponds to the :ref:`WEB` object's
    QUERYFORMAT parameter).
    The parameter is optional and used in conjunction with query
    `MODE`\s.  The default is text/html.

    Example (map output):

    ::

       ...&mode=nquery&qformat=png24&...

.. index::
   pair: CGI; qitem

QITEM [name] (optional)
    The name of an attribute in a layer attribute table to query on. The
    parameter is optional and used in conjunction with the QSTRING for
    attribute queries.

.. index::
   pair: CGI; qlayer

QLAYER [name]
    Query layer. The name of the layer to be queried as it appears in the map
    file.

.. index::
   pair: CGI; qstring

QSTRING [expression]
    Attribute queries: Query string passed to the query function.
    Since 5.0, qstring will have to be specified in the `VALIDATION`
    parameter of the `LAYER` for qstring queries to work
    (*qstring_validation_pattern* `LAYER`-level `METADATA` for
    MapServer  versions prior to 5.4).

.. index::
   pair: CGI; queryfile

QUERYFILE [filename]
    Used with BROWSE or NQUERY mode. This option identifies a query file to
    load before any regular processing. In BROWSE mode this result in a query
    map being produced instead of a regular map. This is useful when you want
    to hilite a feature while still in a pan/zoom mode. In NQUERY mode you'd
    gain access to any of the templates used in normally presenting the query,
    so you have access to query maps AND attribute information.
    See the SAVEQUERY option.

.. index::
   pair: CGI; ref

REF
    The name associated with the inline reference map image used to record
    user clicks. What actually is passed are two variables, ref.x and ref.y.

    For the CGI Applications this is an essential variable when reference
    maps are used, see the examples for sample usage.

.. index::
   pair: CGI; refxy

REFXY [x] [y]
    Coordinates (in pixels) of a single mouse click in the reference image.
    Used in conjunction with Java based front ends to the MapServer.

.. index::
   pair: CGI; savequery

SAVEQUERY
    When used with any of the query modes this tells the MapServer to save the
    query results to a temporary file for use in subsequent operations
    (see QUERYFILE). Useful for making queries persistent.

.. index::
   pair: CGI; scaledenom

SCALEDENOM [number]
    Scale to create a new map at. Used with mapxy. Scale is given as the
    denominator of the actual scale fraction, for example for a map at a scale
    of 1:24,000 use 24000.  Implemented in MapServer 5.0, to replace the
    deprecated SCALE parameter.

SCALE [number] - deprecated
    Since MapServer 5.0 the proper parameter to use is SCALEDENOM
    instead.  The deprecated SCALE is the scale to create a new map at. Used
    with mapxy. Scale is given as the denominator of the actual scale fraction,
    for example for a map at a scale of 1:24,000 use 24000.

.. index::
   pair: CGI; searchmap

SEARCHMAP
    It is possible to do pan/zoom interfaces using querymaps. In these cases
    you will likey want information about the contents of the new map rather
    than the previous map which is the normal way queries work. When
    searchmap is specified the new map is created and it's extent is used
    to query layers. Useful with NQUERY mode only.

.. index::
   pair: CGI; shapeindex

SHAPEINDEX [index]
    Used for index queries (in conjunction with INDEXQUERY).

.. index::
   pair: CGI; slayer

SLAYER [name]
    Select layer. The name of the layer to be used for any of the feature
    (i.e. staged) query modes. The select layer must be a polygon layer. The
    selection feature(s) are available for presentation to the user.

.. index::
   pair: CGI; tileindex

TILEINDEX [index]
    Used for index queries (in conjunction with INDEXQUERY), used with tiled
    shapefile layers.

.. index::
   pair: CGI; zoom

ZOOM [number]
    Zoom scaling to apply to the creation of the new map. Values greater than
    0 resulting in zooming in, 0 is a pan, and values less than zero are for
    zooming out. A value of 2 means "zoom in twice".

    ZOOM can be used as a shortcut for the combination ZOOMDIR/ZOOMSIZE.
    The zoom is limited by the MINZOOM/MAXZOOM settings compiled into the
    MapServer (-25/25) by default.

.. index::
   pair: CGI; zoomdir

ZOOMDIR [1 | 0 | -1]
    Direction to zoom. See above.

.. index::
   pair: CGI; zoomsize

ZOOMSIZE [number]
    Absolute magnitude of a zoom. Used with ZOOMDIR.

    ZOOMDIR is limited to MAXZOOM compiled into the MapServer (25 by default).


.. index::
   single: Change map file parameters

.. _cgi_mapfile_change_parameters:

Changing map file parameters via a form or a URL
================================================

Beginning with version 3.3 it is possible to change virtually any map
file value from a form or a URL (see :ref:`RUNSUB`).  The syntax for
this is fairly straightforward, and depends on what version of
MapServer you are using.  One potentially very powerful use of this
ability to change mapfile parameters through a URL involves changing
class expressions on-the-fly.  `VALIDATION` is used to control
run-time substition.  Try it out.

.. warning::

  This functionality is only available via the :ref:`mapserv` CGI application.
  Within MapScript this is easy to do by yourself since the developer has
  complete control over how input is handled.



Using MapServer version >= 5
----------------------------

Previous versions of the MapServer CGI program allowed certain parameters
to be changed via a URL using a cumbersome syntax such as
map_layer_0_class_0_color=255+0+0 which changes the color in one classObj.
So, in the past you had to change parameters one-at-a-time. Now you can
pass chunks of mapfiles (with security restrictions) to the CGI interface.
The map_object notation is still necessary to identify which object you
want to modify but you can change multiple properties at one time. Note
that you can use either a '_' or a '.' to separate identifiers.

Example 1, changing a scalebar object:

::

  ...&map.scalebar=UNITS+MILES+COLOR+121+121+121+SIZE+300+2&...

Example 2, changing a presentation style:

::

 ...&map.layer[lakes].class[0].style[0]=SYMBOL+crosshatch+COLOR+151+51+151+SIZE+15&...

Example 3, creating a new feature:

::

  ...&map_layer[3]=FEATURE+POINTS+500000+1000000+END+TEXT+'A+test+point'+END&...

Example 4, set multiple web object parameters:

::

  ...&map_web=imagepath+/ms4w/tmp/ms_tmp/+imageurl+/ms_tmp/

Example 5, set the map size:

::

  ...&map_size=800+400

The variable identifies an object uniquely (by name or index in the
case of layerObj's and classObj's). The value is a snippet of a
mapfile. You cannot create new objects other than inline features at
this point.

Using MapServer version < 5
---------------------------

For MapServer version < 5, any value can be expressed using the
hierarchy used in a map file. A map contains a layer, which contains a
class, which contains a label, which has a color. This hierarchy is
expressed as a sequence of MapServer keywords separated by
underscores. For example to change the color of a layer called "lakes"
with only one class defined you would use a form variable named
"map_lakes_class_color" and could assign it a color like "0 0
255". Layers can be referenced by index (i.e. map_layer_0...) or by
name as shown above. Layer classes are referenced by index value
(i.e. map_layer_0_class_2). If there is only 1 class for a layer then
the index should be omitted. These variables must always begin with
the sequence "map\_". Values assigned must conform to the syntax of a
map file.

It is also possible to define inline features using this
mechanism. This is the only case where you can add on to the map
file. You can edit/change layer parameters but you cannot create a new
layer. With inline features you have to first create a feature and
then build upon it, however, the layer the feature belongs to must
exist. Here's a snippet from a GET request that adds a feature to a
webuser layer:

::

  ...&map_webuser_feature=new&map_webuser_feature_points=12345.6789+12345.6789
        &map_webuser_feature_text=My+House!&...

The "map_webuser_feature=new" creates a new feature for the webuser
layer.  All subsequent calls to the feature object for that layer will
modify the new feature. You can repeat the process to create
additional features. This is really intended for very small (point,
rectangle) amounts of data.

.. index::
   single: Apache variables

Specifying the location of mapfiles using an Apache variable
============================================================

Apache variables can be used to specify the location of map files
(instead of exposing full mapfile paths to the outside world).

1. Set the variable (in this example `MY_MAPFILE`) in Apache's
   httpd.conf:

   ::

          SetEnv MY_MAPFILE "/opt/mapserver/map1/mymapfile.map"

2. Refer to the variable in the mapserver CGI URL:

   ::

          http://localhost/cgi-bin/mapserv?map=MY_MAPFILE&mode=...



.. index::
   single: ROSA-Applet controls

ROSA-Applet Controls
====================

*note: Active development and maintenance of the ROSA Applet has stopped*

The ROSA Applet parameters were added to the CGI MapServer in version 3.6.
This Java Applet provides a more intuitive user interface to MapServer. The
MapTools site provides detailed information on the ROSA Applet.

The parameters can also be used by other interfaces/tools, if set to the right
values. Please note that the two parameters have to be handed over to te CGI
application in the order identified below.

INPUT_TYPE (auto_rect | auto_point)
    The INPUT_TYPE parameter is needed to identify if the coordinates handed
    over to the mapserver have to be interpreted as rectangular or point data.

INPUT_COORD [minx,miny;maxx,maxy]
    The ROSA-Applet always fills the pair of coordinates. In case of a point
    (input_type=auto_point) min and max coordinate are equal (MapServer
    uses the min value).
