Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <title>Carte connectée à PostgreSQL</title>
- <meta charset="utf-8" />
- <!-- CSS de Leaflet -->
- <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
- <!-- Bibliothèque javaScript de Leaflet -->
- <script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
- <!-- Importation d ela bibliothèque JQuery pour implémenter un AJAX -->
- <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
- <!-- Importation de la serie de styles CSS de Bootstrap -->
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
- <!-- Importation de la petite bibliothèque de fonctions Classy Brew pour nous aider à classifier nos données et leur attribuer un palette de couleurs -->
- <script src="classybrew.js"></script>
- <!-- Ajout de quelques styles supplémentaires (taille de la carte, syle de la fenêtre d'informations, de la légende, etc.) -->
- <style>
- html,
- body {
- height: 100%;
- margin: 0;
- }
- #map {
- width: 100%;
- height: 80%;
- }
- .info {
- padding: 6px 8px;
- font: 14px/16px Arial, Helvetica, sans-serif;
- background: rgba(255, 255, 255, 0.8);
- box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
- border-radius: 5px;
- }
- .info h4 {
- margin: 0 0 5px;
- color: #777;
- }
- .legend {
- text-align: left;
- line-height: 18px;
- color: #555;
- }
- .legend i {
- width: 18px;
- height: 18px;
- float: left;
- margin-right: 8px;
- opacity: 0.7;
- }
- </style>
- </head>
- <body>
- <br>
- <!-- Création d'un petit formulaire HTML avec les classes de styles de Bootstrap -->
- <form class="form-inline">
- <!-- Un menu déroulant pour choisir la variable à visualiser -->
- <div class="dropdown mb-2 mr-sm-2">
- <select class="form-control" id="variable">
- <option value="rev">Revenu médian</option>
- <option value="pop">Population</option>
- <option value="logmedprop">Frais de logement médian (propriétaires)</option>
- <option value="logmedloc">Frais de logement médian (propriétaires)</option>
- </select>
- </div>
- <label class="sr-only" for="inlineFormInputGroupUsername2">min</label>
- <!-- Une zone de texte pour entrer la valeur minimale que l'on souhaite afficher -->
- <div class="input-group mb-2 mr-sm-2">
- <div class="input-group-prepend">
- <div class="input-group-text">Min.</div>
- </div>
- <input type="text" class="form-control" id="varMin" placeholder=0>
- </div>
- <!-- Une zone de texte pour entrer la valeur maximale que l'on souhaite afficher -->
- <label class="sr-only" for="inlineFormInputGroupUsername2">max</label>
- <div class="input-group mb-2 mr-sm-2">
- <div class="input-group-prepend">
- <div class="input-group-text">Max.</div>
- </div>
- <input type="text" class="form-control" id="varMax" placeholder=0>
- </div>
- <!-- Un menu déroulant pour choisir la palette de couleurs, pour référence, voir https://www.datanovia.com/en/fr/blog/palette-de-couleurs-rcolorbrewer-de-a-a-z/ -->
- <div class="dropdown mb-2 mr-sm-2">
- <select class="form-control" id="palette">
- <!-- Palettes séquentielles -->
- <option value="OrRd">OrRd</option>
- <option value="PuBu">PuBu</option>
- <option value="BuPu">BuPu</option>
- <option value="Oranges">Oranges</option>
- <option value="BuGn">BuGn</option>
- <option value="YlOrBr">YlOrBr (d)</option>
- <option value="YlGn">YlGn (d)</option>
- <option value="Reds">Reds (d)</option>
- <option value="RdPu">RdPu (d)</option>
- <option value="Greens">Greens</option>
- <option value="YlGnBu">YlGnBu (d)</option>
- <option value="Purples">Purples</option>
- <option value="GnBu">GnBu</option>
- <option value="Greys">Greys</option>
- <option value="PuRd">PuRd (d)</option>
- <option value="Blues">Blues</option>
- <option value="PuBuGn">PuBuGn</option>
- <!-- Palettes divergentes -->
- <option value="Spectral">Spectral</option>
- <option value="RdYlGn">RdYlGn</option>
- <option value="RdBu">RdBu</option>
- <option value="PiYG">PiYG</option>
- <option value="PRGn">PRGn</option>
- <option value="RdYlBu">RdYlBu</option>
- <option value="BrBG">BrBG</option>
- <option value="RdGy">RdGy</option>
- <option value="PuOr">PuOr</option>
- <!-- Palettes qualitatives -->
- <option value="Set1">Set1</option>
- <option value="Set2">Set2</option>
- <option value="Set3">Set3</option>
- <option value="Accent">Accent</option>
- <option value="Dark2">Dark2</option>
- <option value="Pastel1">Pastel1</option>
- <option value="Pastel2">Pastel2</option>
- <option value="Paired">Paired</option>
- </select>
- </div>
- <!-- Un menu déroulant pour choisir la méthode de classification des données -->
- <div class="dropdown mb-2 mr-sm-2">
- <select class="form-control" id="classif">
- <option value="jenks">Ruptures naturelles (Jenks)</option>
- <option value="quantile">Quantilles</option>
- <option value="equal_interval">Intervals égaux</option>
- </select>
- </div>
- <!-- Bouton pour envoyer les données au serveur -->
- <button id="envoyer" type="button" class="btn btn-primary mb-2">Envoyer</button>
- </form>
- <br>
- <!-- Conteneur de notre carte -->
- <div id='map'></div>
- <!-- Début du script Javascript -->
- <script>
- // Création d'un objet classybrew que l'on appelera plus tard
- var brew = new classyBrew(); // create brew object
- // Initialisation d'une variable
- var lege;
- // Initialisation de notre carte Leaflet, centrée sur Montréal avec un niveau de zoom de 11
- var maCarte = L.map('map').setView([45.52, -73.63], 11);
- L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
- maxZoom: 18,
- attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
- '<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
- 'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
- id: 'mapbox/light-v9'
- }).addTo(maCarte);
- function style(feature) {
- return {
- weight: .5,
- opacity: 1,
- color: 'white',
- dashArray: '3',
- fillOpacity: 0.7,
- //fillColor: getColor(feature.properties['var'])
- fillColor: brew.getColorInRange(feature.properties['var'])
- };
- }
- function onEachFeature(feature, layer) {
- layer.on({
- mouseover: surligneEntite,
- mouseout: resetStyleEntite,
- click: zoomSurEntite
- });
- }
- var info = L.control({
- position: 'topright'
- });
- info.onAdd = function(map) {
- this._div = L.DomUtil.create('div', 'info');
- this.update();
- return this._div;
- };
- info.update = function(polygone) {
- this._div.innerHTML = '<p>' + lege + '</p><hr>' + (polygone ?
- 'Aire de diffusion ' + polygone.da_number + ' : <b>' + polygone.var+'</b>' : '<em>Pointez une aire de diffusion</em>');
- };
- // On ajoute la fenêtre d'information à la carte
- info.addTo(maCarte);
- // Lorsque le pointeur de la souris survole un polygone, celui adopte un style différent (surligné)
- function surligneEntite(e) {
- var layer = e.target;
- layer.setStyle({
- weight: 2,
- color: 'white',
- dashArray: '',
- fillOpacity: 0.5
- });
- info.update(layer.feature.properties);
- }
- // Lorsque le pointeur de la souris ne survole plus un polygone, celui reprend son style original
- function resetStyleEntite(e) {
- var layer = e.target;
- poly.resetStyle(layer);
- info.update();
- }
- // Fonction permettant de zoomer sur les polygones lorsque l'on clique dessus
- function zoomSurEntite(e) {
- var layer = e.target;
- maCarte.fitBounds(layer.getBounds());
- }
- // Récupération des données entrées par l'utilisateur/trice
- var btnSubmit = document.getElementById("envoyer")
- var inputVarMin = document.getElementById("varMin")
- var inputVarMax = document.getElementById("varMax")
- var inputVar = document.getElementById("variable")
- var inputPal = document.getElementById("palette")
- var inputCla = document.getElementById("classif")
- // Lorsque le bouton "Envoyer" est cliqué...
- btnSubmit.addEventListener("click", function(e) {
- // ... les valeurs sélectionnées sont attribuées à des variables que l'on récupérera par la suite
- var variable = inputVar.value;
- var varMin = parseInt(inputVarMin.value);
- var varMax = parseInt(inputVarMax.value);
- var palette = inputPal.value;
- var classif = inputCla.value;
- var table = 'montreal_postgis'; // dans quelle table chercher les données ?
- // Si varMin et varMax ne sont pas spécifiées, leur donner des valeurs par défaut
- if (isNaN(varMin)) {
- varMin = 0;
- }
- if (isNaN(varMax)) {
- varMax = 10000000000;
- }
- // Adapter la légende à la variable affichée
- if (variable == 'rev') {
- lege = 'Revenu médian en $';
- } else if (variable == 'pop') {
- lege = 'Densité de population en personnes par km carrés';
- } else if (variable == 'logmedprop') {
- lege = 'Frais de logement mensuels médian (propriétaires) en $';
- } else if (variable == 'logmedloc') {
- lege = 'Frais de logement mensuels médian (locataires) en $';
- }
- // Démarrage du processus AJAX de JQuery
- $.ajax({
- url: 'queryPostgresql.php?table=' + table + '&var=' + variable + '&varMin=' + varMin + '&varMax=' + varMax,
- success: function(response) {
- try {
- maCarte.removeLayer(poly);
- maCarte.removeControl(legend);
- } catch (err) {
- console.log(err)
- }
- // Nous transformons cette réponse, qui est sous la forme d'un simple texte, en objet JSON
- var donnees = JSON.parse(response);
- // Classybrew a besoin de l'ensemble des données pour calculer la classification et la palette de couleur
- // Créons pour cela une liste vide
- var values = []
- // passons à travers toutes les données recueillies par notre requête SQL et ajoutons les valeurs une par une
- for (let i = 0; i < donnees.features.length; i++) {
- values.push(parseFloat(donnees.features[i].properties.var));
- };
- // Définition des données à classifier
- brew.setSeries(values);
- // Détermination du nombre de classes
- brew.setNumClasses(8);
- // Détermination de la palette de couleurs
- brew.setColorCode(palette);
- // Détermination du type de classification
- brew.classify(classif);
- // Calcul des classes
- var classes = brew.classify(classif);
- // Affichage des polygones. Comme nous avons formaté cet objet de manière à ce qu'il correspondent aux standards GeoJSON, nous pouvons directement le lire avec Leaflet
- poly = L.geoJSON(donnees, {
- style: style, // On applique le style selon la fonction style
- onEachFeature: onEachFeature // On applique les "listeners pour ajjouter de l'intération à la carte
- });
- // ajoutons les polygones à notre carte
- poly.addTo(maCarte);
- // adapter la vue à l'étendue des polygones affichés
- maCarte.fitBounds(poly.getBounds());
- // Ajoutons un emplacement pour la légende
- legend = L.control({
- position: 'bottomright'
- });
- legend.onAdd = function(map) {
- // création d'un élément <div>
- var div = L.DomUtil.create('div', 'info legend');
- var labels = [];
- // itération à travers les classes (calculées par Classybrew) et création des icones sous forme de code HTML
- for (var i = 0; i < classes.length - 1; i++) {
- //labels.push('<i style="background:' + palette[i] + '"></i>' + classes[i] + ' $ à ' + classes[i + 1] + " $<br>");
- labels.push('<i style="background:' + brew.getColorInRange((parseInt(classes[i]) + parseInt(classes[i + 1])) / 2) + '"></i>' + parseInt(classes[i]) + ' à ' + parseInt(classes[i + 1]) + " <br>");
- }
- // injection du code HTML dans la page
- div.innerHTML = lege + '<hr>' + labels.join('<br>');
- return div;
- };
- // maintenant que l'objet "legende" est créé, ajoutons-le à notre carte
- legend.addTo(maCarte);
- // Ajjout de l'attribution relative aux données
- maCarte.attributionControl.addAttribution('Données © <a href="http://statisticscanada.ca/">Statistiques Canada</a>');
- }
- })
- });
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment