示例#1
0
    def wms(self):
        """This is a WMS endpoint.

        It uses mapserver mapscript to process a WMS request.

        This endpoint requires an additional WMS parameter
        DATA_URL. The DATA_URL, should point to a downloadable file
        which can be used as raster data input for mapserver.
        """
        LOG.debug('Processing ows request')

        data_url = None
        try:
            data_url = self.request.GET.getone('DATA_URL')
        except:
            LOG.warn('No data_url provided')
            data_url = None
            # FIXME: should return an error here)

        # get location of local data file
        loc = fetch_file(self.request, data_url)
        # get map
        map = self._get_map()
        # setup layer
        # TODO: improve selection of Layer generator
        # TODO: use python-magic for a more reliable mime type detection
        mimetype, encoding = mimetypes.guess_type(loc)
        if mimetype == 'image/tiff':
            layer = TiffLayer(self.request, loc)
        elif mimetype == 'text/csv':
            layer = CSVLayer(self.request, loc)
        elif mimetype == 'application/zip':
            datadir, filename = os.path.split(loc)
            # fname, fext = os.path.splitext(filename)

            # Check if shape/gdb file exists.
            # if os.path.isfile(os.path.join(datadir, fname + ".shp")):
            #    dbFilename = os.path.join(datadir, fname + ".shp")
            # elif os.path.isdir(os.path.join(datadir, fname)) and fname.endswith(".gdb"):
            #    dbFilename = os.path.join(datadir, fname)
            # else:
            #    msg = "Invalid zip file '{}' -- is not in shape/gdb format.".format(filename)
            #    raise HTTPNotImplemented(msg)

            # FIXME: filename shall be gdb/shape filename
            layer = ShapeLayer(self.request, filename)
        else:
            msg = "Unknown file type '{}'.".format(mimetype)
            # HTTPBadRequest(msg)
            raise HTTPNotImplemented(msg)

        # add layer into map
        idx = layer.add_layer_obj(map)
        # set map projection and extent from layer data
        lx = map.getLayer(idx).getExtent()
        map.extent = mapscript.rectObj(lx.minx, lx.miny, lx.maxx, lx.maxy)
        map.setProjection = "init={}".format(layer._data['crs'])

        # prepare an ows request object
        # do some map processing here
        ows_req = mapscript.OWSRequest()
        # our layer.add_layer_obj applies SLD and SLD_BODY
        # copy request params into ows request except not these two
        for k, v in ((k, v)for (k, v) in self.request.params.items() if k.lower() not in ('sld', 'sld_body', 'data_url')):
            ows_req.setParameter(k, v)
        # req.setParameter('SERVICE', 'WMS')
        # req.setParameter('VERSION', '1.3.0')
        # req.setParameter('REQUEST', 'GetCapablities')

        # here is probably some room for optimisation
        # e.g. let mapscript write directly to output?
        #      write tile to file system and serve tile via some other means?
        #      cache tile or at least mapobj?
        wms_req = self.request.params['REQUEST']
        wms_ver = self.request.params.get('VERSION', '1.3.0')
        # now do something based on REQUEST:
        if wms_req == u'GetMap':
            res = map.loadOWSParameters(ows_req, wms_ver)  # if != 0 then error
            img = map.draw()
            return Response(img.getBytes(), content_type=img.format.mimetype)
        elif wms_req == u'GetCapabilities':
            mapscript.msIO_installStdoutToBuffer()
            res = map.OWSDispatch(ows_req)  # if != 0 then error
            content_type = mapscript.msIO_stripStdoutBufferContentType()
            content = mapscript.msIO_getStdoutBufferBytes()
            return Response(content, content_type=content_type)
        elif wms_req == u'GetFeatureInfo':
            res = map.loadOWSParameters(ows_req, wms_ver)  # if != 0 then error
            mapscript.msIO_installStdoutToBuffer()
            res = map.OWSDispatch(ows_req)  # if != 0 then error
            content_type = mapscript.msIO_stripStdoutBufferContentType()
            content = mapscript.msIO_getStdoutBufferBytes()
            return Response(content, content_type=content_type)

        # We shouldn't end up here.....
        # let's raise an Error
        # FIXME: I am sure there are better pyramid ways to return errors
        raise Exception('request was not handled correctly')
