XMLのフラグメントを(ある種の変数/参照方法で)再利用できますか?
-
22-07-2019 - |
質問
SLD を使用して、ジオサーバーからの出力のスタイルを設定しています。表示するオブジェクトのタイプがいくつかあります。各タイプには異なるアイコンがありますが、テキストの説明は同じ情報(データベースのテキストフィールド)から生成されます。 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を書き、それを2つ以上の場所で使用することです。 :-)
1つの解決策は、非常に単純なジェネレーター(xml.erb?:P)を記述し、XMLを生成できるようにすることです...
解決
GeoServerの「Dynamic Symbolizer」 SLDの拡張により、データベースのプロパティをアイコンURLのすべてまたは一部として使用できます。必要に応じて、計算を実行し、フィルター関数を呼び出すこともできます(URLに埋め込まれたCQLを使用します。
この機能に関するブログ投稿: http:/ /blog.geoserver.org/2008/12/08/dynamic-symbolizers-part-1/
他のヒント
XMLスキーマ、またはオプションで XMLのXML DTD を使用し、要素識別子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>
XMLに含まれていますか? http://www.xml.com/pub/a/ 2002/07/31 / xinclude.html