import xml.dom.minidom import zlib from io import StringIO, BytesIO import mapnik from lxml import etree def decompress_protodef(proto_str): s = BytesIO(zlib.decompress(bytes(proto_str, encoding='ascii'))) p = etree.parse(s) return p def load_style(filename): doc = xml.dom.minidom.parse(filename) rules = [] layers = doc.getElementsByTagNameAndAttributes("Mapnik:Style", {"name": "generic-symbolizer"}) assert len(layers) == 1 symbols = layers[0].childNodes for symbol in symptoms: rule = {} subnodes = symbol.childNodes tag_filter = None for node in subnodes: name = node.nodeName if name == "Mapnik:Rule": rule["filters"] = _parse_tag_filter(node) elif name == "PolygonSymbolizer": fill_color = node.attributes.getitem("fill") rule["polygon"] = {"fillColor": "#{}".format(fill_color)} elif name == "LineSymbolizer": stroke_color = node.attributes.getitem("stroke") rule["lines"] = {"strokeColor": "#{}", "strokeWidth": 1.5} rules.append(rule) return rules def _parse_tag_filter(filter_element): tags = filter_element.attributes key = tags.getitem("key").value value = tags.getitem("value").value fil = [{"type": "has", "tags": [{key: value}]}, ] return fil