示例#2
0
    def wms(self):
        """This is a WMS endpoint.

        It uses mapserver mapscript to process a WMS request.

        This endpoint requires an additional WMS parameter
        DATA_URL. The DATA_URL, should point to a downloadable file
        which can be used as raster data input for mapserver.
        """
        LOG.debug('Processing ows request')

        data_url = None
        try:
            data_url = self.request.GET.getone('DATA_URL')
        except:
            LOG.warn('No data_url provided')
            data_url = None
            # FIXME: should return an error here)

        # get location of local data file
        loc = fetch_file(self.request, data_url)
        # get map
        map = self._get_map()
        # setup layer
        # TODO: improve selection of Layer generator
        # TODO: use python-magic for a more reliable mime type detection
        mimetype, encoding = mimetypes.guess_type(loc)
        if mimetype == 'image/tiff':
            layer = TiffLayer(self.request, loc)
        elif mimetype == 'text/csv':
            layer = CSVLayer(self.request, loc)
        elif mimetype == 'application/zip':
            datadir, filename = os.path.split(loc)
            # fname, fext = os.path.splitext(filename)

            # Check if shape/gdb file exists.
            # if os.path.isfile(os.path.join(datadir, fname + ".shp")):
            #    dbFilename = os.path.join(datadir, fname + ".shp")
            # elif os.path.isdir(os.path.join(datadir, fname)) and fname.endswith(".gdb"):
            #    dbFilename = os.path.join(datadir, fname)
            # else:
            #    msg = "Invalid zip file '{}' -- is not in shape/gdb format.".format(filename)
            #    raise HTTPNotImplemented(msg)

            # FIXME: filename shall be gdb/shape filename
            layer = ShapeLayer(self.request, filename)
        else:
            msg = "Unknown file type '{}'.".format(mimetype)
            # HTTPBadRequest(msg)
            raise HTTPNotImplemented(msg)

        # add layer into map
        idx = layer.add_layer_obj(map)
        # set map projection and extent from layer data
        lx = map.getLayer(idx).getExtent()
        map.extent = mapscript.rectObj(lx.minx, lx.miny, lx.maxx, lx.maxy)
        map.setProjection = "init={}".format(layer._data['crs'])

        # prepare an ows request object
        # do some map processing here
        ows_req = mapscript.OWSRequest()
        # our layer.add_layer_obj applies SLD and SLD_BODY
        # copy request params into ows request except not these two
        for k, v in ((k, v) for (k, v) in self.request.params.items()
                     if k.lower() not in ('sld', 'sld_body', 'data_url')):
            ows_req.setParameter(k, v)
        # req.setParameter('SERVICE', 'WMS')
        # req.setParameter('VERSION', '1.3.0')
        # req.setParameter('REQUEST', 'GetCapablities')

        # here is probably some room for optimisation
        # e.g. let mapscript write directly to output?
        #      write tile to file system and serve tile via some other means?
        #      cache tile or at least mapobj?
        wms_req = self.request.params['REQUEST']
        wms_ver = self.request.params.get('VERSION', '1.3.0')
        # now do something based on REQUEST:
        if wms_req == u'GetMap':
            res = map.loadOWSParameters(ows_req, wms_ver)  # if != 0 then error
            img = map.draw()
            return Response(img.getBytes(), content_type=img.format.mimetype)
        elif wms_req == u'GetCapabilities':
            mapscript.msIO_installStdoutToBuffer()
            res = map.OWSDispatch(ows_req)  # if != 0 then error
            content_type = mapscript.msIO_stripStdoutBufferContentType()
            content = mapscript.msIO_getStdoutBufferBytes()
            return Response(content, content_type=content_type)
        elif wms_req == u'GetFeatureInfo':
            res = map.loadOWSParameters(ows_req, wms_ver)  # if != 0 then error
            mapscript.msIO_installStdoutToBuffer()
            res = map.OWSDispatch(ows_req)  # if != 0 then error
            content_type = mapscript.msIO_stripStdoutBufferContentType()
            content = mapscript.msIO_getStdoutBufferBytes()
            return Response(content, content_type=content_type)

        # We shouldn't end up here.....
        # let's raise an Error
        # FIXME: I am sure there are better pyramid ways to return errors
        raise Exception('request was not handled correctly')
