# BSD Licensed, Copyright (c) 2006-2008 MetaCarta, Inc. from TileCache.Service import Request, Capabilities import TileCache.Layer as Layer class WMS (Request): def parse (self, fields, path, host): param = {} for key in ['bbox', 'layers', 'request', 'version']: if fields.has_key(key.upper()): param[key] = fields[key.upper()] elif fields.has_key(key): param[key] = fields[key] else: param[key] = "" if param["request"] == "GetCapabilities": return self.getCapabilities(host + path, param) else: return self.getMap(param) def getMap (self, param): bbox = map(float, param["bbox"].split(",")) layer = self.getLayer(param["layers"]) tile = layer.getTile(bbox) if not tile: raise Exception( "couldn't calculate tile index for layer %s from (%s)" % (layer.name, bbox)) return tile def getCapabilities (self, host, param): if host[-1] not in "?&": if "?" in host: host += "&" else: host += "?" metadata = self.service.metadata if "description" in metadata: description = metadata["description"] else: description = "" formats = {} for layer in self.service.layers.values(): formats[layer.format()] = 1 formats = formats.keys() xml = """ ]> OGC:WMS %s """ % (description, host) xml += """ application/vnd.ogc.wms_xml """ % (host) xml += """ """ for format in formats: xml += """ %s\n""" % format xml += """ """ % (host) xml += """ text/plain """ for name, layer in self.service.layers.items(): resolutions = " ".join(["%.20f" % r for r in layer.resolutions]) xml += """ %s %s %d %d %s %s """ % ( layer.srs, layer.srs, layer.bbox[0], layer.bbox[1], layer.bbox[2], layer.bbox[3], resolutions, layer.size[0], layer.size[1], layer.format(), name ) xml += """ TileCache Layers""" for name, layer in self.service.layers.items(): xml += """ %s %s %s """ % ( name, layer.name, layer.srs, layer.srs, layer.bbox[0], layer.bbox[1], layer.bbox[2], layer.bbox[3]) xml += """ """ return Capabilities("text/xml", xml)