jueves, 28 de mayo de 2009

Mapserver (II): mi primer experiencia

Bueno, aca dejo lo que documente como primer experiencia, despues de esto a volar solos:

PARTE 2: EJEMPLOS

hola mundo
Antes que nada saber que los cambios efectuados en mapserver 5.2.2 en algunos casos han sido radicales.
Lo primero es crear en el repositorio de datos /home/mapdata, nuestro mapfile (archivo de configuracion y construccion de nuestro mapa).
En este caso se va a llamar hola.map

Recomiendo por el momento, o darle todos los permisos a este directorio, o bien asignarlo a nuestro usuario o anexarlo a nuestro usuario junto al user nobody.
Ver 'man usermod' 'man chown' y 'man chmod'.

Una vez hecho lo anterior, creamos el archivo:
$ touch hola.map

usamos nuestro editor de texto y tipeamos:
MAP
# Este es nuestro 'hola mundo' mapfile
NAME "Hello_Word"
SIZE 400 300
IMAGECOLOR 249 245 186
IMAGETYPE png
EXTENT -1.00 -1.00 1.00 1.00
WEB
TEMPLATE "/var/www/html/hola.html"
IMAGEPATH "/var/www/html/tmp/"
IMAGEURL "/tmp/"
END
LAYER
STATUS default
TYPE point
FEATURE
POINTS 0.0 0.0 END
TEXT "HOLA MUNDO"# USA 2 ESPACIOS!
END # end FEATURE
CLASS
STYLE
COLOR 255 0 0
END
LABEL
TYPE bitmap
END
END # end CLASS
END # end LAYER
END # end MAPFILE
END

Podemos ver la frase "HOLA MUNDO" y entre las dos palabras un diminuto punto rojo.

Palabras claves usadas en este mapfile
MAP: Declaracion fundamental, en la primera linea de nuestro mapfile. Indicamos que este archivo es un mapa
NAME: Este es el nombre de nuestro proyecto, el cual se replicara a todos los archivos relacionados.
SIZE: Tamaño del area de vizualizacion del mapa.
IMAGECOLOR: Color de fondo del area de visualizacion en formato RGB(*).
IMAGETYPE: Tipo de imagen resultante final, en este caso 'png'.
EXTENT: (**).
WEB: instertar un obejto web en el proyecto, se cierra modulo con END.
TEMPLATE: path donde se encuentra la plantilla html (en este caso hola.html) dentro del DocumentRoot del server apache.
IMAGEPATH: path donde se encuentran las imagenes dentro del DocumentRoot del server apache.
IMAGEURL: Referenciado al raiz del DocumentRoot (html/) del server apache.
LAYER: Objeto de representacion de elemento a renderizar, tambien se puede pensar como una capa, se cierra con END.
STATUS: estado on|off de renderizacion.
TYPE: tipo de elemento a crear para luego ser renderizado (en este caso un punto).
FEATURE: Creacion de las caracteristicas del objeto, se cierra con END.
POINTS: lista 2 pares de coordenadas que representaran al punto.
TEXT: Muestra un texto en pantalla.
CLASS: Objeto de clase, define los atributos del punto en este caso, se cierra con END.
STYLE: Objeto de estilo del simbolo, el punto en este caso.
COLOR: color del punto.
LABEL: Objeto etiqueta. Define tipos de fonts, tamaño, color, etc. Cierra con END.
TYPE: Objeto tipo, especifica el tipo de font usado, en este caso 'bitmap' indica a MapServer que utilice su propio renderizado interno.
Las dos posibilidades son:
bitmap y truetype
END: indica el cierre de cada declaracion de objetos.

Los paths, representaciones de caracteres tales como 'TEXT' SIEMPRE deben indicarse con comillas, simples o dobles, es indistinto.
(*)FORMATO RGB: Se expresa en una terna de nros octales, representando cada unidad un color basico (Red - Green - Blue) el cual el '0' representa la ausencia de color, llegando al nro. maximo representado por el '255' indicando presencia total del color, asi una indicacion tal como '0 0 0' representara el colo NEGRO, una '255 255 255' representara el color BLANCO y en este caso una '255 0 0' al color ROJO.

(**)EXTENT: representacion de la extension (area rectangular) del mapa en dos pares de unidades de valor, con coordenadas en esquinas opuestas. un ejemplo a este EXTENT seria: EXTENT [X(x' y')] [Y(x'' y'')].
Esto se representaria graficamente de la siguiente forma aproximada:
1 area definida por EXTENT:
Ahora necesitamos crear el archivo de invocacion e inicializacion de nuestro mapfile, que sera guardado dentro de nuestro DocumentRoot en apache (en este caso /var/www/html)
# touch hola.html

insertamos en él:<br /><br /><br /><br />

<!-- MapServer Template -->

<html>

<head><title>MapServer HOLA MUNDO</title></head>

<body>

<form method=POST action="/cgi-bin/mapserv">

<input type="submit" value="cliqueame">

<input type="hidden" name="map" value="/home/mapdata/hello.map">

