【问题标题】:Add a new filter into SLD将新过滤器添加到 SLD
【发布时间】:2026-01-22 21:45:01
【问题描述】:

我想更新我的 sld。在我的 sld 中,没有过滤器,但我想使用 python 动态地应用过滤器,而不是通过手动将值放入 sld 中。这是我的 sld。

<StyledLayerDescriptor 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" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd">`
<NamedLayer>
<Name>Simple polygon with stroke</Name>
<UserStyle>
<Title>SLD Cook Book: Simple polygon with stroke</Title>
<FeatureTypeStyle>
<Rule>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#000080</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">#FFFFFF</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

现在我想在我的表属性 name_1 上添加一个过滤器,有没有办法在 python 中做到这一点。新过滤器将位于 Rule 标记中,并将位于 FeatureTypeStyle 下。

【问题讨论】:

    标签: python sld xml


    【解决方案1】:

    Python SLD

    好吧,我使用 python-sld 包来动态创建 SLD 结构。

    您可以在这里找到http://azavea.github.io/python-sld/ 该项目。 我必须说文档并不详尽,所以很多时候你必须尝试错误才能做你想做的事。对我来说,必须用创建的新 SLD 覆盖现有的 SLD,我无法修改现有的。

    这样说,一旦你安装了包:

    创建 SLD 结构

    from sld import StyledLayerDescriptor, PolygonSymbolizer, Filter
    
    mysld = StyledLayerDescriptor()
    nl = mysld.create_namedlayer('Simple polygon with stroke')
    ustyle = nl.create_userstyle()
    fts = ustyle.create_featuretypestyle()
    

    第一条规则

    fts.create_rule('First Rule', PolygonSymbolizer)
    
    mysld.NamedLayer.UserStyle.FeatureTypeStyle.Rules[0].PolygonSymbolizer.Fill.CssParameters[0].Value = '#000080'
    mysld.NamedLayer.UserStyle.FeatureTypeStyle.Rules[0].PolygonSymbolizer.Stroke.CssParameters[0].Value = '#FFFFFF'
    mysld.NamedLayer.UserStyle.FeatureTypeStyle.Rules[0].PolygonSymbolizer.Stroke.CssParameters[1].Value = '2'
    

    第二个规则和过滤器

    fts.create_rule('Second Rule', PolygonSymbolizer)
    
    fts.Rules[1].create_filter('name_1', comparator, value)
    

    规则示例:

    fts.Rules[1].create_filter('name_1', '>=', '0')
    

    您可以在创建规则和添加变量的过滤器中做很多事情,例如我这样编码:

    fts.create_rule(str(int(round(e))) + '-' + str(int(round(v[i + 1]))), PolygonSymbolizer)
    
    fts.Rules[i].create_filter(field, '>=', str(e))
    

    希望能有所帮助,祝福。

    【讨论】: