| admin | ||
| api | ||
| assets/css | ||
| config | ||
| data | ||
| docs | ||
| includes | ||
| scripts | ||
| .gitignore | ||
| .htaccess | ||
| ajouter-lieu.php | ||
| apache.conf | ||
| Caddyfile | ||
| changes_map.php | ||
| CONFIG_SERVERS.md | ||
| export_csv.php | ||
| export_sql.php | ||
| index.php | ||
| LICENSE | ||
| Makefile | ||
| nginx.conf | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| refresh-osm.php | ||
| robots.txt | ||
| rss-ville.php | ||
| rss.php | ||
Dashboard Ask Angela
Application web pour suivre les villes participant à l'action Ask Angela et le nombre de commerces recensés avec le tag harassment_prevention=ask_angela dans OpenStreetMap.
Fonctionnalités
- 🗺️ Carte interactive : Visualisation des lieux Ask Angela sur une carte Leaflet
- 📊 Statistiques : Suivi de la complétion par ville avec objectifs
- 📈 Graphiques temporels :
- Visualisation de la création des lieux par mois
- Évolution de la complétion globale dans le temps
- Évolution du nombre de lieux par type de dispositif
- 📥 Export CSV : Téléchargement de la liste complète des lieux adhérents
- 🏙️ Gestion des villes : Interface d'administration pour ajouter/modifier les villes et leurs objectifs
- 💾 Historique : Sauvegarde des statistiques dans une base SQLite
- 🔄 Synchronisation OSM : Récupération automatique des données depuis l'API Overpass
- 📊 Autres dispositifs : Visualisation des autres types de
harassment_preventionavec couleurs distinctes - 💾 Statistiques OSM : Enregistrement automatique du nombre de lieux Ask Angela trouvés dans OSM
- ➕ Formulaire public : Les utilisateurs peuvent proposer des lieux via un formulaire avec géocodage Addok
- ✅ Validation des propositions : Interface d'administration pour valider/rejeter les propositions de lieux
Prérequis
- PHP 7.4+ avec extensions :
- PDO
- PDO_SQLite
- cURL
- JSON
- Caddy Server (pour le serveur web)
- Make (optionnel, pour les commandes)
Installation
-
Cloner le dépôt (si applicable)
-
Installer les dépendances système :
# Sur Debian/Ubuntu sudo apt-get install php php-sqlite3 php-curl -
Initialiser la base de données :
make init-db # ou manuellement: php -r "require 'config/database.php'; getDB();" -
Importer les villes (optionnel) :
make import-villes # Cela importe les villes depuis data/villes.json avec leurs sources et estimations -
Récupérer les données OSM :
make fetch-osm # ou manuellement: php scripts/fetch_osm_data.php -
Lancer le serveur de développement local :
make serve # Le serveur sera accessible sur http://localhost:8000 # Pour utiliser un autre port: make serve PORT=8080 -
Configurer Caddy (pour la production) :
- Copier le
Caddyfiledans votre répertoire de configuration Caddy - Ou utiliser directement :
caddy run --config Caddyfile - Ajuster le chemin
rootdans le Caddyfile si nécessaire
- Copier le
-
Accéder à l'application :
- Développement : Ouvrir http://localhost:8000 dans votre navigateur
- Production : Ouvrir https://ask-angela.cipherbliss.com dans votre navigateur
Utilisation
Commandes Make
make help: Affiche l'aidemake init-db: Initialise la base de données SQLitemake fetch-osm: Récupère les données OSM depuis l'API Overpassmake import-villes: Importe les villes depuisdata/villes.jsondans la base de donnéesmake import-villes-update: Importe et met à jour les villes existantesmake add-bbox: Ajoute les bounding boxes aux villes dansvilles.json(utilise Nominatim)make sync-stats: Synchronise les statistiques depuis le GeoJSON OSMmake sync-stats-create: Synchronise les statistiques et crée les villes manquantesmake install: Installe l'application (initialise la DB)make serve: Lance un serveur PHP local sur http://localhost:8000make serve PORT=8080: Lance le serveur sur un port personnalisé
make status: Affiche le statut de l'applicationmake clean: Nettoie les fichiers générés (sauf la DB)make clean-all: Nettoie tout, y compris la base de données
Pages de l'application
-
Page d'accueil (
index.php) :- Affiche la carte avec les lieux Ask Angela
- Statistiques globales et par ville
- Barres de progression de complétion
- Graphique de création des lieux par mois
- Lien de téléchargement CSV
-
Ajouter un lieu (
ajouter-lieu.php) :- Formulaire public pour proposer un lieu
- Géocodage avec Addok (API Adresse)
- Vérification du nom du lieu
- Captcha anti-spam
- Prévisualisation sur carte
-
Administration - Villes (
admin/villes.php) :- Ajouter/modifier/supprimer des villes
- Définir les objectifs de commerces par ville
-
Administration - Statistiques (
admin/statistiques.php) :- Sauvegarder les statistiques de commerces par ville
- Consulter l'historique des statistiques
-
Administration - Lieux proposés (
admin/lieux-proposes.php) :- Lister toutes les propositions de lieux
- Filtrer par état d'ajout (ajouté, non ajouté)
- Marquer comme ajouté / annuler l'ajout
- Supprimer des propositions
- Visualiser la position sur une carte
- Lien direct vers OpenStreetMap
Récupération des données OSM
Le script scripts/fetch_osm_data.php interroge l'API Overpass pour récupérer les objets OSM selon la configuration définie dans config/osm_query.php.
Par défaut, la configuration récupère les objets liés à la thématique Ask Angela :
- Les lieux Ask Angela : Tous les lieux avec
harassment_prevention=ask_angela- Sauvegardés dans
data/osm_data.geojson - Le nombre de lieux est enregistré automatiquement en base de données
- Sauvegardés dans
- Les autres types : Tous les autres lieux avec d'autres valeurs de
harassment_prevention- Sauvegardés dans
data/osm_other_harassment_prevention.geojson - Affichés sur la carte avec des couleurs différentes selon le type
- Sauvegardés dans
Note : L'API Overpass peut prendre plusieurs minutes pour répondre selon le volume de données. Le script a un timeout de 10 minutes.
Le script enregistre automatiquement :
- Le nombre de lieux Ask Angela dans
osm_stats - L'historique global de complétion dans
historique_global - L'historique des types de
harassment_preventiondanshistorique_harassment_types
Personnalisation des objets récupérés
Le fichier config/osm_query.php permet de personnaliser complètement quels objets OSM sont récupérés pour le dashboard. Par défaut, il est configuré pour Ask Angela, mais vous pouvez l'adapter pour n'importe quel type d'objet documenté dans OSM.
Voir la section Configuration des requêtes OSM ci-dessous pour plus de détails et des exemples.
Structure du projet
ask-angela-dashboard/
├── admin/ # Pages d'administration
│ ├── villes.php # Gestion des villes
│ ├── statistiques.php # Sauvegarde des statistiques
│ └── lieux-proposes.php # Gestion des lieux proposés
├── config/ # Configuration
│ └── database.php # Configuration SQLite
├── data/ # Données (créé automatiquement)
│ ├── ask_angela.db # Base de données SQLite
│ ├── osm_data.geojson # Données OSM Ask Angela en GeoJSON
│ ├── osm_other_harassment_prevention.geojson # Autres types de harassment_prevention
│ └── villes.json # Liste des villes avec sources et estimations
├── includes/ # Fonctions utilitaires
│ └── functions.php # Fonctions PHP
├── scripts/ # Scripts CLI
│ ├── fetch_osm_data.php # Récupération OSM
│ └── import_villes.php # Import des villes depuis JSON
├── ajouter-lieu.php # Formulaire public d'ajout
├── export_csv.php # Export CSV des lieux
├── Caddyfile # Configuration Caddy
├── Makefile # Commandes documentées
├── index.php # Page d'accueil
└── README.md # Ce fichier
Base de données
Table villes
id: Identifiant uniquenom: Nom de la villepays: Pays (optionnel)objectif_commerces: Nombre de commerces attenducreated_at: Date de créationupdated_at: Date de mise à jour
Table statistiques
id: Identifiant uniqueville_id: Référence à la villenombre_commerces: Nombre de commerces recensésdate_statistique: Date de la statistique
Table osm_stats
id: Identifiant uniquenombre_lieux_ask_angela: Nombre de lieux Ask Angela trouvés dans OSMdate_mise_a_jour: Date de la dernière mise à jour
Table historique_global
id: Identifiant uniquetotal_commerces: Nombre total de commercestotal_objectif: Objectif totalcompletion_globale: Pourcentage de complétion globalenombre_villes: Nombre de villes avec objectifdate_mesure: Date de la mesure
Table historique_harassment_types
id: Identifiant uniquetype_harassment: Type de dispositif (ask_angela, etc.)nombre_lieux: Nombre de lieux pour ce typedate_mesure: Date de la mesure
Table propositions
id: Identifiant uniquenom_recherche: Terme de recherche utilisénom_lieu: Nom du lieu proposéosm_type: Type d'objet OSM (node, way, relation)osm_id: ID de l'objet OSMlatitude: Latitude du lieulongitude: Longitude du lieuadresse: Adresse complèteville: Villestatut: Statut (en_attente, accepte, rejete)created_at: Date de créationupdated_at: Date de mise à jour
Configuration Caddy
Le Caddyfile configure :
- Le domaine
ask-angela.cipherbliss.com - Le support PHP via PHP-FPM
- Les headers de sécurité
- La compression (gzip/zstd)
- Les logs
Important : Ajustez le chemin root dans le Caddyfile selon votre installation.
Fichier de configuration des villes
Le fichier data/villes.json contient la liste complète des villes participant au dispositif Ask Angela avec :
- Le nom de la ville
- Les sources de données (URLs, listes, etc.)
- L'estimation initiale du nombre de commerces
- L'état de complétion (si la ville a été complétée dans OSM)
- La date de complétion (si disponible)
- Bounding box (bbox) :
[min_lon, min_lat, max_lon, max_lat]pour cibler précisément les lieux OSM
Ajouter les bounding boxes
Pour améliorer la synchronisation automatique, vous pouvez ajouter les bbox aux villes :
make add-bbox
Cette commande utilise l'API Nominatim pour récupérer automatiquement les bbox de chaque ville. Attention : respectez le rate limit (1 requête/seconde), la commande peut donc prendre du temps.
Synchronisation automatique
Une fois les bbox ajoutées, la synchronisation utilise la géolocalisation pour associer précisément les lieux OSM aux villes :
# Synchroniser les statistiques (villes existantes uniquement)
make sync-stats
# Synchroniser et créer les villes manquantes
make sync-stats-create
Le système utilise d'abord les bbox pour un matching géographique précis, puis fait un fallback sur les noms de villes dans les tags OSM.
Configuration des requêtes OSM
Le fichier config/osm_query.php permet de personnaliser complètement quels objets OSM sont récupérés pour le dashboard.
Par défaut, la configuration est optimisée pour la thématique Ask Angela (harassment_prevention=ask_angela), mais vous pouvez l'adapter pour n'importe quel type d'objet documenté dans OpenStreetMap (restaurants, commerces, lieux de tourisme, etc.).
📖 Documentation complète : Voir docs/CONFIGURATION_OSM.md pour un guide détaillé avec de nombreux exemples.
Configuration par défaut (Ask Angela)
La configuration par défaut récupère tous les objets avec le tag harassment_prevention et les sépare en deux groupes :
- Groupe principal : objets avec
harassment_prevention=ask_angela→ sauvegardés dansosm_data.geojson - Autres groupes : autres valeurs de
harassment_prevention→ sauvegardés dansosm_other_harassment_prevention.geojson
Personnalisation
Vous pouvez modifier config/osm_query.php pour récupérer d'autres types d'objets OSM. Voici deux exemples :
Exemple 1 : Récupérer les restaurants avec cuisine spécifique
return [
'query_type' => 'tag',
'tag_query' => [
'tag_key' => 'amenity',
'tag_value' => 'restaurant',
'object_types' => ['node', 'way'],
'include_metadata' => true,
'timeout' => 300,
],
'filtering' => [
'enabled' => true,
'filter_tag' => 'cuisine',
'primary_value' => 'french',
'primary_output_file' => 'osm_data.geojson',
'other_output_file' => 'osm_other_cuisines.geojson',
],
];
Cette configuration récupère :
- Tous les restaurants (
amenity=restaurant) - Les sépare entre restaurants français (
cuisine=french) et autres cuisines - Utile pour créer un dashboard de restaurants français dans une région
Exemple 2 : Récupérer les lieux de tourisme avec requête personnalisée
return [
'query_type' => 'custom',
'custom_query' => '[out:json][timeout:300];
(
node["tourism"]["name"];
way["tourism"]["name"];
relation["tourism"]["name"];
);
(._;>;);
out meta;',
'filtering' => [
'enabled' => true,
'filter_tag' => 'tourism',
'primary_value' => 'museum',
'primary_output_file' => 'osm_data.geojson',
'other_output_file' => 'osm_other_tourism.geojson',
],
];
Cette configuration récupère :
- Tous les objets touristiques avec un nom (
tourism+name) - Les sépare entre musées (
tourism=museum) et autres types de tourisme - Utile pour créer un dashboard des lieux touristiques d'une région
Options de configuration
Type de requête : query_type
'tag'(recommandé) : Requête basée sur un tag OSM simple'custom': Requête Overpass QL personnalisée (avancé)
Configuration tag : tag_query
tag_key: Clé du tag OSM à rechercher (ex:'amenity','tourism','shop')tag_value: Valeur spécifique du tag (null= toutes les valeurs)object_types: Types d'objets à inclure (['node'],['way'],['relation'], ou combinaison)include_metadata: Inclure les métadonnées OSM (user, timestamp, changeset)timeout: Timeout de la requête Overpass en secondes
Filtrage : filtering
enabled: Activer/désactiver le filtrage des résultatsfilter_tag: Tag utilisé pour séparer les résultats en groupesprimary_value: Valeur du tag pour le groupe principalprimary_output_file: Nom du fichier GeoJSON pour le groupe principalother_output_file: Nom du fichier GeoJSON pour les autres valeurs
Exemples d'utilisation
Suivre les pharmacies (amenity=pharmacy)
'tag_query' => [
'tag_key' => 'amenity',
'tag_value' => 'pharmacy',
'object_types' => ['node', 'way'],
'include_metadata' => true,
],
'filtering' => [
'enabled' => false, // Pas de filtrage, tous les résultats dans primary
],
Suivre les commerces par type (shop=*)
'tag_query' => [
'tag_key' => 'shop',
'tag_value' => null, // Toutes les valeurs
'object_types' => ['node', 'way'],
],
'filtering' => [
'enabled' => true,
'filter_tag' => 'shop',
'primary_value' => 'supermarket',
'primary_output_file' => 'osm_supermarkets.geojson',
'other_output_file' => 'osm_other_shops.geojson',
],
Notes importantes
- Modifier la configuration : Après avoir modifié
config/osm_query.php, exécutezmake fetch-osmpour récupérer les nouvelles données - Compatibilité : Si vous changez le type d'objets récupérés, certaines fonctionnalités du dashboard peuvent nécessiter des ajustements (notamment les statistiques et le suivi en base de données)
- Performance : Les requêtes Overpass peuvent prendre du temps selon le volume de données. Ajustez le
timeoutsi nécessaire. Préférez traiter des thématiques avec assez peu d'objets, moins de 10 000 au total idéalement, après quoi il serait préférable d'utiliser des traitement sur des exports pbf d'openstreetmap que vous pourrez mettre à jour. - Documentation OSM : Consultez le wiki OpenStreetMap pour connaître les tags disponibles
Développement
Pour contribuer ou modifier l'application :
- Les fichiers PHP suivent les standards PSR-1/PSR-2
- La base de données est initialisée automatiquement au premier accès
- Les données OSM peuvent être rafraîchies régulièrement avec
make fetch-osm - Les villes peuvent être importées depuis
data/villes.jsonavecmake import-villes - La configuration des requêtes OSM peut être personnalisée dans
config/osm_query.php
Licence
Ce projet est distribué sous la GNU Affero General Public License v3 ou version ultérieure (AGPL-3+).
Vous pouvez consulter le texte complet de la licence dans le fichier LICENSE à la racine du projet.
Copyright et attribution
Auteurs :
- Tykayn
- CipherBliss EI
Copyright (C) 2024 Tykayn, CipherBliss EI
Ce logiciel est libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la licence AGPL-3+, telle que publiée par la Free Software Foundation.
Aucune garantie n'est prévue par la licence, dans la mesure permise par la loi.
Remarques importantes
- S'il est exécuté sur un serveur ou utilisé à distance via un réseau, toute version modifiée doit rendre disponible le code source correspondant à tous les utilisateurs qui interagissent avec le logiciel. (Section 13 de l'AGPL-3)
- Chaque fichier source doit comporter une notice de copyright et la mention de la licence AGPL-3+.
Pour plus d'informations, consultez : https://www.gnu.org/licenses/agpl-3.0.html
Support
Pour toute question ou problème, consultez la documentation ou ouvrez une issue.
Mise à jour automatique par cron
Pour automatiser la mise à jour des données OSM deux fois par jour (par exemple à 3h et 15h), ajoutez la ligne suivante dans la crontab de l'utilisateur exécutant l'application :
0 3,15 * * * cd /home/poule/encrypted/stockage-syncable/www/server/sites/ask-angela-dashboard && make fetch-osm >> cron.log 2>&1
Explications :
0 3,15 * * *: lance la commande chaque jour à 3h00 et 15h00.cd ... && ...: s'assure que la commande est exécutée dans le bon dossier.make fetch-osm: met à jour les données OSM.>> cron.log 2>&1: enregistre la sortie et les erreurs dans un fichiercron.logpour diagnostic.
Pour éditer la crontab :
crontab -e
Ajoutez la ligne précédente, adaptez le chemin du projet si nécessaire.
Astuce : Vérifiez régulièrement le contenu de
cron.logpour surveiller d’éventuelles erreurs lors des mises à jour automatiques.