- Add first draft of getfeatureinfo support with text/plain and text/xml support.

- ignore a SCons file
- Add 'encoding' statement to the demo.
This commit is contained in:
Jean-Francois Doyon 2007-02-20 00:22:04 +00:00
parent 0196cb3334
commit 2513da8f79
4 changed files with 68 additions and 11 deletions

View file

@ -291,19 +291,25 @@ class WMSBaseServiceHandler(BaseServiceHandler):
def GetFeatureInfo(self, params, querymethodname='query_point'):
m = self._buildMap(params)
output = ''
if params['info_format'] == 'text/plain':
writer = TextFeatureInfo()
elif params['info_format'] == 'text/xml':
writer = XMLFeatureInfo()
for layerindex, layername in enumerate(params['query_layers']):
if layername in params['layers']:
if m.layers[layerindex].queryable:
for feature in getattr(m, querymethodname)(layerindex, params['i'], params['j']):
output += '[%s]\n' % m.layers[layerindex].name
features = getattr(m, querymethodname)(layerindex, params['i'], params['j'])
if features:
writer.addlayer(m.layers[layerindex].name)
for feature in features:
writer.addfeature()
for prop in feature.properties:
output += '%s=%s\n' % (prop.key(), prop.data())
writer.addattribute(prop.key(), prop.data())
else:
raise OGCException('Requested query layer "%s" is not marked queryable.' % layername, 'LayerNotQueryable')
else:
raise OGCException('Requested query layer "%s" not in the LAYERS parameter.' % layername)
return Response('text/plain', output)
return Response(params['info_format'], str(writer))
def _buildMap(self, params):
if str(params['crs']) not in self.allowedepsgcodes:
@ -359,7 +365,7 @@ class BaseExceptionHandler:
fh = StringIO()
print_tb(excinfo[2], None, fh)
fh.seek(0)
message = '\n' + fh.read() + '\n' + str(excinfo[0]) + ': ' + ', '.join(excinfo[1].args) + '\n'
message = '\n' + fh.read() + '\n' + str(excinfo[0]) + ': ' + ', '.join(str(excinfo[1].args)) + '\n'
fh.close()
elif len(excinfo[1].args) > 0:
message = excinfo[1].args[0]
@ -406,4 +412,55 @@ class BaseExceptionHandler:
class Projection(MapnikProjection):
def epsgstring(self):
return self.params().split('=')[1].upper()
return self.params().split('=')[1].upper()
class TextFeatureInfo:
def __init__(self):
self.buffer = ''
def addlayer(self, name):
self.buffer += '[%s]\n' % name
def addfeature(self):
self.buffer += '\n'
def addattribute(self, name, value):
self.buffer += '%s=%s\n' % (name, str(value))
def __str__(self):
return self.buffer
class XMLFeatureInfo:
basexml = """<?xml version="1.0"?>
<resultset>
</resultset>
"""
def __init__(self):
self.rootelement = ElementTree.fromstring(self.basexml)
def addlayer(self, name):
layer = ElementTree.Element('layer')
layer.set('name', name)
self.rootelement.append(layer)
self.currentlayer = layer
def addfeature(self):
feature = ElementTree.Element('feature')
self.currentlayer.append(feature)
self.currentfeature = feature
def addattribute(self, name, value):
attribute = ElementTree.Element('attribute')
attname = ElementTree.Element('name')
attname.text = name
attvalue = ElementTree.Element('value')
attvalue.text = value.unicode()
attribute.append(attname)
attribute.append(attvalue)
self.currentfeature.append(attribute)
def __str__(self):
return '<?xml version="1.0"?>\n' + ElementTree.tostring(self.rootelement)

View file

@ -56,7 +56,7 @@ class ServiceHandler(WMSBaseServiceHandler):
'bgcolor': ParameterDefinition(False, ColorFactory, ColorFactory('0xFFFFFF')),
'exceptions': ParameterDefinition(False, str, 'application/vnd.ogc.se_xml', ('application/vnd.ogc.se_xml', 'application/vnd.ogc.se_inimage', 'application/vnd.ogc.se_blank')),
'query_layers': ParameterDefinition(True, ListFactory(str)),
'info_format': ParameterDefinition(True, str, allowedvalues=('text/plain',)),
'info_format': ParameterDefinition(True, str, allowedvalues=('text/plain', 'text/xml')),
'feature_count': ParameterDefinition(False, int, 1),
'x': ParameterDefinition(True, int),
'y': ParameterDefinition(True, int)
@ -72,7 +72,7 @@ class ServiceHandler(WMSBaseServiceHandler):
['keywordlist', 'KeywordList', str]
]
capabilitiesxmltemplate = """<?xml version='1.0' encoding="UTF-8" standalone="no"?>
capabilitiesxmltemplate = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE WMT_MS_Capabilities SYSTEM "http://www.digitalearth.gov/wmt/xml/capabilities_1_1_1.dtd">
<WMT_MS_Capabilities version="1.1.1" updateSequence="0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.opengis.net/wms">
<Service>

View file

@ -57,7 +57,7 @@ class ServiceHandler(WMSBaseServiceHandler):
'bgcolor': ParameterDefinition(False, ColorFactory, ColorFactory('0xFFFFFF')),
'exceptions': ParameterDefinition(False, str, 'XML', ('XML', 'INIMAGE', 'BLANK')),
'query_layers': ParameterDefinition(True, ListFactory(str)),
'info_format': ParameterDefinition(True, str, allowedvalues=('text/plain',)),
'info_format': ParameterDefinition(True, str, allowedvalues=('text/plain', 'text/xml')),
'feature_count': ParameterDefinition(False, int, 1),
'i': ParameterDefinition(True, float),
'j': ParameterDefinition(True, float)

View file

@ -56,7 +56,7 @@ m.background = Color('white')
# table= TODO
provpoly_lyr = Layer('Provinces')
provpoly_lyr.datasource = Shapefile(file='../data/boundaries')
provpoly_lyr.datasource = Shapefile(file='../data/boundaries', encoding='latin1')
# We then define a style for the layer. A layer can have one or many styles.
# Styles are named, so they can be shared across different layers.