enero 22, 2010 Archives

vie, 2010-01-22 09:54:58 -0500

Mapserver + Mapscript + web.py

Recientemente he utilizado mapscript con web.py para generar mapas que sean generados en tiempo de ejecución, esta porción de código permite leer archivos .map y luego se renderizan con las opciones habituales de mapserver para WMS, el método POST adiciona algunas lines para permitir el uso de un servicio WFS dentro de mapserver.

Se puede utilizar jinja2 o algún otro manejador de templates para cambiar el .map en tiempo de ejecución y de esta forma poder enviar algún parámetro adicional para realizar cambios en el servicio WMS o WFS.

import web
import mapscript


# URLS
urls = (
    '/','Basic',
)


class Basic:
    """Layers Basics
    """
    def GET(self):

        vars = web.input()
        if len(vars)==0:
            return info_layer(Basic)
        req = mapscript.OWSRequest()
        for i in vars.keys():
            req.setParameter( i, vars[i])


        map = mapscript.mapObj('basic.map')

        mapscript.msIO_installStdoutToBuffer()
        map.OWSDispatch( req )

        content_type = mapscript.msIO_stripStdoutBufferContentType()
        content = mapscript.msIO_getStdoutBufferBytes()
        web.header("Content-Type","%s; charset=utf-8"%(content_type))
        return content


    def POST(self):

        vars = web.input()
        req = mapscript.OWSRequest()
        for i in vars.keys():
            req.setParameter( i, vars[i])

        req.postrequest=web.data()
        req.type=mapscript.MS_POST_REQUEST
        map = mapscript.mapObj('basic.map')

        mapscript.msIO_installStdoutToBuffer()
        map.OWSDispatch( req )

        content_type = mapscript.msIO_stripStdoutBufferContentType()
        content = mapscript.msIO_getStdoutBufferBytes()
        web.header("Content-Type","%s; charset=utf-8"%(content_type))
        return content

app = web.application(urls, globals())

#web.internalerror = web.debugerror 


if __name__ == "__main__":
    app.run()