Created
November 19, 2010 14:16
-
-
Save dwins/706564 to your computer and use it in GitHub Desktop.
Find layers using default styles and generate independent styles for each
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
from geoserver.catalog import Catalog | |
from itertools import cycle, izip | |
import re | |
_punc = re.compile(r"[\.:]") #regex for punctuation that confuses restconfig | |
_foregrounds = ["#ffbbbb", "#bbffbb", "#bbbbff", "#ffffbb", "#bbffff", "#ffbbff"] | |
_backgrounds = ["#880000", "#008800", "#000088", "#888800", "#008888", "#880088"] | |
_marks = ["square", "circle", "star", "cross", "x", "triangle"] | |
_style_contexts = izip(cycle(_foregrounds), cycle(_backgrounds), cycle(_marks)) | |
def _add_sld_boilerplate(symbolizer): | |
""" | |
Wrap an XML snippet representing a single symbolizer in the approperiate | |
elements to make it a valid SLD which applies that symbolizer to all features, | |
including format strings to allow interpolating a "name" variable in. | |
""" | |
return """ | |
<StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" | |
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"> | |
<NamedLayer> | |
<Name>%(name)s</Name> | |
<UserStyle> | |
<Name>%(name)s</Name> | |
<FeatureTypeStyle> | |
<Rule> | |
""" + symbolizer + """ | |
</Rule> | |
</FeatureTypeStyle> | |
</UserStyle> | |
</NamedLayer> | |
</StyledLayerDescriptor> | |
""" | |
_raster_template = """ | |
<RasterSymbolizer> | |
<Opacity>1.0</Opacity> | |
</RasterSymbolizer> | |
""" | |
_polygon_template = """ | |
<PolygonSymbolizer> | |
<Fill> | |
<CssParameter name="fill">%(bg)s</CssParameter> | |
</Fill> | |
<Stroke> | |
<CssParameter name="stroke">%(fg)s</CssParameter> | |
</Stroke> | |
</PolygonSymbolizer> | |
""" | |
_line_template = """ | |
<LineSymbolizer> | |
<Stroke> | |
<CssParameter name="stroke">%(bg)s</CssParameter> | |
</Stroke> | |
</LineSymbolizer> | |
<LineSymbolizer> | |
<Stroke> | |
<CssParameter name="stroke">%(fg)s</CssParameter> | |
<CssParameter name="stroke-dasharray">2 2</CssParameter> | |
</Stroke> | |
</LineSymbolizer> | |
""" | |
_point_template = """ | |
<PointSymbolizer> | |
<Graphic> | |
<Mark> | |
<WellKnownName>%(mark)s</WellKnownName> | |
<Fill> | |
<CssParameter name="fill">%(bg)s</CssParameter> | |
</Fill> | |
<Stroke> | |
<CssParameter name="stroke">%(fg)s</CssParameter> | |
</Stroke> | |
</Mark> | |
<Size>10</Size> | |
</Graphic> | |
</PointSymbolizer> | |
""" | |
_style_templates = dict( | |
raster = _add_sld_boilerplate(_raster_template), | |
polygon = _add_sld_boilerplate(_polygon_template), | |
line = _add_sld_boilerplate(_line_template), | |
point = _add_sld_boilerplate(_point_template) | |
) | |
def _style_name(lyr): | |
return _punc.sub("_", lyr.name) | |
if __name__ == "__main__": | |
cat = Catalog("http://localhost:8080/geoserver/rest", "admin", "geoserver") | |
for lyr in cat.get_layers(): | |
if lyr.default_style.name in _style_templates: | |
print lyr, "uses a default style, generating a new one" | |
name = lyr.name | |
fg, bg, mark = _style_contexts.next() | |
sld = _style_templates[lyr.default_style.name] % dict(name=name, fg=fg, bg=bg, mark=mark) | |
style = cat.create_style(name, sld) | |
lyr.default_style = cat.get_style(name) | |
cat.save(lyr) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment