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')
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')
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)
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)