Es un proyecto Open Source multiplataforma que al ser instalado permite mostrar mapas dinámicos a partir de una interfaz de red, tiene soporte en gran variedad de entornos de desarrollo (PHP, Python, Java, .NET…).
Nos permite realizar peticiones a capas raster, vectoriales o de bases de datos mediante una URL, también puede retornar imágenes de leyendas, de barras de escala, de mapas de referecia…
Puede ser extendido y configurado mediante MapScript o plantillas, y a la vez nos da la posibilidad de construir aplicaciones web enfocada a mapas.
MapServer se ejecuta como un CGI en el servidor HTTP Apache. Por lo tanto si lo instalasemos de cero en un sistema basado en Debian podríamos utilizar los siguientes comandos:
sudo apt-get install apache2 sudo apt-get install cgi-mapserver mapserver-bin mapserver-doc
Para ver qué paquetes están instalados haremos:
/usr/lib/cgi-bin/mapserv -v
Para comprobar si se ha instalado correctamente accederemos a la ruta (por ejemplo, en Ubuntu) cgi-bin/mapserv (por ejemplo http://192.168.1.105/cgi-bin/mapserv) y tendrá que devolver algo así como “No query information to decode. QUERY_STRING is set, but empty.”.
MapServer se compone de…
.map porque sino no serán reconocidos.
MapServer es un programa CGI y como tal no tiene estado, cada petición que se le hace es independiente y no es influida por las pasadas.
Los MapFiles son los archivos para configurar los mapas que sirve MapServer, la documentación de referencia la encontraremos en http://mapserver.org/mapfile/index.html#mapfile.
Los MapFiles son archivos de texto que especifican un mapa. Están divididos en diferentes secciones y su contenido ha de seguir las siguientes normas:
Estos son los objetos más utilizados internamente en un MapFile y sus propiedades:
MAP
NAME "sample"
EXTENT -180 -90 180 90 # Geographic
SIZE 800 400
IMAGECOLOR 128 128 255
END
El parámetro DATA indica a qué tipo se refiere el parémetro SHAPEPATH del objeto MAP, si no se definiese se tomaría como un shapefile (.shp).
LAYER
NAME "bathymetry"
TYPE RASTER
STATUS DEFAULT
DATA "bath_mapserver.tif"
END
Estas pueden ser del tipo point, line o polygon (parámetro TYPE), según lo que se quiera mostrar.
LAYER
NAME "world_poly"
DATA 'shapefile/countries_area.shp'
STATUS ON
TYPE POLYGON
CLASS
NAME 'The World'
STYLE
OUTLINECOLOR 0 0 0
END
END
END # layer
Son los utilizados para dar formato a los objetos LAYER.
CLASS
NAME "Primary Roads"
STYLE
SYMBOL "circle"
COLOR 178 114 1
SIZE 15
END #style1
STYLE
SYMBOL "circle"
COLOR 254 161 0
SIZE 7
END #style2
END
Se pueden definir directamente en el mapfile o en un fichero separado (entonces deberíamos utilizar el parámetro SYMBOLSET en el MAP). Por ejemplo:
MAP
NAME "sample"
EXTENT -180 -90 180 90 # Geographic
SIZE 800 400
IMAGECOLOR 128 128 255
SYMBOLSET "../etc/symbols.txt"
END # map
LAYER
...
CLASS
NAME "Ski Area"
STYLE
SYMBOL "ski"
END
END
END # layer
Y symbols.txt contendría:
SYMBOL
NAME "ski"
TYPE PIXMAP
IMAGE "ski.gif"
END
El objeto LAYER tiene el parámetro LABELITEM que puede ser utilizado en una columna específica en unos datos para referirse a un fichero FONTSET (el cual contiene una referencia a los nombres de fuentes posibles).
LABEL
FONT "sans-bold"
TYPE truetype
SIZE 10
POSITION LC
PARTIALS FALSE
COLOR 100 100 100
OUTLINECOLOR 242 236 230
END # label
Cualquier parte del mapfile puede ser almacenado en un fichero por separado y añadido mediante el parámetro INCLUDE, el nombre del fichero puede tener cualquier extensión y su ruta será siempre relativa al .map. De esa forma tanto las layers como los estilos pueden ser incluidos en multiples aplicaciones.
Por ejemplo, podríamos tener un fichero shadedrelief.lay:
LAYER
NAME 'shadedrelief'
STATUS ON
TYPE RASTER
DATA 'GLOBALeb3colshade.jpg'
END
Y el mapfile:
MAP
...
INCLUDE "shadedrelief.lay"
...
END
O incluir los objetos layers a parte:
NAME "base" # # include reference objects # INCLUDE "../templates/template.ref" # # Start of layer definitions # INCLUDE "../layers/usa/usa_outline.lay" INCLUDE "../layers/canada/base/1m/provinces.lay" INCLUDE "../layers/canada/base/1m/roads_atlas_of_canada_1m.lay" INCLUDE "../layers/canada/base/1m/roads_atlas_of_canada_1m_shields.lay" INCLUDE "../layers/canada/base/1m/populated_places.lay" END # Map File
Para que MapServer permita ser configurado como WMS ha de haber sido compilado con las librerías libcurl y Proj.4, para comprobar si realmente admite esta propiedad ejecutaremos mapsrv -v y tendrá que salir SUPPORTS=WMS_SERVER.
También será necesario definir un objeto METADATA en el MAP y en las LAYER.