|
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 |