diff --git a/src/komap.py b/src/komap.py index 28d0734..6011a24 100644 --- a/src/komap.py +++ b/src/komap.py @@ -20,6 +20,13 @@ from debug import debug, Timer from mapcss import MapCSS import sys from libkomapnik import * + +try: + import psyco + psyco.full() +except ImportError: + pass + minzoom = 10 maxzoom = 11 @@ -67,9 +74,15 @@ for zoom, zsheet in mapniksheet.iteritems(): mfile.write(xml_style_start()) for entry in zsheet[zindex]: if entry["type"] in ("way", "area", "polygon"): - - sql.update(entry["sql"]) - itags.update(entry["chooser"].get_interesting_tags(entry["type"], zoom)) + if "fill-color" in entry["style"]: + mfile.write(xml_rule_start()) + mfile.write(x_scale) + rulestring = " or ".join([rule[0].get_mapnik_filter() for rule in entry["rule"]]) + mfile.write(xml_filter(rulestring)) + mfile.write(xml_polygonsymbolizer(entry["style"].get("fill-color", "black"), entry["style"].get("fill-opacity", "1"))) + sql.update(entry["sql"]) + itags.update(entry["chooser"].get_interesting_tags(entry["type"], zoom)) + mfile.write(xml_rule_end()) sql = [i[1] for i in sql] #print sql, itags mfile.write(xml_style_end()) diff --git a/src/libkomapnik.py b/src/libkomapnik.py index bcab01f..7cf9b20 100644 --- a/src/libkomapnik.py +++ b/src/libkomapnik.py @@ -28,6 +28,8 @@ db_user = "mapz" db_name = "gis" +substyles = [] + last_id = 0 @@ -55,7 +57,8 @@ def xml_linesymbolizer(color="#000000", width="1", opacity="1", linecap="butt", return """ %s - %f + %s + %s %s %s """(color, float(width), float(opacity), linejoin, linecap) @@ -63,15 +66,16 @@ def xml_linesymbolizer(color="#000000", width="1", opacity="1", linecap="butt", def xml_polygonsymbolizer(color="#000000", opacity="1"): color = nicecolor(color) - linecap = {"none":"butt",}.get(linecap.lower(), linecap) + return """ - - %s - %f - - """(color, float(width), float(opacity), linejoin, linecap) - + + %s + %s + """%(color, float(opacity)) +def xml_filter(string): + return """ + %s"""%string def xml_scaledenominator(z1, z2=False): z1, z2 = zoom_to_scaledenom(z1,z2) @@ -92,7 +96,9 @@ def xml_end(): def xml_style_start(): + global substyles layer_id = get_id(1) + substyles.append(layer_id) return """ """ +def xml_rule_start(): + return """ + """ + +def xml_rule_end(): + return """ + """ + def xml_layer(type="postgis", geom="point", interesting_tags = "*", sql = ["true","d"] ): - layer_id = get_id() ## increment by 0 - was incremented in style + layer_id = get_id(1) ## increment by 0 - was incremented in style interesting_tags = "\", \"".join(interesting_tags) interesting_tags = "\""+ interesting_tags+"\"" sql = " OR ".join(sql) + global substyles + subs = "\n".join(["s%s"%i for i in substyles]) + substyles = [] + return """ - s%s + %s (select %s, way @@ -121,4 +139,4 @@ def xml_layer(type="postgis", geom="point", interesting_tags = "*", sql = ["true %s %s - """%(layer_id, db_proj, layer_id, interesting_tags, table_prefix, geom, sql, db_user, db_name) \ No newline at end of file + """%(layer_id, db_proj, subs, interesting_tags, table_prefix, geom, sql, db_user, db_name) \ No newline at end of file diff --git a/src/mapcss/Condition.py b/src/mapcss/Condition.py index 6ed4e7a..3b85fd4 100644 --- a/src/mapcss/Condition.py +++ b/src/mapcss/Condition.py @@ -101,6 +101,35 @@ class Condition: return params[0], '"%s" IS NOT NULL'%(params[0]) except KeyError: pass + def get_mapnik_filter(self): + params = [re.escape(x) for x in self.params] + t = self.type + try: + if t == 'eq': + return '[%s] = \'%s\''%(params[0], params[1]) + if t == 'ne': + return 'not([%s] = \'%s\')'%(params[0], params[1]) + if t == 'regex': + return '[%s].match(%s)'%(params[0], params[1]) + if t == 'true': + return '[%s] = \'yes\''%(params[0]) + if t == 'untrue': + return '[%s] = \'no\''%(params[0]) + if t == 'set': + return 'not([%s] = \'\')'%(params[0]) + if t == 'unset': + return '[%s] = \'\''%(params[0]) + + if t == '<': + return '"%s" < %s'%(params[0], float(params[1])) + if t == '<=': + return '"%s" <= %s'%(params[0], float(params[1])) + if t == '>': + return '"%s" > %s'%(params[0], float(params[1])) + if t == '>=': + return '"%s" >= %s'%(params[0], float(params[1])) + except KeyError: + pass def __repr__(self): return "%s %s "%(self.type, repr(self.params)) def Number(tt):