# BSD Licensed, Copyright (c) 2006-2008 MetaCarta, Inc. from TileCache.Service import Request, Capabilities import TileCache.Layer as Layer class TMS (Request): def parse (self, fields, path, host): # /1.0.0/global_mosaic/0/0/0.jpg parts = filter( lambda x: x != "", path.split("/") ) if not host[-1] == "/": host = host + "/" if len(parts) < 1: return self.serverCapabilities(host) elif len(parts) < 2: return self.serviceCapabilities(host, self.service.layers) else: layer = self.getLayer(parts[1]) if len(parts) < 3: return self.layerCapabilities(host, layer) else: parts[-1] = parts[-1].split(".")[0] tile = None if layer.tms_type == "google" or (fields.has_key('type') and fields['type'] == 'google'): res = layer.resolutions[int(parts[2])] maxY = int( round( (layer.bbox[3] - layer.bbox[1]) / (res * layer.size[1]) ) ) - 1 tile = Layer.Tile(layer, int(parts[3]), maxY - int(parts[4]), int(parts[2])) else: tile = Layer.Tile(layer, int(parts[3]), int(parts[4]), int(parts[2])) return tile def serverCapabilities (self, host): return Capabilities("text/xml", """ """ % host) def serviceCapabilities (self, host, layers): xml = """ """ for name, layer in layers.items(): profile = "none" if (layer.srs == "EPSG:4326"): profile = "global-geodetic" elif (layer.srs == "OSGEO:41001"): profile = "global-mercator" xml += """ """ % (host, name, layer.srs, layer.name, profile) xml += """ """ return Capabilities("text/xml", xml) def layerCapabilities (self, host, layer): tms_type = layer.tms_type or "default" xml = """ %s %s %s """ % (host, tms_type, layer.name, layer.description, layer.srs, layer.bbox[0], layer.bbox[1], layer.bbox[2], layer.bbox[3], layer.bbox[0], layer.bbox[1], layer.size[0], layer.size[1], layer.format(), layer.extension) for z, res in enumerate(layer.resolutions): xml += """ """ % ( host, layer.name, z, res, z) xml += """ """ return Capabilities("text/xml", xml)