FR:Osmarender/Fr:Rules

From OpenStreetMap Wiki
Jump to: navigation, search

Contents

Développer les styles Osmarender

Si vous prévoyez de créer un nouveau style de rendu, jetez un oeil sur le guide des styles où nous tentons de donner quelques lignes directrices.

Grammaire du fichier de règles

Le fichier de règles (rule file) est un fichier xml qui spécifie les règles du rendu. La structure basic est une liste de règles de sélection suivies par des instructions de rendu qui sont exécutées séquenciellement. Les objets dessinés plus tard se situeront au dessus des objets dessinés plus tôt. Par exemple:

  <rule e="way" k="highway" v="primary">
     ...
  </rule>
  <rule e="way" k="highway" v="motorway">
     ...
  </rule>

Chaque règle spécifie quels éléments doivent être sélectionnés à partir d'une paire clé/valeur (key/value) (par exemple, e="way" k="highway" v="motorway" sélectionnera tous les chemins tagués avec 'highway' et la valeur 'motorway'). Il précise ensuite ce qui doit être fait avec les noeuds (nodes) et chemins (ways) ainsi sélectionnés. L'ensemble des instructions actuelles permet de dessiner des lines, circles, symbols et text.

Les règles peuvent s'emboîter. Ceci permet la création d'instructions de rendu basés sur une combinaison de clés/valeurs. Par exemple, la règle suivante sélectionnera uniquement les lieux de culte ("place_of_worship") anglicans ("anglican"):

 <rule e="node" k="amenity" v="place_of_worship">
   <rule e="node" k="denomination" v="anglican">
     ...
   </rule>
 </rule>
  

Règles

<rule>

 <rule e="elementList" k="keyList" v="valueList" 
   [s="selector"] 
   [layer="layer"] 
   [horizontalProximity="degrees" verticalProximity="degrees"]>
    ...
 </rule>

<else>

 <else>
    ...
 </else>

La règle <else> sélectionne tous les éléments qui n'ont pas été sélectionnés par le <rule> précédent.

Instructions de rendu

Les instructions suivantes indiquent à Osmarender ce qu'il faut faire avec les éléments sélectionnés par une règle:

Chaque instruction de rendu peut contenir des attributs de style SVG ou peut faire référence à une classe qui est définie dans une feuille de style CSS intégré. Ainsi, toute la puissance de SVG et CSS peut être utilisée pour contrôler l'apparence du résultat final.

Exemple simple

Voici un exemple simple d'un fichier de règle qui sélectionne les routes primaires (tous les chemins (ways) avec une clé "highway" et une valeur "primary") et les dessine en noir d'abord avec une ligne de 4px de large puis en vert avec une ligne de 2px (le résultat est une route verte avec une bordure noire).

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="osmarender.xsl"?>

<rules 
  data="data.xml"
  scale="1"
  minimumMapWidth="4"
  minimumMapHeight="3"
  showScale="yes"
  showGrid="yes"
  showBorder="yes"
  showAttribution="yes"
  showLicense="yes"
  showZoomControls="yes"
  javaScript="yes">

  <rule e="way" k="highway" v="primary">
      <line style="stroke-width: 4px; stroke-linecap: round; stroke: #000000;"/>
  </rule>

  <rule e="way" k="highway" v="primary">
      <line style="stroke-width: 2px; stroke-linecap: round; stroke: #7FC97F;"/>
  </rule>

</rules>

Exemple de dessin de noeuds

Les noeuds (nodes) peuvent être dessinés soit avec des cercles, soit avec du texte ou avec les deux. Cet exemple dessine les noms des villes avec du texte, les églises avec des cercles noirs et les noms de ces églises avec du texte, et les hôtels avec des cercles verts sans descriptif.

Quand un cercle et un texte sont tous les deux dessinés pour un noeud, le texte peut être décalé du cercle en utilisant les attributs SVG dx et dy.

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="osmarender.xsl"?>

<rules 
  data="data.xml"
  scale="1"
  minimumMapWidth="4"
  minimumMapHeight="3"
  showScale="yes"
  showGrid="yes"
  showBorder="yes"
  showAttribution="yes"
  showLicense="yes"
  showZoomControls="yes"
  javaScript="yes">

  <rule e="node" k="class" v="town">
    <text k="name" font-family='Verdana' font-size='14px' font-style='bold' fill='black'/>
  </rule>

  <rule e="node" k="class" v="church">
    <circle r='3px' fill='black' stroke='black' stroke-width='1px'/>
    <text k="name" font-family='Verdana' font-size='10px' fill='black' dx='4px' dy='4px'/>
  </rule>

  <rule e="node" k="class" v="hotel">
    <circle r='3px' fill='green' stroke='black' stroke-width='1px'/>
  </rule>

</rules>

Exemple d'utilisation de styles CSS intégrés

