Skip to Content

Foire Aux Questions - Légende et gestion des couches (layers.ini, etc.)

Auteur : Marie

Il faut :

- grouper toutes ces couches dans un même layerGroup dans le fichier layers.ini (monGroupe),

- toujours ds le fichier layers.ini, agréger monGroupe de sorte que seul le nom du layerGroup apparaisse dans la légende : ajouter à la définition du layerGroup layers.monGroupe.aggregate = true,

- dans le mapfile, définir des zoom min et max pour chacune des couches de sorte que les plages de zoom ne se recoupent pas,


De fait, lorsque que monGroupe est coché dans la légende, et que la carte est au zoom Z, seule la couche dont la plage de zoom contient la valeur Z s'affichera !

 

Exemple :

Dans le fichier layers.ini :

 layers.monGroupe.className = LayerGroup
 layers.monGroupe.children = maCouche1, maCouche2
 layers.monGroupe.rendering = block
 layers.monGroupe.aggregate = true
 layers.maCouche1.className = Layer
 layers.maCouche1.label = ma couche 1
 layers.maCouche1.msLayer = macouche1
 layers.maCouche2.className = Layer
 layers.maCouche2.label = ma couche 2
 layers.maCouche2.msLayer = macouche2


Dans le mapfile :

LAYER
 NAME "macouche1"
 ...
 MAXSCALE 50000
 MINSCALE 25000  
 ...
END
LAYER
 NAME "macouche2"
 ...
 MAXSCALE 100000 
 MINSCALE 50100 
 ...
END

Le groupe mon Groupe s'affichera dans la légende et du zoom 1/25 000 au 1/50 000 (inclu), seule la couche 1 s'affichera puis du 1/50 100 au 1/1 000 000, seule la couche 2 s'affichera.

Pas assez clair ? Aller plus loin ? Posez une question en lien avec ce problème ici.

Auteur : yjacolin

Pour aggréger plusieurs couches dans un groupe, c'est à dire, avoir une case à cocher qui permet de charger plusieurs couches en une fois, ajoutez ce paramètre dans le fichier layers.ini :

 layers.layerId.aggregate = true


Plus d'informations dans la documentation au chapitre Couches.

Admettons que vous ayez un groupe "ligne de métro" et que dans ce groupe vous avez plus de deux couches : une couche "stations", une couche "ligne RER", "ligne métro", ... Voici comment paramétrer votre fichier layers.ini :

 layers.transport.className = LayerGroup
 layers.transport.label = "Ligne de transport"
 layers.transport.children = station, rer, metro, bus
 layers.transport.aggregate = true
 
 layers.station.className = layers
 layers.station.label = "Stations"
 layers.station.msLayer = station
 
 layers.rer.className = layers
 layers.rer.label = "Ligne de RER"
 layers.rer.msLayer = rer
 
 layers.metro.className = layers
 layers.metro.label = "Ligne de métro"
 layers.metro.msLayer = metro
 ...

D'autre part, il est possible d'avoir une couche dont on désire changer l'icône en fonction du zoom (notamment sa taille). Les différentes tailles d'icône vont apparaitre dans la légende, ce qui n'est pas toujours voulut. Vous pouvez enlevez le paramètre NAME dans tous les paramètres CLASS sauf un.

Voici un exemple, admettons que vous voulez faire varier la taille de l'icône des stations de métro en fonction du zoom. Vous ne voulez pas que les trois icônes (une pour chaque niveau de zoom) apparaissent dans la légende, une seule suffira. Voici comment votre mapfile se présentera :

  LAYER
    NAME nomCouche
    DATA ...
    CLASS
      NAME "Station de métro"
      MAXSCALE 20000
      MINSCLAE 500
      STYLE
       ...
      END
    END
    CLASS
      MAXSCALE 100000
      MINSCLAE 20000
      STYLE
       ...
      END
    END
    CLASS
      MAXSCALE 2000000
      MINSCLAE 100000
      STYLE
       ...
      END
    END
  END

Pas assez clair ? Aller plus loin ? Posez une question en lien avec ce problème ici.

 

 
Auteur : Marie

Il faut recopier les fichiers nam.png et nap.png dans le répertoire icons dans server_conf/nom_du_projet/.

Vous les trouverez par exemple dans cartoweb3/projects/test_main/server_conf/test/icons/

N'oubliez pas de relancer le script d'install ensuite.

Pour ce qui est de cacher les couches purement et simplement dans la légende, il faut alors intervenir sur le template qui gère l'affichage de la légende mais c'est plus risqué.

Pas assez clair ? Aller plus loin ? Posez une question en lien avec ce problème ici.

