Guide d'utilisation d'Open Layer
Guide d'utilisation d'Open Layer
La base
Le principe est simple, pour afficher une carte avec Open Layer, il faut les éléments
suivants :
Une page HTML (bien évidemment) possédant un conteneur (div) qui sera utilisé pour
afficher la carte.
Un appel à la librairie Open Layer (pour en utiliser les fonctionnalités).
Un fichier de configuration (pour personnaliser la carte).
Un fichier CSS de mise en forme de la carte.
La librairie Open Layer tout comme le fichier CSS sont disponibles directement depuis le site
d’Open Layer.
Nous utiliserons en plus la librairie Layer Switcher. Il s’agit d’une extension pour Open Layer
qui permet de construire une légende automatiquement.
Un outil modulaire
Une carte créée avec Open Layer est composée d’objets. Les propriétés ou options de
chacun de ces objets peuvent avoir différentes valeurs :
Une valeur textuelle ou numérique.
o 'valeur' ou 1234
Une liste de valeurs textuelles ou numériques (array : [] ).
o ['valeur 1', 'valeur 2'] ou [1,2,3,4]
Un objet Open Layer.
Une liste d’objets Open Layer (array : [] ).
Ainsi, un objet peut contenir d’autres objets qui peuvent eux même contenir encore d’autres
objets.
Voici un exemple d’une même définition mais présentée de deux façons différentes :
En une seule fois
Avec l’utilisation de variables appelées dans les parents.
Style1- En une seule fois
new [Link]({
// Option avec une valeur textuelle
option_1: 'valeur',
// Option avec plusieurs valeur numériques
option_2: [0, 2, 3],
// Option faisant appel à un autre objet Open Layer
option_3:
new [Link]({
// Option avec plusieurs valeurs textuelles
option_A: [
'valeur',
'valeur 2'
]
}),
// Option faisant appel à plusieurs autres objets Open Layer
option_4: [
new [Link]({
// Option avec une valeur textuelle
option_A: 'valeur',
// Option faisant appel à un autre objet Open Layer
option_B:
new [Link]()
}),
new [Link]({
// Option faisant appel à plusieurs autres objets Open Layer
option_Z:
new [Link]({
// Option avec une valeur textuelle
option_X: 'valeur',
})
})
]
});
Style2- Avec des variables
var variable_view = new [Link]({
// Option avec plusieurs valeurs textuelles
option_A: [
'valeur',
'valeur 2'
]
})
var variable_layer_tile = new [Link]({
// Option avec une valeur textuelle
option_A: 'valeur',
// Option faisant appel à un autre objet Open Layer
option_B:
new [Link]()
})
var variable_source_vector = new [Link]({
// Option avec une valeur textuelle
option_X: 'valeur',
})
var variable_layer_vector = new [Link]({
// Option faisant appel à plusieurs autres objets Open Layer
// On utilise ici la variable définie plus tôt
option_Z: variable_source_vector
})
new [Link]({
// Option avec une valeur textuelle
option_1: 'valeur',
// Option avec plusieurs valeur numériques
option_2: [0, 2, 3],
// Option faisant appel à un autre objet Open Layer
// On utilise ici la variable définie plus tôt
option_3: variable_view,
// Option faisant appel à plusieurs autres objets Open Layer
// On utilise ici les variables définies plus tôt
option_4: [
variable_layer_tile,
variable_layer_vector
]
});
Vous verrez plus bas que j’utilise principalement la deuxième solution qui consiste à définir
des variables puis à les utiliser. Ça permet d’avoir un code plus facilement maintenable et
plus clair de mon point de vue.
Pour pouvoir utiliser une variable, il faut au préalable la déclarer. Ainsi, la lecture des fichiers
de configurations que je vous propose peut être faite à l’envers, en partant de la carte pour
remonter jusqu’aux différents éléments qui la compose.
Attention, certains objets sont des « classes de base » : il s’agit d’un objet générique dont est
dérivée plusieurs objets spécifiques. J’ai utilisé cette classe de base comme valeur de
propriété lorsque cette dernière peut utiliser n’importe quel objet dérivé de cette classe de
base.
Dans le cas des classes de base, les propriétés des classes dérivée sont parfois listées pour
limiter le nombre de paragraphe et simplifier la lecture.
[Link]
Détails
Conteneur de carte
Utilisé par :
Propriétés :
[Link]
Détails
Classe de base
Fonctionnalités
Utilisé par :
[Link]
Classes dérivées et propriétés :
[Link] – Echelle
[Link]
Détails
Classe de base
[Link] – Quadrillage
[Link] – Carte de chaleur
[Link]
Détails
Classe de base
Source de données
Utilisé par :
[Link]
[Link]
[Link]
[Link]
[Link]
Format de données
Utilisé par :
[Link]
[Link]
Détails
Propriétés :
Formes géométriques
Utilisé par :
[Link]
[Link]
[Link] – Point
o coordinates: [Link]
[Link] – Multipoint
o coordinates: [Link]
[Link] – Ligne
o coordinates: [Link]
[Link] – Multiligne
o coordinates: [Link] | [Link]
[Link] Multipolygone
o coordinates: [Link] | [Link]
[Link] – Polygone
o coordinates: [Link]
[Link]
Détails
Classe de base
Symbole
Utilisé par :
[Link]
Classes dérivées et propriétés :
[Link] – Image
[Link] – Polygone régulier
o fill: [Link] – Remplissage
o stroke: [Link] – Contour
[Link] – Cercle
o fill: [Link] – Remplissage
o stroke: [Link] – Contour
[Link]
Détails
Remplissage
Utilisé par :
[Link]
[Link]
[Link]
[Link]
Propriétés :
color: [Link]
[Link]
Détails
Contour vecteur
Utilisé par :
[Link]
[Link]
[Link]
[Link]
Propriétés :
color: [Link]
[Link]
Détails
Etiquette de l’objet
Utilisé par :
[Link]
Propriétés :
fill: [Link] – Remplissage
stroke: [Link] – Contour
backgroundFill: [Link] – Remplissage
backgroundStroke: [Link] – Contour
3-Initialisation de la carte
Pour notre projet, nous allons avoir besoin des fichiers suivants :
[Link] : page qui sera consultée et qui contiendra la carte.
ol_style.css : fichier CSS qui contiendra les styles de la page [Link] ainsi que les
personnalisations de notre carte (nous n’utiliserons qu’une partie des styles par défaut).
Un fichier de configuration qui sera ici diviser en 4 fichiers pour simplifier la compréhension
:
o ol_data_raster.js : fichier de configuration des données raster.
o ol_data_vector.js : fichier de configuration des données vecteur.
o ol_control.js : fichier de configuration des contrôles de la carte (boutons de zoom,
légende, échelle…).
o ol_map.js : fichier de configuration de notre carte.
Voici les fichiers que vous devriez avoir avec le code associé :
[Link]
<!DOCTYPE html>
<html lang="fr">
<head>
<!-- Balise méta -->
<meta charset="UTF-8"/>
<title>Open layer - Demonstration</title>
<link rel="icon" type="image/png"
href="[Link] />
</head>
<body>
<h1>Ma carte</h1>
<p>Voici un exemple de carte</p>
<p>Bravo !!</p>
</body>
</html>
Ol_style.css
/************************----************************/
/* Styles Open Layer */
/****************************************************/
/* Définitions générales */
body {
background-color: rgb(42, 45, 53);
}
/* Textes */
body, p {
font-family: 'Quicksand', sans-serif;
color:#fff;
font-size: 15px;
line-height: 20px;
font-weight: 200;
}
p {
margin-bottom: 8px;
margin-top: 8px;
}
h1{
font-size: 25px;
font-weight: 500;
text-transform: uppercase;
margin-top: 0px;
margin-bottom: 2px;
}
/* Conteneur carte */
.map {
height: 450px;
width: 80%;
margin-left: auto;
margin-right: auto;
border-radius: 4px;
background-color: #AF00FF;
background-image: linear-gradient(332deg, #009FFF 0%, #AF00FF 100%);
/* Open Layer */
/*Vide*/
Pour le moment cette page affiche un rectangle vide. Il s’agit de l’emplacement de votre
carte. Il va donc falloir personnaliser le contenu pour afficher quelque chose. Pour cela,
plusieurs étapes :
Personnalisation du contenu
Personnalisation du style
4-Personnalisation du contenu
Le but est donc ici de paramétrer votre carte grâce aux fichiers de configuration.
Pour cela, nous avons vu qu’Open Layer est un outil modulaire : la carte est un objet
JavaScript, composé d’objets, eux-mêmes composés d’objets etc. Ainsi, vous allez vite voir
que nous allons avoir besoin de définir tout un tas d’objets que nous allons utiliser les uns à
la suite des autres.
Nous allons donc partir de la définition de la carte pour ensuite définir tous les objets qui la
composent. Voici quelques éléments de compréhension :
Attention, bien qu’il soit possible de tout définir d’un seul coup, je préfère définir chaque
objet séparément dans des variables.
N’hésitez pas à utilisez la documentation d’Open Layer.
Certaines propriétés n’ont pas besoin d’être définies, je les ai conservées mais
commentées (pour mémoire).
ol_data.[Link]
* Open Layers */
/* Paramétrage données raster */
/****************************************************/
// Ce fichier contient la définition des fonds de plan que nous souhaitons afficher
sur la carte
// Nous allons ajouter trois fonds de plan différents (2 pour la carte et 1 que nous
utiliserons plus tard dans la mini carte).
// Les objets que l'on retrouve dans cette configuration (avec par indentation ce
qu'ils contiennent) :
// [Link] : Couche de donnée tuilées
// [Link]() : Source de données en provenance du site Open Street Map
// [Link] : Source de données en provenance du site Stamen
// [Link] : Source de données tuilées ‘XYZ’
// Ce fichier contient la définition des données vecteurs que nous souhaitons afficher sur
la carte
// Nous allons définir 1 couche de données contenant des points représentant des
emplacement dans 3 communes de Haute-Savoie.
// Les objets que l'on retrouve dans cette configuration (avec par indentation ce qu'ils
contiennent) :
// [Link] : Couche de données vecteur
// [Link] : Source de données vecteur
// [Link]() : Lecteur de données au format GeoJSON
// [Link] : Stylisation d'une couche
// [Link] : Style du symbole
// [Link] : Style des étiquettes
// [Link] : Style du contour
src:'[Link]
[Link]',
// Dimension de l'image en pixel (défaut : [50, 50])
//size:[50,50],
// Point d'ancrage de l'image (défaut : [0.5, 0.5])
//anchor: [0.5, 46],
// Unité d'ancrage en X (défaut : 'fraction')
//anchorXUnits: 'fraction',
// Unité d'ancrage en Y (défaut : 'fraction')
//anchorYUnits: 'pixels',
// Opacité de l'image (défaut : 1)
//opacity: 1,
// Echelle de l'image (défaut : 1)
scale:0.5,
// Rotation de l'icone avec la vue (défaut : false)
rotateWithView: true,
// Rotation de l'icone en radian dans le sens des aiguille
d'une montre (défaut : 0)
//rotation:0,
}),
// Contour des objets
//stroke
// Etiquette des objets
text: new [Link]({
// Texte à afficher
text: 'Salut',
// Police (défaut : '10px sans-serif')
//font:'10px sans-serif',
// Décalage du texte en X en pixel (défaut : 0)
//offsetX:0,
// Décalage du texte en Y en pixel (défaut : 0)
offsetY:19,
// Le texte peut-il dépasser de l'opbjet ? (défaut : false)
//overflow:false,
// Placement du texte (défaut : 'point')
//Valeur : 'point' ou 'line' si la forme est de type ligne ou
polygone
//placement:'point',
// Echelle
//scale:1,
// Rotation du texte avec la carte (défault : false)
rotateWithView:true,
}),
})
// Définition de la couche de données
var data_vecteur_layer_exemple = new [Link]({
// Style de la couche
title: 'Couche exemple',
source: ol_source_layer_exemple,
// Style de la couche
style: ol_style_layer_exemple,
})
Ol_map.js
/* Paramétrage carte */
// Ce fichier contient la définition de la carte
// Les objets que l'on retrouve dans cette configuration (avec par
indentation ce qu'ils contiennent) :
// [Link] : Carte que l'on verra dans la page HTML
// [Link] : Groupe de couche (optionnel, on
aura pu utiliser les couches directement)
// [Link] : Couche de donnée vecteur
(définit dans ol_data_vector.js)
// [Link] : Couche de donnée raster
(définit dans ol_data_raster.js)
// [Link] : Vue de la carte (paramètres qui
régissent ce que l'on voit dans la carte)
var data_group = [
// Groupe de couche 1
new [Link]({
[Link]
// Paramétrage de la carte
//////////////////////////
Une légende est également présente et vous pouvez visualiser l’intérêt d’avoir groupé les
couches : la légende affiche ces groupes.
Cependant, ces boutons possèdent un style un peu classique et surtout vous remarquerez
que certains d’entre eux se superposent. La suite va nous permettre de personnaliser tout
cela.
Ol_control.js
// Ce fichier contient la définition des contrôles de la carte
// Les objets que l'on retrouve dans cette configuration (avec par
indentation ce qu'ils contiennent) :
// [Link] : bouton de zoom et de dézoom
// [Link] : bouton de réinitialisation de la
rotation de la carte (faite avec maj+alt+clic)
// [Link] : mini carte
// [Link] : couche présente dans la mini
carte
// [Link] : paramétrage de la vue de la mini carte
// [Link] : bouton de recentrage de la
carte
// [Link] : slider de zoom
// [Link] : échelle
// [Link] : coordonnées du pointeur
// [Link] : bouton de passage en mode plein
écran
// [Link] : mentions (crédits)
// [Link] : extension d'Open Layer
permettant d'afficher une légende
// Boutons de zoom
var cont_zoom = new [Link]({
// Libellé du bouton de zoom avant (défaut : '+')
//zoomInLabel: '+',
// Infobulle du bouton de zoom avant (défaut : 'Zoom in')
zoomInTipLabel: 'Zoomer',
// Libellé du bouton de zoom arrière (défaut : '-')
//zoomOutLabel: '-',
// Infobulle du bouton de zoom arrière (défaut : 'Zoom out')
zoomOutTipLabel: 'Dézoomer',
// Nombre de paliers de zoom par clic (défaut : 1)
//delta: 1,
// Durée du zoom en millisecondes (défaut : 250)
//duration: 250,
// Classe de l'élément (défaut : 'ol-zoom')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Bouton de rotation
var cont_rotation = new [Link]({
// Libellé du bouton (défaut : '⇧')
//label: '⇧',
// Infobulle du bouton (défaut : 'Reset rotation')
tipLabel: 'Réinitialiser la rotation - Maintenez alt+shift pour
tourner la carte',
// Durée du zoom en millisecondes (défaut : 250)
//duration: 250,
// Cacher le bouton lorsque la rotation est de 0° (défaut :
true)
autoHide: false,
// Classe de l'élément (défaut : 'ol-rotate')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Mini carte
var cont_mini_carte = new [Link]({
// Possibilité de replier l'élément (défaut : true)
collapsible: true,
// Replié au démarrage ? (défaut : true)
collapsed: true,
// Infobulle du bouton
tipLabel: 'Afficher la mini-carte',
// Couches à afficher dans la minicarte
// Attention, la même couche ne doit pas être utilisée dans la carte
// Il faut une couche spécifiquement créée pour la mini carte
layers: [
data_raster_stamen_toner,
],
view: new [Link]({
zoom: 13,
}),
// La mini carte doit-elle tourner avec la carte principale (défaut : false)
rotateWithView: true,
// Classe de l'élément (défaut : 'ol-overviewmap')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Echelle
// Echelle
var cont_echelle = new [Link]({
// Taille minimum en pixel (défaut : 64)
//minWidth: 0,
// Unité de l'échelle (défaut : 'metric')
//units: '',
// Classe de l'élément (défaut : 'ol-scale-line')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Position du curseur
var cont_position_cuseur = new [Link]({
// Format des coordonnées
coordinateFormat: function(coordinate) {
return [Link](coordinate, '<span><i class="fas fa-map-marker-
alt"></i> {x} ° | {y} °</span>', 6);
},
// Projection des coordonnées (défaut : projection de la vue)
projection: 'EPSG:4326',
// Texte affiché lorsqu'aucune coordonnées n'est disponible (défaut : ' ')
//undefinedHTML: ' ',
// Classe de l'élément (défaut : 'ol-mouse-position')
//className: '',
})
// Bouton d'affichage en plein écran
var cont_plein_ecran = new [Link]({
// Libellé du bouton (defaut : '\u2922')
//label: '\u2922',
// Infobulle du bouton (défaut : 'Toggle full-screen')
tipLabel: 'Passez en mode plein-écran',
// Libellé du bouton lorsque du mode plein-écran (défaut : '\u00d7')
//labelActive: '\u00d7',
// Classe de l'élément (défaut : 'ol-full-screen')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Mentions légales
var cont_mention_legale = new [Link]({
// Possibilité de replier l'élément
collapsible: true,
// Etat "de repliage" au démarrage
collapsed: true,
// Libellé du bouton lorsque l'élément est déplié (défaut : '»')
//collapseLabel: '»',
// Libellé du bouton lorsque l'élément est replié (défaut : 'i')
//label: 'i',
// Infobulle du bouton
tipLabel: 'Attributions',
// Classe de l'élément (défaut : 'ol-attribution')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Controle des couches
// Extension LayerSwitcher
var cont_control_couche = new [Link]({
// Infobulle du bouton
tipLabel: 'Légende',
// Visibilité des groupes (défaut : 'children')
// 'none' : les groupes n'ont pas de case à cocher
// 'children' : le changement d'état de visibilité d'un groupe change l'état de ses
enfants vers le même état
// 'group' : le changement d'état de visibilité d'un groupe ne change pas l'état de
visibilité de ses enfants
groupSelectStyle:'children'
});
Personnalisation du style
Style des contrôles
Pour personnaliser le style des contrôles deux possibilités de modification :
Le paramétrages des objets de ces contrôles.
Le CSS associé à ces contrôles.
Nous allons nous aider de la police Font Awesome pour ajouter un peu de fun.
OL_style.css
/* Ajoutez ces définitions à la suite de votre fichier CSS */
/* Open Layer */
/* Couleur des contrôles */
.ol-control > button,
.ol-scale-line {
background-color: rgba(255, 0, 0, 0.5);
}
/* Bouton */
.ol-control > button {
font-family: "Font Awesome 5 Free";
}
/* Zoom in */
.[Link]-zoom [Link]-zoom-in::before {
content: "\f067";
font-weight: 900;
}
/* Zoom out */
.[Link]-zoom [Link]-zoom-out::before {
content: "\f068";
font-weight: 900;
}
.[Link]-zoom-extent button::before {
content: "\f689";
font-weight: 900;
}
/* Slider de zoom */
.ol-zoomslider {
top: 9.5em;
background-color: rgba(255, 255, 255, 0.8);
}
/* Mini carte */
.ol-overviewmap {
bottom: 2.5em;
}
.[Link]-overviewmap button::before {
content: "\f00d";
font-weight: 900;
}
.[Link]-collapsed button::before {
content: "\f279";
font-weight: 400;
}
/* Position du cuseur */
.ol-mouse-position {
position:absolute;
top: unset;
right: unset;
bottom: 5px;
left: 50%;
transform: translate(-50%, 0);
.[Link]-full-screen [Link]-full-screen-true::before {
content: "\f00d";
font-weight: 900;
}
/* Mention */
.ol-attribution li {
display: list-item;
}
.[Link]-attribution button::before {
content: "\f00d";
font-weight: 900;
}
.[Link]-collapsed button::before {
content: "\f129";
font-weight: 900;
}
Ol_control.js
// On remplace les valeurs textuelles affichées par rien : ''
// On gère ces valeur via CSS
// Boutons de zoom
var cont_zoom = new [Link]({
// Libellé du bouton de zoom avant (défaut : '+')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font Awesome"
zoomInLabel: '',
// Infobulle du bouton de zoom avant (défaut : 'Zoom in')
zoomInTipLabel: 'Zoomer',
// Libellé du bouton de zoom arrière (défaut : '-')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font Awesome"
zoomOutLabel: '',
// Infobulle du bouton de zoom arrière (défaut : 'Zoom out')
zoomOutTipLabel: 'Dézoomer',
// Nombre de paliers de zoom par clic (défaut : 1)
//delta: 1,
// Durée du zoom en millisecondes (défaut : 250)
//duration: 250,
// Classe de l'élément (défaut : 'ol-zoom')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Bouton de rotation
var cont_rotation = new [Link]({
// Libellé du bouton (défaut : '⇧')
//label: '⇧',
// Infobulle du bouton (défaut : 'Reset rotation')
tipLabel: 'Réinitialiser la rotation - Maintenez alt+shift pour tourner la carte',
// Durée du zoom en millisecondes (défaut : 250)
//duration: 250,
// Cacher le bouton lorsque la rotation est de 0° (défaut : true)
autoHide: false,
// Classe de l'élément (défaut : 'ol-rotate')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Mini carte
var cont_mini_carte = new [Link]({
// Possibilité de replier l'élément (défaut : true)
collapsible: true,
// Replié au démarrage ? (défaut : true)
collapsed: true,
// Libellé du bouton lorsque l'élément est déplié (défaut : '«')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font Awesome"
collapseLabel: '',
// Libellé du bouton lorsque l'élément est replié (défaut : '»')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font Awesome"
label: '',
// Infobulle du bouton
tipLabel: 'Afficher la mini-carte',
// Couches à afficher dans la minicarte
layers: [
data_raster_stamen_toner,
],
// Vue spécifique à utiliser (défaut : EPSG:3857 avec centrage par défaut)
view: new [Link]({
zoom: 13,
}),
// La mini carte doit-elle tourner avec la carte principale (défaut : false)
rotateWithView: true,
// Classe de l'élément (défaut : 'ol-overviewmap')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Echelle
var cont_echelle = new [Link]({
// Taille minimum en pixel (défaut : 64)
//minWidth: 0,
// Unité de l'échelle (défaut : 'metric')
//units: '',
// Classe de l'élément (défaut : 'ol-scale-line')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Position du curseur
var cont_position_cuseur = new [Link]({
// Format des coordonnées
coordinateFormat: function(coordinate) {
return [Link](coordinate, '<span><i class="fas fa-map-marker-
alt"></i> {x} ° | {y} °</span>', 6);
},
// Projection des coordonnées (défaut : projection de la vue)
projection: 'EPSG:4326',
// Texte affiché lorsqu'aucune coordonnées n'est disponible (défaut : ' ')
//undefinedHTML: ' ',
// Classe de l'élément (défaut : 'ol-mouse-position')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Bouton d'affichage en plein écran
var cont_plein_ecran = new [Link]({
// Libellé du bouton (defaut : '\u2922')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font
Awesome"
label: '',
// Infobulle du bouton (défaut : 'Toggle full-screen')
tipLabel: 'Passez en mode plein-écran',
// Libellé du bouton lorsque du mode plein-écran (défaut : '\u00d7')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font
Awesome"
labelActive: '',
// Classe de l'élément (défaut : 'ol-full-screen')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
// Mentions légales
var cont_mention_legale = new [Link]({
// Possibilité de replier l'élément
collapsible: true,
// Etat "de repliage" au démarrage
collapsed: true,
// Libellé du bouton lorsque l'élément est déplié (défaut : '»')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font
Awesome"
collapseLabel: '',
// Libellé du bouton lorsque l'élément est replié (défaut : 'i')
// On gère le libellé via le CSS (pseudo-élément before) et la font "Font
Awesome"
label: '',
// Infobulle du bouton
tipLabel: 'Attributions',
// Classe de l'élément (défaut : 'ol-attribution')
//className: '',
// Identifiant de l'élément HTML où placer l'élément
//target: '',
})
Nous avons vu que la définition du style d’une couche est fixe. Pour la modifier, il faut
comprendre que lors de l’affichage des objets, Open Layer appelle la définition du style de la
couche pour chaque objet. Ainsi, si nous modifions cette définition à la volée, pour chaque
objet, il devient possible d’avoir un style dynamique, mis à jour pour chaque objet.
Pour faire tout cela, intéressons nous à l’option style de l’objet [Link] (la
couche de données). D’après la documentation, cette option doit avoir comme valeur un
objet de type [Link] . Ce qui est intéressant c’est que cet objet peut être
remplacé par une fonction qui renvoi ce type d’objet et à laquelle sera automatiquement
passé deux paramètres : l’objet affiché (ainsi pour chaque objet, la fonction renverra un style
spécifique) et la résolution de la vue actuellement utilisée (ainsi selon le niveau de zoom, le
style peut être différent).
Nous allons donc modifier la définition du style que nous avons précédemment utilisé grâce
à une fonction et utiliser le résultat de cette fonction dans notre couche :
ol_data_vector.js-Fonction spécifique
// On conserve la définition du style de la donnée vecteur, ajoutez ce qui suit juste à la
suite du style de la données vecteur.
// Remplacez également la définition de la couche de données
// On défini d'abord un style spécifique pour chaque valeur
// On ne changera que la propriété image de l'objet [Link]
var ol_style_layer_exemple_style_specifique = {
// Style par défaut
'Défaut' : new [Link]({
// Image source à utiliser
src:'[Link]
// Echelle de l'image (défaut : 1)
scale:0.5,
// Rotation de l'icone avec la vue (défaut : false)
rotateWithView: true,
}),
// Style pour la valeur 1
'Lucinges' : new [Link]({
// Image source à utiliser
src:'[Link]
// Echelle de l'image (défaut : 1)
scale:0.5,
// Rotation de l'icone avec la vue (défaut : false)
rotateWithView: true,
}),
// Style pour la valeur 2
'Saint-Gervais' : new [Link]({
// Image source à utiliser
src:'[Link]
// Echelle de l'image (défaut : 1)
scale:0.5,
// Rotation de l'icone avec la vue (défaut : false)
rotateWithView: true,
}),
}
// Fonction de modification du style initial
function ol_style_layer_exemple_fct(feature, resolution) {
// Modification de l'étiquette
// On récupère l'objet [Link]
// On défini la valeur de la propriété "text" comme étant la valeur de l'attribut
"name" de chaque objet
ol_style_layer_exemple.getText().setText([Link]('name'));
// Modification de l’icône
// Si la définition spécifique existe
if (ol_style_layer_exemple_style_specifique[[Link]('name')] != null) {
// On défini la valeur de la propriété "image" comme étant l'objet définit dans
ol_style_layer_exemple_style_specifique et portant un nom égal à l'attribut "name" de chaque
objet
ol_style_layer_exemple.setImage(ol_style_layer_exemple_style_specifique[[Link]('name')
]);
}
// Sinon on utilise la définition par défaut
else {
ol_style_layer_exemple.setImage(ol_style_layer_exemple_style_specifique['Défaut']);
};
return ol_style_layer_exemple;
}
// Définition de la couche de données
// On utilise la fonction plutôt que le style initial
var data_vecteur_layer_exemple = new [Link]({
// Opacité de la couche (défaut : 1)
//opacity: 1,
// Visibilité de la couche (défaut : true)
//visible: true,
// Résolutions minimum (niveau de zoom) incluse d'affichage de la couche en unité de
carte par pixel
//minResolution:25,
// Résolutions maximum (niveau de dézoom) exclue d'affichage de la couche en unité de
carte par pixel
//maxResolution:500,
// Niveau de superposition de la couche (défaut : 0)
//zIndex: 0,
// Emprise de rendu maximum
// Emprise en xmin, ymin, xmax, ymax en 3857
//extent: [],
// Ordre de rendu de la couche (ordre de dessin des couches)
//renderOrder: 1,
// Zone en pixel autour de la carte jusqu'ou la couche sera dessinée après chaque
déplacement (défaut : 100)
//renderBuffer: 100,
// Mode de rendu de la couche (défaut : 'vector')
// 'vector' : Rendu vecteur : plus précis durant les animations mais
plus lourd
// 'image' : Rendu image : moins précis durant les animations mais plus
léger, les point et les étiquettes tournent avec la vue
//renderMode: 'vector',***
// Gestion des conflits entre les objets (défaut : false)
// Lorsqu'activé, la priorité des objets est définit avec la propriété
zIndex du style
//declutter: false,
// Extension LayerSwitcher : Titre de la couche
title: 'Couche exemple',
// Source de la données
source: ol_source_layer_exemple,
// Style de la couche
// On utilise la fonction plutôt que le style initial.
// L'objet à afficher et la résolution seront passés à la fonction comme
arguments
style: ol_style_layer_exemple_fct,
})
6-Interaction avec la carte
Il est possible d’interagir avec la carte depuis « l’extérieur » de celle-ci. Par exemple, cliquer
sur un bouton pour zoomer quelque part.
Pour cela, il suffit d’utiliser les nombreuses méthodes disponibles avec la carte et de les
associer avec des boutons.
Dans mon exemple, je souhaite avoir deux boutons qui permettent de zoomer sur deux
emplacements différents. Pour cela, nous devons modifier la vue de notre carte
(variable vue_carte du fichier ol_map.js dans notre projet) car c’est la vue qui contrôle
l’emprise visualisée.
Nous allons faire deux modifications en utilisant les méthodes à disposition pour les
objets [Link] :
Changer le zoom avec setResolution .
Changer la position avec setCenter .
[Link]
<!-- Ajoutez ce code juste en dessous de votre carte -->
/* Bouton */
.btn_localisation{
margin: 20px 0px;
text-align: center;
}
.btn_localisation button {
display: inline-block;
height:35px;
width: 150px;
background-color: #AF00FF;
background-image: linear-gradient(332deg, #009FFF 0%, #AF00FF 100%);
.btn_localisation button:hover {
background-color: rgb(125, 0, 184);
background-image: linear-gradient(332deg, rgb(3, 123, 197) 0%, rgb(125, 0,
184) 100%);
cursor: pointer;
Ainsi, le niveau de zoom est défini par rapport à une résolution : un nombre de mètre de
carte par pixel affiché à l’écran. Par exemple, dans l’exemple précédent on zoom sur un
emplacement en définissant la résolution à 10 : 10 mètres de la carte par pixel affiché. Ainsi,
100 pixels de votre écran affichent 1 km.
Par exemple, si votre écran possède une résolution de 150 dpi (dot per inch : point par
pouce), il affiche environ 60 pixels par centimètre. Ainsi :
Résolution de l’écran : 150 dpi : 60 pixels = 1 cm écran
Résolution de la carte : 1 pixel = 10 m carte
1 cm écran = 60 pixels = 600 m carte ou 60 000 cm carte
=> Échelle = 1 : 60 000
La formule à utiliser est la suivante : Echelle = 1 : Rmap * ( Rscreen / 0,0254 )
Rscreen : résolution de l’écran en dpi (dot per inch) ou ppp (point par pouce)
Rmap : résolution de la carte en mètre par pixel
8-Exemple final
Voila un petit exemple avec un peu plus de CSS