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'])