====== MapServer ====== 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. * La documentación la encontraremos en: [[http://mapserver.org/documentation.html]] ===== Puesta a punto ===== ==== Instalación ==== 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.//". ==== Arquitectura interna ==== MapServer se compone de... * **MapFiles**: Archivos de texto para configurar la aplicación, definen el area del mapa e indican donde están los datos y como devolver las imágenes, también define las capas de un mapa (data source, proyecciones, simbología...). Han de tener la extensión ''.map'' porque sino no serán reconocidos. * **Datos geográficos**: MapServer puede leer distintos tipos de datos (aunque por defeccto lee ESRI shapefile). * **Páginas HTML**. 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. \\ {{ sistemas:gis:ms-arquitectura.png?500 |}} ===== MapFiles ===== 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: * Los comentarios serán indicados mediante el carácter '#'. * Serán parseados de arriba abajo, por lo tanto las layers indicadas al final serán dibujadas las últimas. * Siempre es recomendable utilizar rutas relativas y no absolutas, aunque son admitidas las dos. * Las rutas tendrán que ser indicadas entre comillas (simples o dobles, da igual). ==== Objetos ==== Estos son los objetos más utilizados internamente en un MapFile y sus propiedades: === MAP === * **EXTENT**, es la extensión del mapa resultado. * **SIZE**, es el tamaño del mapa. * **IMAGECOLOR**, el color de fondo del mapa. MAP NAME "sample" EXTENT -180 -90 180 90 # Geographic SIZE 800 400 IMAGECOLOR 128 128 255 END === LAYER === 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). === RASTER === LAYER NAME "bathymetry" TYPE RASTER STATUS DEFAULT DATA "bath_mapserver.tif" END === Layers vectoriales === 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 === Objetos CLASS y STYLE === 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 === SYMBOLS === 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 === LABEL === 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 === INCLUDE === 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 ===== Como... ===== ==== Crear un servicio WMS ==== * [[sistemas:gis#servicios_wms|Servicios WMS]] * [[http://mapserver.org/ogc/wms_server.html|Manual de MapServer sobre cómo hacerlo]] 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. ===== MapScript =====