Source code for TileCache.Services.WMS
# BSD Licensed, Copyright (c) 2006-2010 TileCache Contributors
from TileCache.Service import Request, Capabilities
import TileCache.Layer as Layer
[docs]class WMS (Request):
[docs] 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)
[docs] def getMap (self, param):
bbox = map(float, param["bbox"].split(","))
layers = param["layers"].split(",")
tiles = []
for name in layers:
tile = self.getLayer(name).getTile(bbox)
if not tile:
raise Exception(
"couldn't calculate tile index for layer %s from (%s)"
% (layer.name, bbox))
tiles.append(tile)
if len(tiles) > 1:
return tiles
else:
return tiles[0]
[docs] 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 = """<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
<!DOCTYPE WMT_MS_Capabilities SYSTEM
"http://schemas.opengeospatial.net/wms/1.1.1/WMS_MS_Capabilities.dtd" [
<!ELEMENT VendorSpecificCapabilities (TileSet*) >
<!ELEMENT TileSet (SRS, BoundingBox?, Resolutions,
Width, Height, Format, Layers*, Styles*) >
<!ELEMENT Resolutions (#PCDATA) >
<!ELEMENT Width (#PCDATA) >
<!ELEMENT Height (#PCDATA) >
<!ELEMENT Layers (#PCDATA) >
<!ELEMENT Styles (#PCDATA) >
]>
<WMT_MS_Capabilities version="1.1.1">
<Service>
<Name>OGC:WMS</Name>
<Title>%s</Title>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="%s"/>
</Service>
""" % (description, host)
xml += """
<Capability>
<Request>
<GetCapabilities>
<Format>application/vnd.ogc.wms_xml</Format>
<DCPType>
<HTTP>
<Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="%s"/></Get>
</HTTP>
</DCPType>
</GetCapabilities>""" % (host)
xml += """
<GetMap>"""
for format in formats:
xml += """
<Format>%s</Format>\n""" % format
xml += """
<DCPType>
<HTTP>
<Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="%s"/></Get>
</HTTP>
</DCPType>
</GetMap>
</Request>""" % (host)
xml += """
<Exception>
<Format>text/plain</Format>
</Exception>
<VendorSpecificCapabilities>"""
for name, layer in self.service.layers.items():
resolutions = " ".join(["%.20f" % r for r in layer.resolutions])
xml += """
<TileSet>
<SRS>%s</SRS>
<BoundingBox SRS="%s" minx="%f" miny="%f"
maxx="%f" maxy="%f" />
<Resolutions>%s</Resolutions>
<Width>%d</Width>
<Height>%d</Height>
<Format>%s</Format>
<Layers>%s</Layers>
<Styles></Styles>
</TileSet>""" % (
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 += """
</VendorSpecificCapabilities>
<UserDefinedSymbolization SupportSLD="0" UserLayer="0"
UserStyle="0" RemoteWFS="0"/>
<Layer>
<Title>TileCache Layers</Title>"""
for name, layer in self.service.layers.items():
xml += """
<Layer queryable="0" opaque="0" cascaded="1">
<Name>%s</Name>
<Title>%s</Title>
<SRS>%s</SRS>
<BoundingBox SRS="%s" minx="%f" miny="%f"
maxx="%f" maxy="%f" />
</Layer>""" % (
name, layer.name, layer.srs, layer.srs,
layer.bbox[0], layer.bbox[1], layer.bbox[2], layer.bbox[3])
xml += """
</Layer>
</Capability>
</WMT_MS_Capabilities>"""
return Capabilities("text/xml", xml)