rodolpheg

Untitled

Mar 11th, 2020
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 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. console.log('Affichage de chaque points, aglomérés ou non :')
  69. for (var i = 0; i < data.length; i++) {
  70. console.log(data[i].properties,data[i].geometry)
  71. }
  72. }
  73.  
  74. // téléchargement des données de l'API
  75. //const api_url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson';
  76. //const api_url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.geojson';
  77. const api_url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson';
  78.  
  79. // 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
  80. async function recupererLesDonnees() {
  81. // 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
  82. const response = await fetch(api_url)
  83. const data = await response.json();
  84. console.log('Nbr total de points :',data.features.length)
  85. // AGRÉGATION ÉTAPE 3 : appel du plugin d'agrégation et ajout des données
  86. cluster.load(data.features);
  87. updateClusters();
  88.  
  89. // Ajoût d'une citation pour les données
  90. maCarte.attributionControl.addAttribution("données : USGS");
  91. }
  92.  
  93. function updateClusters(repaint) {
  94. currentZoom = maCarte.getZoom(); // Quel est le niveau de zoom actuel ?
  95. canvas = maCarte.getBounds(); // Quelle est la taille de la carte à l'écran ?'
  96. N = canvas._northEast.lat;
  97. S = canvas._southWest.lat;
  98. W = canvas._southWest.lng;
  99. E = canvas._northEast.lng;
  100. worldBounds = [W, S, E, N]; // Boite à l'intérieure de laquelle afficher les données
  101.  
  102. // Récupérer les données agrégées sous forme de feature collection
  103. clusterData = cluster.getClusters(worldBounds, Math.floor(5))
  104. // affiche dans la console combien de point nous devons afficher après l'opération d'aglomération
  105. console.log('Nbr de points après aglomération :',clusterData.length)
  106. // Mettre à jour l'affichage
  107. dessinerSeismes(clusterData)
  108. }
  109.  
  110. recupererLesDonnees();
  111.  
  112. // Déclancher la fonction à chaque fois que la position de la "caméra" change
  113. maCarte.on('moveend', function(e) {
  114. updateClusters()
  115. });
  116.  
  117. // appeler automatiquement la fonction recupererLesDonnees toutes les 10000ms
  118. //setInterval(recupererLesDonnees,10000);
  119. // ajouter la couche seismes nouvellement mise à jour à la carte
  120. maCarte.addLayer(seismes);
  121.  
  122. </script>
  123. </body>
  124. </html>
Advertisement
Add Comment
Please, Sign In to add comment