ajout de courbe pour stats

This commit is contained in:
Tykayn 2025-06-06 12:17:03 +02:00 committed by tykayn
parent ece9ae91d5
commit 0bf30717a4
3 changed files with 85 additions and 4 deletions

View file

@ -1,5 +1,6 @@
# OSM Commerces # OSM Commerces
dépot pour faire une démo de "OSM mon commerce", permettant de modifier des commerces sans avoir de compte OSM. dépot pour faire une démo de "OSM mon commerce", permettant de modifier des commerces sans avoir de compte OSM.
Ce projet permet d'avoir un tableau de bord pour une zone donnée concernant la completion de commerces et autres lieux d'intérêt amenés à être mis à jour en autonomie par les personnes qui y travaillent.
Configurer .env.local pour mettre le token bearer d'un compte dédié Configurer .env.local pour mettre le token bearer d'un compte dédié
installer les dépendances avec composer installer les dépendances avec composer
@ -9,8 +10,8 @@ déployer sur un serveur ayant du php 8
- PHP 8.1 ou supérieur - PHP 8.1 ou supérieur
- Composer - Composer
- PostgreSQL 13 ou supérieur - PostgreSQL 13 ou supérieur, ou Mysql / MariaDB
- Symfony 6.3 - Symfony 7.2
- Extensions PHP requises : - Extensions PHP requises :
- pdo_pgsql - pdo_pgsql
- xml - xml

View file

@ -1,5 +1,7 @@
<?php <?php
/**
* l'histoire note la completion dans le temps d'un lieu
*/
namespace App\Entity; namespace App\Entity;
use App\Repository\HistoryRepository; use App\Repository\HistoryRepository;

View file

@ -12,6 +12,10 @@
stroke: #fff; stroke: #fff;
stroke-width: 3; stroke-width: 3;
} }
#distribution_completion {
height: 300px;
margin: 20px 0;
}
</style> </style>
{% endblock %} {% endblock %}
@ -66,6 +70,11 @@
</div> </div>
<div class="card mt-4"> <div class="card mt-4">
<div id="distribution_completion" class="mt-4 mb-4"></div>
<div class="row"> <div class="row">
<div class="col-md-6 col-12"> <div class="col-md-6 col-12">
<h1 class="card-title p-4">Tableau des {{ stats.places |length }} lieux</h1> <h1 class="card-title p-4">Tableau des {{ stats.places |length }} lieux</h1>
@ -96,6 +105,7 @@
<script src='{{ asset('js/maplibre/maplibre-gl.js') }}'></script> <script src='{{ asset('js/maplibre/maplibre-gl.js') }}'></script>
<script src='{{ asset('js/turf/turf.min.js') }}'></script> <script src='{{ asset('js/turf/turf.min.js') }}'></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script> <script>
const request = `{{query_places|raw}}`; const request = `{{query_places|raw}}`;
const zip_code = `{{stats.zone}}`; const zip_code = `{{stats.zone}}`;
@ -157,6 +167,71 @@
`; `;
} }
function calculateCompletionDistribution(elements) {
// Créer des buckets de 10% (0-10%, 10-20%, etc.)
const buckets = Array(11).fill(0);
elements.forEach(element => {
const completion = calculateCompletion(element);
const bucketIndex = Math.floor(completion / 10);
buckets[bucketIndex]++;
});
return buckets;
}
function createCompletionChart(elements) {
const distribution = calculateCompletionDistribution(elements);
const ctx = document.createElement('canvas');
document.getElementById('distribution_completion').appendChild(ctx);
new Chart(ctx, {
type: 'line',
data: {
labels: ['0-10%', '10-20%', '20-30%', '30-40%', '40-50%', '50-60%', '60-70%', '70-80%', '80-90%', '90-100%'],
datasets: [{
label: 'Nombre de commerces',
data: distribution,
backgroundColor: 'rgba(0, 128, 0, 0.1)',
borderColor: 'rgba(0, 128, 0, 1)',
borderWidth: 2,
tension: 0.4,
fill: true,
pointBackgroundColor: 'rgba(0, 128, 0, 1)',
pointBorderColor: '#fff',
pointBorderWidth: 2,
pointRadius: 4,
pointHoverRadius: 6
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Nombre de commerces'
}
},
x: {
title: {
display: true,
text: 'Taux de complétion'
}
}
},
plugins: {
title: {
display: true,
text: 'Distribution du taux de complétion des commerces'
}
}
}
});
}
async function fetchland() { async function fetchland() {
// Requête pour obtenir le contour administratif // Requête pour obtenir le contour administratif
const boundaryQuery = `[out:json][timeout:25]; const boundaryQuery = `[out:json][timeout:25];
@ -179,7 +254,7 @@ out skel qt;`;
const map = new maplibregl.Map({ const map = new maplibregl.Map({
container: 'map', container: 'map',
style: 'https://api.maptiler.com/maps/basic-v2/style.json?key={{ maptiler_token }}', style: 'https://api.maptiler.com/maps/streets-v2/style.json?key={{ maptiler_token }}',
center: [2.3488, 48.8534], center: [2.3488, 48.8534],
zoom: 12 zoom: 12
}); });
@ -225,6 +300,9 @@ out skel qt;`;
console.log('map chargé',data.elements); console.log('map chargé',data.elements);
mapElements = data.elements; mapElements = data.elements;
// Créer le graphique de distribution
createCompletionChart(data.elements);
document.getElementById('maploader').classList.add('d-none'); document.getElementById('maploader').classList.add('d-none');
// Créer une source pour les cercles // Créer une source pour les cercles