Style : motifs & poncifs

Introduction

Il existe plusieurs façons de décrire un motif selon la norme SLD et de l’appliquer à un objet géographique dans GeOxygene qui implémente cette norme. Cette page a pour objectif d’illustrer le plus exhaustivement possible les différents cas :

  • avec différentes méthodes (répétition le long d’un contour ou distribution dans une forme),
  • selon le mode d’implantation des objets (point, ligne, polygone),
  • selon les différents formats de motifs (image png ou gif, image svg, forme SLD)

Méthodes de rendu

La classe GraphicFill

La classe GraphicFill modélise la méthode de rendu qui consiste à remplir une forme par répétition régulière d’un motif.

Cela peut être réalisé de façon très classique à l’intérieur d’un polygone, mais également à l’intérieur d’un contour (de point, de ligne ou de polygone).

Il n’y a pas pour l’instant de paramètre d’agencement des motifs à l’intérieur de la forme (ni prévu par la norme ni implémenté dans GeOxygene). Cependant il est possible de remplir la forme par une image du motif afin de :

  • gérer l’espacement entre motifs (en ajoutant plus de blanc autour du motif)
  • créer un motif irégulier (en ajoutant plus d’un blanc d’un côté du motif)
  • réaliser un motif en quinconce

Plus d’explication en images:

Motif élémentaire
documentation/resources/img/motif/circle.png
../../_images/circles-green.png
Rendu sur un polygone
../../_images/Motif_GraphicFill_circle.png
../../_images/Motif_GraphicFill_circles_vert.png
<PolygonSymbolizer uom="http://www.opengeospatial.org/se/units/metre">
	<Stroke>
		<CssParameter name="stroke">#007F0E</CssParameter>
		<CssParameter name="stroke-opacity">0.8</CssParameter>
		<CssParameter name="stroke-width">1.0</CssParameter>
	</Stroke>
	<GeometryPropertyName>geom</GeometryPropertyName>
	<Fill>
		<GraphicFill>
			<Graphic>
				<opacity>1.0</opacity>
				<Size>10.0</Size>
				<Rotation>
					<Literal>0</Literal>
				</Rotation>
				<ExternalGraphic>
					<href>file:/D:\motif\circles-purple.png</href>
					<Format>png</Format>
				</ExternalGraphic>
			</Graphic>
		</GraphicFill>
		<CssParameter name="fill">#ffffff</CssParameter>
		<CssParameter name="fill-opacity">1.0</CssParameter>
	</Fill>
</PolygonSymbolizer>

La classe GraphicStroke

La classe GraphicStroke modélise la méthode de rendu qui consiste à répéter un motif le long d’un objet linéaire.

Cela peut donc être réalisé sur une ligne, mais également sur le contour d’un polygone ou d’un point.

Implémentation dans GeOxygene

../../_images/DC_GeOxygene_SE.png

Figure 1 : Diagramme de classes des classes Symbolizer dans GeOxygene

Des exemples de constructions de tels styles sont disponibles dans la classe SLDDemoApplication.java

Des fichiers SLD avec des exemples de styles sont également disponibles dans les ressources du module appli (dossier sld).

Un exemple de GraphicFill sur un LineSymbolizer :

  /**
   * Le Graphic Fill permet de répéter une forme dans le remplissage d'une
   * ligne. Cette forme peut être une image (ExternalGraphic) ou une forme
   * prédéfinie (Mark).
   */
  public void exampleGraphicFill_Line() {
    Layer layer = projectFrame.getSld().createLayer("GraphicFill_Line",
        GM_LineString.class, Color.green, Color.red, 1f, 4);
    LineSymbolizer symbolizer = (LineSymbolizer) layer.getSymbolizer();
    GraphicFill graphicFill = new GraphicFill();
    Graphic graphic = new Graphic();
    graphic.setSize(5f);

    // --------------- Exemple avec un Graphic de type image ----------------------------------
    // --------------------- Image au format svg
    ExternalGraphic circle = new ExternalGraphic();
    URL url = SLDDemoApplication.class.getResource("/images/circles.svg");
    circle.setHref(url.toString());
    circle.setFormat("svg");
    graphic.getExternalGraphics().add(circle);

    graphicFill.getGraphics().add(graphic);
    symbolizer.getStroke().setGraphicType(graphicFill);

    Population<DefaultFeature> pop = new Population<DefaultFeature>("GraphicFill_Line");
    pop.add(new DefaultFeature(new GM_LineString(new DirectPositionList(
        new DirectPosition(10, 120), new DirectPosition(10, 170),
        new DirectPosition(60, 170), new DirectPosition(60, 220),
        new DirectPosition(110, 220)))));
    projectFrame.getDataSet().addPopulation(pop);
    projectFrame.getSld().add(layer);
  }

Un exemple de GraphicStroke sur un PolygonSymbolizer :

  /**
   * Le Graphic Stroke permet de répéter une forme le long d'une ligne. Cette
   * forme peut être une image (ExternalGraphic) ou une forme prédéfinie (Mark).
   */
  public void exampleGraphicStroke_Stroke_Polygon() {
    Layer layer = projectFrame.getSld().createLayer(
        "GraphicStroke_Stroke_Polygon", //$NON-NLS-1$
        GM_Polygon.class, Color.red, Color.yellow, 1f, 1);
    PolygonSymbolizer symbolizer = (PolygonSymbolizer) layer.getSymbolizer();
    GraphicStroke graphicStroke = new GraphicStroke();

    // --------------- Exemple avec un graphic de type image
    // ----------------------------------
    Graphic graphicCircle = new Graphic();
    graphicCircle.setSize(20f);
    ExternalGraphic externalGraphicCircle = new ExternalGraphic();
    URL urlCircle = SLDDemoApplication.class.getResource("/images/circle.png"); //$NON-NLS-1$
    externalGraphicCircle.setHref(urlCircle.toString());
    externalGraphicCircle.setFormat("png"); //$NON-NLS-1$
    graphicCircle.getExternalGraphics().add(externalGraphicCircle);
    graphicStroke.getGraphics().add(graphicCircle);

    // --------------- Exemple avec un graphic de type Mark
    // ----------------------------------
    // Graphic graphicStar = new Graphic();
    // graphicStar.setSize(8f);
    // Mark markStar = new Mark();
    //        markStar.setWellKnownName("star"); //$NON-NLS-1$
    // Fill fillStar = new Fill();
    // fillStar.setColor(new Color(1.f,0.4f,0.4f));
    // markStar.setFill(fillStar);
    // graphicStar.getMarks().add(markStar);
    // graphicStroke.getGraphics().add(graphicStar);

    symbolizer.getStroke().setGraphicType(graphicStroke);

    Population<DefaultFeature> pop = new Population<DefaultFeature>(
        "GraphicStroke_Stroke_Polygon"); //$NON-NLS-1$
    pop.add(new DefaultFeature(new GM_Polygon(
        new GM_Envelope(120, 220, 10, 110))));
    projectFrame.getDataSet().addPopulation(pop);
    projectFrame.getSld().add(layer);
  }

Exemples de rendus

  LineSymbolizer PolygonSymbolizer
  Stroke Stroke Fill
GraphicFill
../../_images/GraphicFill_Stroke_Line.png
../../_images/GraphicFill_Stroke_Polygon.png
../../_images/GraphicFill_Fill_Polygon.png
GraphicStroke
../../_images/GraphicStroke_Stroke_Line.png
../../_images/GraphicStroke_Stroke_Polygon.png