Source code for wms.maps
import mapscript
from django.conf import settings
from .symbols import WmsSymbolSet
[docs]class WmsMap():
"""
Map objects representing mapserver map files.
"""
layer_classes = []
symbolset_class = WmsSymbolSet
title = 'Django-wms service'
srs = ['4326', '3086', '3857']
enable_requests = ['GetMap', 'GetLegendGraphic', 'GetCapabilities']
legend_size = (20, 20)
def __init__(self):
"""
Method to setup map object based on the input parameters. The map
object represents the mapserver mapfile and is used to render
the wms requests.
"""
self.map_object = mapscript.mapObj()
self.register_symbolset()
self.register_layers()
# Set map object properties
self.map_object.setProjection('init=epsg:4326')
self.map_object.setExtent(-180, -90, 180, 90)
self.map_object.setSize(500, 500)
self.map_object.setMetaData('wms_title', self.title)
self.map_object.setMetaData('wms_srs', 'epsg:' + ' epsg:'.join(self.srs))
self.map_object.setMetaData('wms_enable_request',
' '.join(self.enable_requests))
self.map_object.outputformat.transparent = mapscript.MS_ON
# Set legend item size
self.map_object.legend.keysizex = self.legend_size[0]
self.map_object.legend.keysizey = self.legend_size[1]
# Allow debugging
if settings.DEBUG:
self.map_object.debug = mapscript.MS_ON
[docs] def get_layers(self):
"""
Instantiates and returns a list of layers for this map.
"""
# Create layer instances
return [layer() for layer in self.layer_classes]
[docs] def register_layers(self):
"""
Registers all layer objects into a map object.
"""
# Get layers
layers = self.get_layers()
# Check for naming consistency
names = [layer.name for layer in layers]
if len(names) > 1 and len(set(names)) != len(names):
raise ValueError('Found two identical layer names in single map. '\
'Specify unique names for layers. This error be due to '\
'automatic naming which uses the model name as layer name '\
'by default.')
# Register layers
for layer in layers:
# Get layer
dispatched_layer = layer.dispatch_by_type()
# Update symbol index if symbol name was given
# This is necessary because mapscript links the symbol index from
# the map level symbolset with the layer level style object. So
# this step can not be executed when instantiating the layer.
i = 0
while dispatched_layer.getClass(i):
style = dispatched_layer.getClass(i).getStyle(0)
if style.symbolname:
style.setSymbolByName(self.map_object, style.symbolname)
i += 1
# Insert layer object into map
self.map_object.insertLayer(dispatched_layer)
[docs] def register_symbolset(self):
"""Registers a symbol set in the current map"""
symbolset = self.symbolset_class()
# Add symbols
for symb in symbolset.get_symbols():
self.map_object.symbolset.appendSymbol(symb)