from vectorformats.Formats.Format import Format
import re, xml.dom.minidom as m
class WFS(Format):
layername = "layer"
def encode(self, features, **kwargs):
results = ["""
"""]
for feature in features:
results.append( self.encode_feature(feature))
results.append("""""")
return "\n".join(results)
def encode_feature(self, feature):
layername = re.sub(r'\W', '_', self.layername)
attr_fields = []
for key, value in feature.properties.items():
key = re.sub(r'\W', '_', key)
attr_value = value
if hasattr(attr_value,"replace"):
attr_value = attr_value.replace("&", "&").replace("<", "<").replace(">", ">")
if isinstance(attr_value, str):
attr_value = unicode(attr_value, "utf-8")
attr_fields.append( "%s" % (key, attr_value,key) )
xml = """
%s
%s
""" % (layername, feature.id, self.geometry_to_gml(feature.geometry), "\n".join(attr_fields), layername)
return xml
def geometry_to_gml(self, geometry):
"""
>>> w = WFS()
>>> print w.geometry_to_gml({'type':'Point', 'coordinates':[1.0,2.0]})
1.0,2.0
>>> w.geometry_to_gml({'type':'LineString', 'coordinates':[[1.0,2.0],[2.0,1.0]]})
'1.0,2.0 2.0,1.0'
"""
if geometry['type'] == "Point":
coords = ",".join(map(str, geometry['coordinates']))
return "%s" % coords
elif geometry['type'] == "LineString":
coords = " ".join(",".join(map(str, coord)) for coord in geometry['coordinates'])
return "%s" % coords
elif geometry['type'] == "Polygon":
coords = " ".join(map(lambda x: ",".join(map(str, x)), geometry['coordinates'][0]))
out = """
%s
""" % coords
inner_rings = []
for inner_ring in geometry['coordinates'][1:]:
coords = " ".join(map(lambda x: ",".join(map(str, x)), inner_ring))
inner_rings.append("""
%s
""" % coords)
return """
%s %s
""" % (out, "\n".join(inner_rings))
else:
raise Exception("Could not convert geometry of type %s." % geometry['type'])