<input type="hidden" name="map_web" value="imagepath /var/www/html/tmp/ imageurl /tmp/">

</form>

<IMG SRC="[img]" with=400 heigth=300 border=0>

</body>

</html>

Como se puede observar, es una pequeña pagina web, la cual envia todos los datos necesarios, para poder mostrar a posteriori la representacion grafica.

Cabe destacar que el tag [img] no es una URL valida, pero MapServer la utiliza como variable interna de generacion y representacion de la imagen creada, entonces, la 1era vez que ejecutemos hola.html, veremos un vinculo roto de imagen, luego al hacer clic y pasar los datos a MapServer, éste generará un grafico y lo alojara donde anteriormente lo definimos en nuestro hola.map.

Una vez generada la imagen esta se representara, reemplazando el tag [img] por el correspondiente, recien creado.
Cabe destacar que para no perder 2 dias de tiempo tratando de solucionar errores, es fundamental tomar como parametro este documento html para futuras implementaciones.

He aqui los errores mas comunes
En el navegador:
***msLoadMap(): Unknown identifier. First token must be MAP, this doesn't look like a mapfile.***
Solucion:
Falta la palabra clave 'MAP' en la 1er linea de nuestro hola.map

En el navegador:
Content-type: text/html isValidTemplate(): Web application error. Missing magic string, /var/www/html/hola.html doesn't look like a MapServer template.
Solucion:
Agregar en la 1era linea de nuestro archivo de inicializacion 'hola.html':


En el navegador:
loadWeb(): Unknown identifier. Parsing error near (/var/www/htdocs/tmp/):(line 1)
Solucion:
En viejas representaciones de MapServer se utilizaba en nuestro hola.html algo como esto:

Actualmente MapServer redefinio la forma de recibir los datos via CGI, asi que este tipo de linea debe ser reemplazado por este tipo:

ADVERTENCIA: los paths son solo meramente ilustrativos, tu configuracion puede ser diferente!

En el navegador:
****ERROR: msPostMapParseOutputFormatSetup(): General error message. Unable to select IMAGETYPE `JPG'.
Solucion:
No reconoce la sintaxis JPG, cambiar en la plantilla (primero.map) JPG por JPEG.
Estos son los errores que obtuve mientras trabajaba con MapServer.

FIN DEL DOCUMENTO
gracias por leer!

6 comentarios:

  1. Hola. Al momento de ejecutar me dice que El archivo «/cgi-bin/mapserv» no se ha encontrado. Yo lo instale en Debian. No se si me puedas ayudar. Gracias

    ResponderEliminar
  2. Saludos

    @mr_winter: padre de 4 hijos con 34 años??? vale por el artículo. Por ahora, empiezo a estudiar lo referente al map file y a OpenLayers, ya nos veremos por los lares de los SIGs

    @CatastralVSMJ cómo lo instalaste? puedes verificar que éstá instalado? reiniciaste (dudo que tenga que ver, pero por sia caso) apache luego de instalarlo?

    ResponderEliminar
  3. Amigo cordial saludo..
    tengo un pobremita y quiro pedirte el favor de ayudarme.!

    resulta qeu segui los pasos que ilustraste para la instalacion de mapserver y to sale bien hasta el momento de probar el archivo hola mundo..

    y me topo con el siguiente error "loadWeb(): Unknown identifier. Parsing error near (imagepath):(line 1)"..

    al final de este blog se encuentran algunos de los problemas que a ti se te presentaron y algunas posibles soluciones..
    a mi me parece que tu sufriste el mismo problema que yo y aparece de esta manera "En el navegador:
    loadWeb(): Unknown identifier. Parsing error near (/var/www/htdocs/tmp/):(line 1)
    Solucion:
    En viejas representaciones de MapServer se utilizaba en nuestro hola.html algo como esto:

    Actualmente MapServer redefinio la forma de recibir los datos via CGI, asi que este tipo de linea debe ser reemplazado por este tipo: " cuando vas a explicar la posibloe sintaxis de las solucion es no aoarece nada , no aclaras cuales son..!!

    de evrdad te pido ayuda con este problema..
    muchas gracias

    ResponderEliminar
  4. hola amigo tengo el mismo problema solo que al dar tu solucion no aparece las sintaxis para poder corregirlos si pudieras reescribirloas gracias

    ResponderEliminar
  5. a mi no me sale ningun error solo q no m muestra la imagen del mapa pero me lo carga a la carpeta temporal e mi archivos que podria ser eso

    ResponderEliminar
  6. hola, aunque esta conversación ya es de años tengo un problema con el mapserver que me está volviendo loca. Soy novatisima y estoy utilizándolo leyendo tutoriales y foros, pero me sale un error que no encuentro la solución por ningún lado. Cuando creo el ejemplo de página de inicio (inicio.html) al pinchar en el botón de "iniciar" me sale esto: msOWSPreParseRequest(): OWS error. POST request is empty.

    He creado el archivo .map como pone en la página pero no hay manera. Espero que alguien me pueda echar una mano. Un saludo y gracias por todo.

    ResponderEliminar