MS RFC 63: Built-in OpenLayers map viewer

Date

2010-09-25

Author

Daniel Morissette (dmorissette at mapgears.com)

Author

Alan Boudreault (aboudreault at mapgears.com)

Last Edited

2010-10-26

Status

Adopted on 2010-10-29. Implementation complete.

Version

MapServer 6.0

Overview

Users often request for a simple way to test mapfiles. This RFC proposes a simple way to preview, test and navigate a mapfile with MapServer using a built-in OpenLayers based map viewer that will be triggered via the cgi. This is for testing/development purposes only and not for production or deploying full-featured sites. This will use the a built-in openlayers template. It will return a simple html viewer based on OpenLayers.

Note that GeoServer already provides a similar functionality and this is what this RFC was inspired from.

Implementation Details

In order to implement this enhancement, the following changes should be made in the MapServer codebase:

  • Add a built-in openlayers template.

  • Some new template tags will be needed. These tags will be used to construct the mapserver cgi url.

    • [mapserv_onlineresource]

      or

    • [protocol]

    • [host]

    • [program]

    See ticket 3552 for more detail.

The template will be triggered using one of the following ways:

  • Using mode=browse&template=openlayers: The viewer will be initialized based on the mapfile defaults, and some of the traditional mapserv CGI params may also work (such as map size, layer selection, etc.)

  • Using FORMAT=application/openlayers in a WMS GetMap request: The rest of the GetMap parameters would be used to configure the map to view (BBOX, WIDTH, HEIGHT, LAYERS, etc.)

Both cases would call the same functions internally to produce a simple OpenLayers viewer with one singletile layer for the whole map with the selected layers.

Here’s the simple viewer html code that could be used:

<html>
<head>
  <title>MapServer Simple Viewer</title>
    <script src="http://www.mapserver.org/lib/OpenLayers-ms60.js"></script>
    </head>
    <body>
      <div style="width:[mapwidth]; height:[mapheight]" id="map"></div>
      <script defer="defer" type="text/javascript">
        var map = new OpenLayers.Map('map',
                                     {maxExtent: new OpenLayers.Bounds([minx],[miny],[maxx],[maxy]),
                                      maxResolution: [cellsize]} );

        var mslayer = new OpenLayers.Layer.MapServer( "MapServer Layer",
            "[mapserv_onlineresource]",
             {layers: '[layers]'},
             {singleTile: "true", ratio:1} );
        map.addLayer(mslayer);
        map.zoomToMaxExtent();
      </script>
</body>
</html>

OpenLayers Dependency

Obviously, this functionality needs the OpenLayers javascript library. A minimal build will be used and hosted on the MapServer website at http://www.mapserver.org/lib/OpenLayers-ms60.js. The “ms60” suffix in the OpenLayers-ms60.js filename is so that we can increase the version number in the future if/when needed to match the requirements of future releases of MapServer.

Users will also be able to use their own OpenLayers library in one of two ways:

  • Using a environment variable: by setting the environment variable MS_OPENLAYERS_JS_URL, MapServer will use that url rather than the default one.

  • Using a CONFIG setting in the mapfile: by adding the config variable MS_OPENLAYERS_JS_URL in a mapfile, MapServer will use that url rather than the default one.

Files affected

To determine…

Further Considerations

In the future, we may provide a mechanism to support multiple frameworks and ship generic templates with MapServer.

Bug ID

The ticket for RFC-63 (containing the implementation) can be found here.

Ticket 3549

Ticket 3552

Voting history

Adopted on 2010-10-29 with +1 from SteveL, DanielM, JeffK, AssefaY, TomK, TamasS, SteveW and PerryN.