rodolpheg

Untitled

Mar 11th, 2020
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.67 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <head>
  5. <title>Titre</title>
  6. <meta charset="UTF-8">
  7. <!-- https://leafletjs.com/download.html -->
  8. <script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
  9. <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
  10. <!-- AGRÉGATION ÉTAPE 1 : Ajoutons la bibliothèque SuperCluster qui nous permettra d'aglomérer nos points : https://github.com/mapbox/supercluster-->
  11. <script src="https://unpkg.com/[email protected]/dist/supercluster.min.js"></script>
  12. <style>
  13. /* On indique la taille de l'emplacement de la carte*/
  14. html, body {height: 100%; margin: 0;}
  15. #Carte { width: 100%; height: 100%; }
  16. </style>
  17. </head>
  18. <body>
  19. <div id='Carte'></div>
  20. <script>
  21. // créer la carte, remplacez VOTRE_TOKEN pour la clef que vous trouverez là : https://account.mapbox.com
  22. //var fondDeCarte = L.tileLayer('https://api.mapbox.com/styles/v1/mapbox/satellite-v9/tiles/{z}/{x}/{y}?access_token=VOTRE_TOKEN');
  23. // décochez la ligne suivante si vous n'avez pas de compte MapBox
  24. var fondDeCarte = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
  25. var maCarte = L.map('Carte', {
  26. layers: fondDeCarte,
  27. zoomControl: true
  28. });
  29. maCarte.setView([0,0], 2);
  30.  
  31. // Création d'une couche à ajouter à la carte
  32. var seismes = new L.layerGroup();
  33.  
  34. // AGRÉGATION ÉTAPE 2 : Création d'un objet "cluster"
  35. var cluster = new Supercluster({
  36. radius: 40,
  37. maxZoom: 20,
  38. initial: function() {
  39. return {
  40. count: 0,
  41. sum: 0,
  42. min: Infinity,
  43. max: -Infinity
  44. };
  45. },
  46. map: function(properties) {
  47. return {
  48. count: 1,
  49. sum: Number(properties['mag']),
  50. min: Number(properties['mag']),
  51. max: Number(properties['mag'])
  52. };
  53. },
  54. reduce: function(accumulated, properties) {
  55. accumulated.sum += Math.round(properties.sum * 100) / 100;
  56. accumulated.count += properties.count;
  57. accumulated.min = Math.round(Math.min(accumulated.min, properties.min) * 100) / 100;
  58. accumulated.max = Math.round(Math.max(accumulated.max, properties.max) * 100) / 100;
  59. accumulated.avg = accumulated.sum / accumulated.count;
  60. }
  61. });
  62.  
  63. // Création d'une fonction pour afficher un cercle par séisme
  64. function dessinerSeismes(data) {
  65. // nettoyer la couche seismes avant de dessiner les cercles à leur nouvelle position
  66. seismes.clearLayers()
  67. // dessiner les cercles
  68. for (var i = 0; i < data.length; i++) {
  69. // Si le point n'est pas agrégé (autrement dit, si il ne possède pas d'attribut 'avg')
  70. if (isNaN(data[i].properties.avg) == true) {
  71. // Récupération de plusieurs variables potentiellement intéressantes, telles que la magnitude du séisme, le moment où il est arrivé, etc.
  72. const {mag, place, time, url, type} = data[i].properties;
  73. const {coordinates} = data[i].geometry;
  74. // Conversion de la date en toutes lettre (et en Français)
  75. date = new Date(time)
  76. const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' };
  77. // Ajout du cercle
  78. seismes.addLayer(L.circleMarker([coordinates[1],coordinates[0]],{
  79. radius: mag * 2.0,
  80. stroke: false,
  81. opacity: 1,
  82. fillColor: 'red',
  83. fillOpacity: .95
  84. }).bindPopup("<h2>" + place + "</h2><h3>Séisme de magnitude " + mag + ", survenu le " + date.toLocaleDateString('fr-FR',options) + "</h3><a href=" + url + ">Plus d'informations</a>"));
  85. } else {
  86. // Récupération de la moyenne de la magnitude du séisme et du nombre de séismes aglomérés
  87. const {avg, count} = data[i].properties;
  88. const {coordinates} = data[i].geometry;
  89. seismes.addLayer(L.circleMarker([coordinates[1],coordinates[0]],{
  90. radius: data[i].properties.avg * 2.0,
  91. stroke: false,
  92. opacity: .95,
  93. fillColor: 'red',
  94. fillOpacity: .5
  95. }).bindPopup("<h2>Aggrégat de " + count + " séismes</h2><h3>Magnitude moyenne de " + Math.round(avg * 100)/100 + "</h3>"));
  96. }
  97. }
  98. }
  99.  
  100. // téléchargement des données de l'API
  101. //const api_url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson';
  102. //const api_url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.geojson';
  103. const api_url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson';
  104.  
  105. // Création d'une fonction asynchrone, qui authorise "await" afin de télécharger les données sans bloquer le reste des processus de la carte
  106. async function recupererLesDonnees() {
  107. // Téléchargement des données à l'adresse api_url. Tant que le téléchargement (effectué avec la fonction "fetch") n'est pas terminé, la fonction attend. Toutefois, puisque nous avons créé la fonction recupererLesDonnees en spécifiant qu'elle est asynchrone, le reste de la page est toujours fonctionnel
  108. const response = await fetch(api_url)
  109. const data = await response.json();
  110. console.log('Nbr total de points :',data.features.length)
  111. // AGRÉGATION ÉTAPE 3 : appel du plugin d'agrégation et ajout des données
  112. cluster.load(data.features);
  113. updateClusters();
  114.  
  115. // Ajoût d'une citation pour les données
  116. maCarte.attributionControl.addAttribution("données : USGS");
  117. }
  118.  
  119. function updateClusters(repaint) {
  120. currentZoom = maCarte.getZoom(); // Quel est le niveau de zoom actuel ?
  121. canvas = maCarte.getBounds(); // Quelle est la taille de la carte à l'écran ?'
  122. N = canvas._northEast.lat;
  123. S = canvas._southWest.lat;
  124. W = canvas._southWest.lng;
  125. E = canvas._northEast.lng;
  126. worldBounds = [W, S, E, N]; // Boite à l'intérieure de laquelle afficher les données
  127.  
  128. // Récupérer les données agrégées sous forme de feature collection
  129. clusterData = cluster.getClusters(worldBounds, Math.floor(currentZoom))
  130. // affiche dans la console combien de point nous devons afficher après l'opération d'aglomération
  131. console.log('Nbr de points après aglomération :',clusterData.length)
  132. // Mettre à jour l'affichage
  133. dessinerSeismes(clusterData)
  134. }
  135.  
  136. recupererLesDonnees();
  137.  
  138. // Déclancher la fonction à chaque fois que la position de la "caméra" change
  139. maCarte.on('moveend', function(e) {
  140. updateClusters()
  141. });
  142.  
  143. // appeler automatiquement la fonction recupererLesDonnees toutes les 10000ms
  144. //setInterval(recupererLesDonnees,10000);
  145. // ajouter la couche seismes nouvellement mise à jour à la carte
  146. maCarte.addLayer(seismes);
  147.  
  148. </script>
  149. </body>
  150. </html>
Advertisement
Add Comment
Please, Sign In to add comment