Couches et gestionnaire de couches
Concepts
Les couches (classe Layer et ses dérivées) sont très importantes dans la programmation avec JMap. Elles contiennent et gèrent les données cartographiques qui s'affichent sur la carte (classe View). Les couches se divisent en 2 grandes familles: les couches vectorielles (classe VectorLayer) qui contiennent des données vectorielles et les couches matricielles (classe RasterLayer) qui contiennent des données matricielles (images).
Au chargement du projet, l'application cliente obtient la configuration des couches du serveur et crée les instances relatives à celles-ci dans le LayerManager. Une couche ne contient initialement pas de données et celles-ci seront chargées, en partie ou en totalité, après les rafraîchissements de la vue, en tenant compte du mode de chargement et des contraintes d'affichage (état de visibilité et seuils d'affichage).
Il existe 2 modes de chargement des couches dans JMap : par tuiles et par région. Les couches vectorielles supportent les 2 modes, tandis que les couches matricielles ne supportent que le mode par région.
Les couches tuilées divisent l'étendue de la couche en rangées et en colonnes, dont chaque cellule est une tuile de données (classes TileSet et Tile). Puisque les couches sont initialement vides au démarrage de l'application, les tuiles de données seront chargées par l'application lors de leur premier affichage dans une vue. Une fois chargée dans une couche, une tuile restera en mémoire pour la durée de la session, si celle-ci n'expire pas prématurément, ou que le gestionnaire de mémoire ne décide de la supprimer.
Lorsqu'une tuile de données est demandée à JMap Server, toutes les géométries (interface Geometry) qui intersectent l'étendue de la tuile sont transférées sur le client. Une fois la tuile reçue, les géométries sont transformées en éléments (classe K2DElement), qui sont ensuite chargés dans le TileSet de la couche. Pour éviter qu'un élément soit dupliqué dans plusieurs tuiles de données, les éléments qui ne sont pas totalement inclus dans une tuile sont finalement déplacés dans la tuile univers de la couche.
Les couches chargées par région reposent sur la même structure (classes TileSet et Tile), mais ne disposent qu'une tuile unique ayant une étendue variable. Lorsqu'un changement est appliqué sur la matrice de transformation de la vue et qu'un rafraîchissement survient, les couches par région rechargent leur tuile unique avec les données qui intersectent l'étendue de la vue.
La classe Layer et ses dérivées
La classe Layer
La classe Layer est abstraite et ne peut donc pas être instanciée. Par contre, elle propose les méthodes de base de toutes les couches.
Méthodes les plus utilisées de la classe Layer |
|
Ajoute un listener des événements générés par la couche. |
|
Retourne le type d'éléments que contient la couche. Les types sont définis par les constantes de la classe ElementTypes. |
|
Retourne l'identifiant numérique unique de la couche. |
|
Retourne le nom de la couche. |
|
Retourne l'instance du gestionnaire de styles (classe StyleManager) utilisé par la couche. Ce dernier gère l'ensemble des styles de la couche définissant l'apparence graphique des éléments sur la carte. |
|
Méthode statique qui génère un nouvel identifiant unique de couche utilisateur. |
|
Invalide le cache d'une couche chargée par région afin de permettre le raffraîchissement de celle-ci lorsqu'aucun changement n'a été apporté à la matrice de transformation de la vue. |
|
Indique si la couche est affichée à l'échelle spécifiée, selon les seuils d'affichages définis. |
|
Indique si les objets de la couche sont sélectionnables ou non. |
|
Indique si la couche est visible ou non. |
|
Retourne une structure de données sérialisable contenant toutes les informations de la couche. |
La classe VectorLayer
La classe VectorLayer est dérivée de Layer et contient uniquement des données vectorielles. Elle possède plusieurs méthodes spécialisées pour les données vectorielles pour gérer des sélections d'éléments, effectuer des analyses spatiales, etc.
Les couches vectorielles possèdent un ensemble d'attributs qui sont communs à tous les éléments de la couche. Ces attributs fournissent les données descriptives des éléments de la couche.
Méthodes les plus utilisées de la classe VectorLayer |
|
Ajoute l'élément spécifié sur la couche. |
|
Ajoute tous les éléments spécifiés sur la couche. |
|
Ajoute l'élément spécifié à la liste des éléments sélectionnés. |
|
Ajoute une collection d'éléments à la liste des éléments sélectionnés. |
|
Vide la liste des objets sélectionnés sur cette couche. |
|
Retourne la liste des attributs (classe Attribute) de la couche. |
|
Ajoute un nouveau filtre d'affichage (interface DisplayFilter) à la couche. Ce filtre permet de définir ce qui sera affiché et ce qui ne le sera pas. |
|
Permet d'obtenir le premier élément de la couche détecté à la coordonnée spécifiée en WC dans la carte spécifiée (classe ViewState). Le dernier paramètre détermine si les éléments invisibles (à cause d'un filtre d'affichage, par exemple) doivent être considérés ou non. |
|
Retourne une collection contenant l'ensemble des éléments de la couche. |
|
getElementsAtPoint (Point WCCoord, ViewState viewScale, boolean onlyIfVisible) |
Permet d'obtenir l'ensemble des éléments de la couche détectés à la coordonnée spécifiée en WC dans la carte spécifiée (classe ViewState). Le dernier paramètre détermine si les éléments invisibles (à cause d'un filtre d'affichage, par exemple) doivent être considérés ou non. |
Permet d'obtenir l'ensemble des éléments de la couche qui intersectent la surface spécifiée en WC dans la carte spécifiée (classe ViewState). Le dernier paramètre détermine si les éléments invisibles (à cause d'un filtre d'affichage, par exemple) doivent être considérés ou non. |
|
Retourne l'étendue totale des données de la couche sous la forme d'un rectangle. |
|
Retourne un tableau contenant l'ensemble des éléments qui son sélectionnés sur la couche. |
La classe RasterLayer
La classe RasterLayer est dérivée de Layer et contient uniquement des données matricielles. Ses méthodes sont rarement utilisées par les développeurs d'applications JMap.
Méthodes les plus utilisées de la classe RasterLayer |
|
Retourne l'étendue totale des données de la couche sous la forme d'un rectangle. |
|
Retourne les paramètres matriciels (classe RasterParameters) utilisés par la couche matricielle (p.e. le format de l'image, la transparence, etc.). |
|
Retourne un tableau des attributs des différentes bandes (classe RasterBand) contenues dans l'image. |
Les événements de la classe Layer
Les couches dans JMap génèrent des événements dans plusieurs situations. Pour recevoir les événements générés par une couche, vous devez enregistrer un listener sur la couche en question. Notez que pour recevoir les événements générés par l'ensemble des couches du projet, il est préférable d'enregistrer un listener sur le gestionnaire de couches. Voir plus bas pour plus d'informations à ce sujet.
Pour recevoir les événements d'une couche, vous devez implémenter l'interface LayerEventListener et l'enregistrer auprès de la couche en utilisant la méthode addLayerEventListener() tel que montré dans l'exemple suivant:
Layer layer = ... // TODO ...
|
Notez qu'il existe aussi un adaptateur (LayerAdapter) qui simplifie le développement du listener. La super classe LayerEvent possède une méthode getLayer() et une méthode getLayerManager() permettant d'accéder respectivement à la couche ou au gestionnaire de couches ayant généré l'événement.
Le tableau suivant présente les événements générés par la classe Layer.
Événements de la couche les plus fréquemment utilisés |
|
Lancé après l'ajout de nouveaux éléments sur la couche. Les éléments ajoutés sont accessibles dans l'instance de l'événement. |
|
layerElementsChangedEventOccurred(LayerElementsChangedEvent) |
Lancé après la modification d'éléments de la couche. Les éléments modifiés sont accessibles dans l'instance de l'événement. |
layerElementsRemovedEventOccurred(LayerElementsRemovedEvent) |
Lancé après l'enlèvement d'éléments de la couche. Les éléments enlevés sont accessibles dans l'instance de l'événement. |
Lancé après une modification de la sélection sur la couche. Il peut s'agir d'éléments sélectionnés ou désélectionnés. Les éléments concernés sont accessibles dans l'instance de l'événement. |
|
Lancé après une modification du style de la couche. |
La classe LayerManager
Chaque carte (classe View) dans JMap possède un gestionnaire de couches (classe LayerManager). Ce dernier est responsable de gérer l'ensemble des couches à afficher sur la carte, de même que leur ordre et leur organisation hiérarchique. De plus, le gestionnaire de couches permet d'écouter des d'événements sur l'ensemble des couches et d'effectuer certaines opérations sur celles-ci.
Méthodes les plus utilisées de la classe LayerManager |
|
Ajoute la couche spécifiée à la position la plus élevée. |
|
Ajoute un listener des événements générés par le gestionnaire de couches. Le gestionnaire de couches relaie aussi tous les événements générés par les couches qu'il gère. |
|
Efface les liste d'éléments sélectionnés sur chacune des couches. |
|
Retourne l'ensemble ordonné des couches (couches utilisateur et couches normales). La couche à la position 0 est celle du dessous. |
|
Retourne la couche ayant l'identifiant unique spécifié. |
|
Retourne la couche ayant le nom unique spécifié. |
|
Retourne la position de la couche spécifiée. |
|
Retourne une structure de données (classe LayerVisibilitySet) contenant l'état de la visibilité d'une couche. Cet état tient compte de l'état de la sélection des groupes dans la hiérarchie de couches et de la configuration de visibilité de celles-ci. |
|
Retourne l'ensemble des éléments sélectionnés sur l'ensemble des couches. |
|
Retourne l'étendue de l'ensemble des éléments sélectionnés sur l'ensemble des couches. |
|
Enlève la couche située à la position spécifiée. |
Les événements de la classe LayerManager
Le gestionnaire de couches dans JMap génère des événements. Pour recevoir les événements générés par un gestionnaire de couches, vous devez enregistrer un listener sur le gestionnaire de couches en question. Notez qu'un listener enregistré sur le gestionnaire de couches recevra les événements générés par l'ensemble des couches prises en charge par le gestionnaire.
Pour recevoir les événements d'un gestionnaire de couches, vous devez implémenter l'interface LayerEventListener et l'enregistrer auprès du gestionnaire de couches en utilisant la méthode addLayerEventListener().
Événements du gestionnaire de couches |
|
Lancé après un changement de position d'une couche dans la liste des couches prises en charge par le gestionnaire de couches. |
|
Lancé après l'enlèvement d'une couche de la liste des couches prises en charge par le gestionnaire de couches. |
|
Lancé après l'ajout d'une couche dans la liste des couches prises en charge par le gestionnaire de couches. |