您可以重用 XML 片段(以某种变量/引用的方式)吗?
-
22-07-2019 - |
题
我在用 斯拉德 设置我的地理服务器的输出样式。我有几种类型的对象要显示。每种类型都有不同的图标,但文本描述是根据相同的信息(数据库中的文本字段)生成的。我无法使用 object_type 作为图像名称,因为您不能在图像名称中使用变量(或者我不知道该怎么做...)。所以我有 SLD 就像(没有不重要的部分):
<StyledLayerDescriptor>
<NamedLayer>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>1</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/1.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">12</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#110011</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Halo />
</TextSymbolizer>
</Rule>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>2</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/2.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">12</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#110011</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Halo />
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
我想做的就是编写一次 TextSymbolizer 并在两个或更多地方使用它......我还没有听说过 XML 中的类似内容,但也许您听说过?:-)
我想到的一种解决方案是编写一些非常简单的生成器(xml.erb?:P) 并让它生成 XML...
解决方案
的GeoServer的“动态符号化”扩展SLD并允许您使用数据库属性的全部或图标的URL的一部分。你甚至可以进行计算,如果你想调用的过滤功能(它们在URL中使用嵌入式CQL。
下面是在要素上的博客文章: HTTP:/ /blog.geoserver.org/2008/12/08/dynamic-symbolizers-part-1/
其他提示
您是否尝试过定义一个 XML模式 或可选地 XML DTD 为您的 XML,然后使用 元素标识符 http://www.w3.org/TR/xmlschema-0/#schemaConstraintsVsXML1, , 就像是:
<StyledLayerDescriptor>
<NamedLayer>
<CommonStyles>
<TextSymbolizer id="name_times_normal_12">
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">12</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#110011</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Halo />
</TextSymbolizer>
</CommonStyles>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>1</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/1.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer ref="#name_times_normal_12" />
</Rule>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>2</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/2.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer ref="#name_times_normal_12" />
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
不隶属于 StackOverflow