Les styles CSS peuvent être utilisés pour définir l'apparence d'un élément utilisant un style d'élément intégré dans le fichier de règles. On le fait en référençant le style utilisant l'attribut de classe. L'exemple suivant montre les routes mineures et non-classifiées ("minor" et "unclassified") dessinées par la même règle de style:

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="osmarender.xsl"?>

<rules 
  data="data.xml"
  scale="1"
  minimumMapWidth="4"
  minimumMapHeight="3"
  showScale="yes"
  showGrid="yes"
  showBorder="yes"
  showAttribution="yes"
  showLicense="yes"
  showZoomControls="yes"
  javaScript="yes">

  <rule e="way" k="highway" v="unclassified">
      <line class='unclassified-casing'/>
  </rule>

  <rule e="way" k="highway" v="minor">
      <line class='unclassified-casing'/>
  </rule>

  <rule e="way" k="highway" v="unclassified">
      <line class='unclassified-core'/>
  </rule>

  <rule e="way" k="highway" v="minor">
      <line class='unclassified-core'/>
  </rule>

  <defs>
    <style type="text/css" xmlns="http://www.w3.org/2000/svg">
      .unclassified-casing {
        stroke-width: 3px;
        stroke-linecap: round;
        stroke: #000000;
        }
      
      .unclassified-core {
        stroke-width: 2px; 
        stroke-linecap: round; 
        stroke: #E6E6E6;
        }
    </style>
  </defs>

</rules>

Exemple d'affichage de descriptifs de routes

Cet exemple montre comment afficher des textes près d'une route. Le texte suit la ligne de la route mais est légèrement décalé sur un côté:

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="osmarender.xsl"?>

<rules 
  data="data.xml"
  scale="1"
  minimumMapWidth="4"
  minimumMapHeight="3"
  showScale="yes"
  showGrid="yes"
  showBorder="yes"
  showAttribution="yes"
  showLicense="yes"
  showZoomControls="yes"
  javaScript="yes">

  <rule e="way" k="highway" v="primary">
      <line style="stroke-width: 4px; stroke-linecap: round; stroke: #000000;"/>
  </rule>

  <rule e="way" k="highway" v="primary">
      <line style="stroke-width: 2px; stroke-linecap: round; stroke: #7FC97F;"/>
      <text k="ref" font-family='Verdana' font-size='10px' fill='black' dx='2.5px' dy='-2.5px'/>
  </rule>

</rules>

Exemple de texte sur un chemin

Cet exemple montre comment dessiner du texte le long d'un chemin (way) en utilisant l'instruction <text>. L'attribut k="name" précise que le texte doit correspondre à la valeur du nom de la clé. Les attributs startOffset='50%' et text-anchor='middle' indiquent que le texte doit être centré au milieu et suivre la ligne du chemin. L'attribut baseline-shift décale la base du texte par rapport à la ligne centrale sur le chemin.

Attention:

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="osmarender.xsl"?>

<rules 
  data="data.osm"
  scale="1"
  minimumMapWidth="4"
  minimumMapHeight="3"
  showScale="yes"
  showGrid="yes"
  showBorder="yes"
  showAttribution="yes"
  showLicense="yes"
  showZoomControls="yes"
  javaScript="yes">

  <rule e="way" k="highway" v="primary">
      <line style="stroke-width: 4px; stroke-linecap: round; stroke: #000000;"/>
  </rule>

  <rule e="way" k="highway" v="primary">
      <line style="stroke-width: 2px; stroke-linecap: round; stroke: #7FC97F;"/>
      <text k="name" baseline-shift='-35%' text-anchor='middle' startOffset='50%' font-family='Verdana' font-size='4px' fill='black'/>
  </rule>

</rules>

Exemple de détection de collision

Cet exemple montre comment filtrer les noeuds pour réduire le risque de collisions quand des textes doivent être dessinés. Normallement, les textes se superposent si deux objets sont trop proches.

Un <rule> peut filtrer certains noeuds en se basant sur la distance avec un noeud proche et similaire en utilisant les attributs horizontalProximity et verticalProximity. S'il y a un autre noeud similaire à l'intérieur du rectangle ainsi défini, alors le premier noeud sera ignoré.

Par exemple:

 <rule e="node" k="place" v="town" horizontalProximity="0.8" verticalProximity="0.2">
   <rule e="node" k="place" v="town">
   	<text k="name" class='caption-casing town-caption-casing'/>
   	<text k="name" class='caption-core town-caption' />
   </rule>
 </rule>

Cette règle sélectionnera tous les noeuds (nodes) tagués avec place=town, mais ignorera tous les noeuds qui seront proches d'un autre noeud dans un angle de 0.8 degré horizontalement ou 0.2 degré verticalement.

Liens

Personal tools
Namespaces
Variants
Actions
site
Toolbox