Pouvez-vous réutiliser des fragments de XML (en quelque sorte de variables / références)?
-
22-07-2019 - |
Question
J'utilise SLD pour styliser la sortie de mon géoserveur. J'ai plusieurs types d'objets à afficher. Chaque type a des icônes différentes, mais la description textuelle est générée à partir des mêmes informations (champ de texte dans la base de données). Je ne peux pas utiliser object_type comme nom d'image car vous ne pouvez pas utiliser de variable dans le nom d'image (ou je ne sais pas comment le faire ...). Donc, j'ai SLD comme (sans parties sans importance):
<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>
Et ce que j'aimerais faire, c'est écrire TextSymbolizer une fois et l'utiliser à deux ou plusieurs endroits ... Je n'ai rien entendu de tel en XML, mais peut-être que vous l'avez fait? : -)
Une solution qui m'est venue est d'écrire un générateur très simple (xml.erb?: P) et de le laisser générer du XML ...
La solution
Le "Dynamic Symbolizer" de GeoServer L’extension to SLD vous permet d’utiliser les propriétés de la base de données sous forme de tout ou partie des URL d’icône. Vous pouvez même effectuer des calculs et appeler des fonctions de filtrage si vous le souhaitez (ils utilisent CQL intégré dans l'URL.
Voici un article de blog sur la fonctionnalité: http: / /blog.geoserver.org/2008/12/08/dynamic-symbolizers-part-1/
Autres conseils
Avez-vous essayé de définir un schéma XML ou éventuellement un DTD XML pour votre code XML, puis en utilisant identificateurs d'élément http://www.w3.org/TR/xmlschema-0/#schemaConstraintsVsXML1 , à peu près :
<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 comprend? http://www.xml.com/pub/a/ 2002/07/31 / xinclude.html