Auteur : Marie

Par défaut, les noms qui apparaissent dans la légende sont les noms qui figurent apres la balise NAME dans le mapfile (.map). Dans le fichier layers.ini, il est possible de définir un label pour chaque couche :

 layers.nom_couche.label = nom de ma couche

Il est ensuite possible de traduire cette chaîne via le système de traduction de cartoweb (l'internationalisation) :
Dans le fichier serveur.mon_map_id.fr.po (situé dans le dossier projects/mon_projet/po/), rajouter :

 # layers.ini ou autre commentaire jugé utile ! 
 msgid "nom de ma couche"
 msgstr "Nom de la couche personnalisé"

 

Auteur : Marie
  • Pour l'ordre des couches dans l'onglet légende :

L'ordre des couches correspond à l'ordre de déclaration des groupes de couches et des couches dans le fichier /cartoweb3/projects/mon_projet/server_conf/mon_mapID/layers.ini.
Exemple :

layers.root.className = LayerGroup
layers.root.children = mon_GroupeB, mon_GroupeA

layers.mon_GroupeA.className = LayerGroup
layers.mon_GroupeA.children = layer1, layer2, layer3

layers.mon_GroupeB.className = LayerGroup
layers.mon_GroupeB.children = layer4, layer6, layer5
 

Dans cet exemple, les couches et groupes de couches apparaitront dans cet ordre dans la légende :

 mon_GroupeB
   layer4
   layer6
   layer5
 mon_GroupeA
   layer1
   layer2
   layer3

Ici, le groupe B est le premier enfant de "root", il est donc le premier à s'afficher, même si sa description suit celle du groupe A. Même principe pour les couches.

  • Pour l'ordre des couches sur la carte :

 

 

Quelle que soit l'ordre d'affichage des couches dans la légende, l'ordre d'affichage des couches sur la carte dépend uniquement de l'ordre d'écriture dans le mapfile (fichier /cartoweb3/projects/mon_projet/server_conf/mon_carte/ma_carte.map)

Ainsi, les premières couches écrites dans le mapfile, seront les premières affichées et les dernières viendront alors s'afficher par dessus. Il est donc recommandé de décrire en premier dans le mapfile les couches de types raster, les couches de polygones et en dernier les couches d'objets ponctuels et linéaires. C'est également pour cette raison que, lorsque le module outline est activé, les couches outline doivent être rajoutées en fin de mapfile pour être toujours visibles.


Par ailleurs, malgré toutes ces précautions (raster en début de mapfile, etc.), il arrive souvent que l'utilisateur veuille changer la superposition des couches sur la carte. Un module permet de laisser la possibilité à l'utilisateur de modifier dynamiquement l'ordre de visibilité des couches ainsi que leur transparence : il s'agit du plugin layerReorder. Exemple d'impémentation dans la démo DemoPlugins


Pas assez clair ? Aller plus loin ? Posez une question en lien avec ce problème ici.

Auteur : Marie

Ajouter cette ligne dans la définition de la layer ou du layerGroup (fichier projects/mon_projet/server_conf/mon_map_id/layers.ini) :

 layers.ma_layer.icon = mon_icone.png

Le fichier mon_icone.png doit être mis dans le répertoire : projects/mon_projet/server_conf/mon_map_id/icons/

Ensuite, il est nécessaire de lancer le script d'installation pour que le lien (la copie sous windows) soit fait dans le répertoire htdocs de cartoweb (script cw3setup.php).

Il peut être également nécessaire dans certains cas de supprimer le(s) paramètre(s) dans la définition des CLASS de la LAYER dans le mapfile.

Auteur : yjacolin

Il suffit de rajouter le paramètre autoClassLegend dans le fichiers layers.ini, côté serveur :

 autoClassLegend = true

Côté mapfile, vous devez définir un objet CLASS pour chaque couche et chaque classe thématique :

 LAYER
   NAME "msLayer"
   ...
   CLASS
     NAME "étiquette de légende"
     STYLE
       ...
     END
   END
 END
Auteur : Marie

Dans le fichier <macarte>.ini (côté server donc), il ajouter les paramètres suivants :

 mapInfo.initialMapStates.default.layers.ma_couche.selected = true
 mapInfo.initialMapStates.default.layers.ma_couche.hidden = true

Ensuite si la fonctionnalité d'export en pdf est activée et que l'on veut également supprimer cette couche de la légende, il faudra ajouter le paramètre suivant dans le fichier mon_projet/client_conf/exportPdf.ini :

 blocks.legend.content = "!ma_couche"


Pas assez clair ? Aller plus loin ? Posez une question en lien avec ce problème ici.