示例#3
0
    def wfs(self):
        """This is a WFS endpoint.

        It uses mapserver mapscript to process a WFS request.

        This endpoint requires an additional WFS parameter
        DATA_URL. The DATA_URL, should point to a downloadable file
        which can be used as raster data input for mapserver.
        """
        LOG.debug('Processing ows request')

        data_url = None
        try:
            data_url = self.request.GET.getone('DATA_URL')
        except:
            LOG.warn('No data_url provided')
            data_url = None

        # get location of local data file
        # FIXME: May not be required if data is from DB
        if data_url:
            loc = fetch_file(self.request, data_url)

        # get map
        map = self._get_map()

        # Check that appropriate files are already exist.
        datadir, filename = os.path.split(loc)
        #fname, fext = os.path.splitext(filename)
        #if fext == '.zip':
        # Check if shape file exists.
        #if os.path.isfile(os.path.join(datadir, fname + ".shp")):
        #    dbFilename = os.path.join(datadir, fname + ".shp")
        #elif os.path.isdir(os.path.join(datadir, fname)) and fname.endswith(".gdb"):
        #    dbFilename = os.path.join(datadir, fname)
        #else:
        #    msg = "Invalid zip file '{}' -- is not in shape/gdb format.".format(filename)
        #    raise HTTPNotImplemented(msg)
        #else:
        #    raise HTTPNotImplemented("Invalid zip file '{}'".format(filename))

        # if DB server is configured, get layer data from DB server. Otherwise get data from db file.
        # FIXME: filename shall be gdb/shape filename
        layer = ShapeLayer(self.request, filename)

        # add the shape layer into map
        idx = layer.add_layer_obj(map)

        # set map projection and extent from layer data
        lx = map.getLayer(idx).getExtent()
        map.extent = mapscript.rectObj(lx.minx, lx.miny, lx.maxx, lx.maxy)
        map.setProjecntion = "init={}".format(layer._data['crs'])

        # prepare an ows request object by copying request params
        ows_req = mapscript.OWSRequest()
        ows_req.loadParamsFromURL(self.request.query_string)

        # here is probably some room for optimisation
        # e.g. let mapscript write directly to output?
        #      write tile to file system and serve tile via some other means?
        #      cache tile or at least mapobj?
        wfs_req = self.request.params['REQUEST']
        wfs_ver = self.request.params.get('VERSION', '1.1.0')

        # now do something based on REQUEST:
        mapscript.msIO_installStdoutToBuffer()
        res = map.OWSDispatch(ows_req)  # if != 0 then error
        content_type = mapscript.msIO_stripStdoutBufferContentType()
        content = mapscript.msIO_getStdoutBufferBytes()
        return Response(content, content_type=content_type)
示例#4
0
    def wfs(self):
        """This is a WFS endpoint.

        It uses mapserver mapscript to process a WFS request.

        This endpoint requires an additional WFS parameter
        DATA_URL. The DATA_URL, should point to a downloadable file
        which can be used as raster data input for mapserver.
        """
        LOG.debug("Processing ows request")

        data_url = None
        try:
            data_url = self.request.GET.getone("DATA_URL")
        except:
            LOG.warn("No data_url provided")
            data_url = None

        # get location of local data file
        # FIXME: May not be required if data is from DB
        if data_url:
            loc = fetch_file(self.request, data_url)

        # get map
        map = self._get_map()

        # Check that appropriate files are already exist.
        datadir, filename = os.path.split(loc)
        # fname, fext = os.path.splitext(filename)
        # if fext == '.zip':
        # Check if shape file exists.
        # if os.path.isfile(os.path.join(datadir, fname + ".shp")):
        #    dbFilename = os.path.join(datadir, fname + ".shp")
        # elif os.path.isdir(os.path.join(datadir, fname)) and fname.endswith(".gdb"):
        #    dbFilename = os.path.join(datadir, fname)
        # else:
        #    msg = "Invalid zip file '{}' -- is not in shape/gdb format.".format(filename)
        #    raise HTTPNotImplemented(msg)
        # else:
        #    raise HTTPNotImplemented("Invalid zip file '{}'".format(filename))

        # if DB server is configured, get layer data from DB server. Otherwise get data from db file.
        # FIXME: filename shall be gdb/shape filename
        layer = ShapeLayer(self.request, filename)

        # add the shape layer into map
        idx = layer.add_layer_obj(map)

        # set map projection and extent from layer data
        lx = map.getLayer(idx).getExtent()
        map.extent = mapscript.rectObj(lx.minx, lx.miny, lx.maxx, lx.maxy)
        map.setProjecntion = "init={}".format(layer._data["crs"])

        # prepare an ows request object by copying request params
        ows_req = mapscript.OWSRequest()
        ows_req.loadParamsFromURL(self.request.query_string)

        # here is probably some room for optimisation
        # e.g. let mapscript write directly to output?
        #      write tile to file system and serve tile via some other means?
        #      cache tile or at least mapobj?
        wfs_req = self.request.params["REQUEST"]
        wfs_ver = self.request.params.get("VERSION", "1.1.0")

        # now do something based on REQUEST:
        mapscript.msIO_installStdoutToBuffer()
        res = map.OWSDispatch(ows_req)  # if != 0 then error
        content_type = mapscript.msIO_stripStdoutBufferContentType()
        content = mapscript.msIO_getStdoutBufferBytes()
        return Response(content, content_type=content_type)