suivi des lieux ask angela dans osm
Find a file
2026-01-21 23:09:44 +01:00
admin up doc flux rss 2026-01-21 22:59:55 +01:00
api up doc flux rss 2026-01-21 22:59:55 +01:00
assets/css cartes des lieux modifiés par date 2026-01-21 22:29:39 +01:00
config up doc flux rss 2026-01-21 22:59:55 +01:00
data up doc flux rss 2026-01-21 22:59:55 +01:00
docs up doc flux rss 2026-01-21 22:59:55 +01:00
includes up doc flux rss 2026-01-21 22:59:55 +01:00
scripts up doc flux rss 2026-01-21 22:59:55 +01:00
.gitignore up deps 2026-01-21 17:46:19 +01:00
.htaccess up doc flux rss 2026-01-21 22:59:55 +01:00
ajouter-lieu.php cartes des lieux modifiés par date 2026-01-21 22:29:39 +01:00
apache.conf up doc flux rss 2026-01-21 22:59:55 +01:00
Caddyfile up doc flux rss 2026-01-21 22:59:55 +01:00
changes_map.php up doc flux rss 2026-01-21 22:59:55 +01:00
CONFIG_SERVERS.md up doc flux rss 2026-01-21 22:59:55 +01:00
export_csv.php init counts ask angela and scripts 2026-01-17 16:06:16 +01:00
export_sql.php up traductions normand 2026-01-18 16:15:16 +01:00
index.php up doc flux rss 2026-01-21 22:59:55 +01:00
LICENSE up doc flux rss 2026-01-21 22:59:55 +01:00
Makefile up deps 2026-01-21 17:46:19 +01:00
nginx.conf up doc flux rss 2026-01-21 22:59:55 +01:00
package-lock.json cartes des lieux modifiés par date 2026-01-21 22:29:39 +01:00
package.json up deps 2026-01-21 17:46:19 +01:00
README.md up doc autres thématiques d'objets 2026-01-21 23:09:44 +01:00
refresh-osm.php ajout podium 2026-01-18 17:48:17 +01:00
robots.txt init counts ask angela and scripts 2026-01-17 16:06:16 +01:00
rss-ville.php up doc flux rss 2026-01-21 22:59:55 +01:00
rss.php up traductions normand 2026-01-18 16:15:16 +01:00

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_prevention avec 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

  1. Cloner le dépôt (si applicable)

  2. Installer les dépendances système :

    # Sur Debian/Ubuntu
    sudo apt-get install php php-sqlite3 php-curl
    
  3. Initialiser la base de données :

    make init-db
    # ou manuellement:
    php -r "require 'config/database.php'; getDB();"
    
  4. Importer les villes (optionnel) :

    make import-villes
    # Cela importe les villes depuis data/villes.json avec leurs sources et estimations
    
  5. Récupérer les données OSM :

    make fetch-osm
    # ou manuellement:
    php scripts/fetch_osm_data.php
    
  6. 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
    
  7. Configurer Caddy (pour la production) :

    • Copier le Caddyfile dans votre répertoire de configuration Caddy
    • Ou utiliser directement : caddy run --config Caddyfile
    • Ajuster le chemin root dans le Caddyfile si nécessaire
  8. Accéder à l'application :

Utilisation

Commandes Make

  • make help : Affiche l'aide
  • make init-db : Initialise la base de données SQLite
  • make fetch-osm : Récupère les données OSM depuis l'API Overpass
  • make import-villes : Importe les villes depuis data/villes.json dans la base de données
  • make import-villes-update : Importe et met à jour les villes existantes
  • make add-bbox : Ajoute les bounding boxes aux villes dans villes.json (utilise Nominatim)
  • make sync-stats : Synchronise les statistiques depuis le GeoJSON OSM
  • make sync-stats-create : Synchronise les statistiques et crée les villes manquantes
  • make install : Installe l'application (initialise la DB)
  • make serve : Lance un serveur PHP local sur http://localhost:8000
    • make serve PORT=8080 : Lance le serveur sur un port personnalisé
  • make status : Affiche le statut de l'application
  • make 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

  1. 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
  2. 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
  3. Administration - Villes (admin/villes.php) :

    • Ajouter/modifier/supprimer des villes
    • Définir les objectifs de commerces par ville
  4. Administration - Statistiques (admin/statistiques.php) :

    • Sauvegarder les statistiques de commerces par ville
    • Consulter l'historique des statistiques
  5. 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 :

  1. 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
  2. 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

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_prevention dans historique_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 unique
  • nom : Nom de la ville
  • pays : Pays (optionnel)
  • objectif_commerces : Nombre de commerces attendu
  • created_at : Date de création
  • updated_at : Date de mise à jour

Table statistiques

  • id : Identifiant unique
  • ville_id : Référence à la ville
  • nombre_commerces : Nombre de commerces recensés
  • date_statistique : Date de la statistique

Table osm_stats

  • id : Identifiant unique
  • nombre_lieux_ask_angela : Nombre de lieux Ask Angela trouvés dans OSM
  • date_mise_a_jour : Date de la dernière mise à jour

Table historique_global

  • id : Identifiant unique
  • total_commerces : Nombre total de commerces
  • total_objectif : Objectif total
  • completion_globale : Pourcentage de complétion globale
  • nombre_villes : Nombre de villes avec objectif
  • date_mesure : Date de la mesure

Table historique_harassment_types

  • id : Identifiant unique
  • type_harassment : Type de dispositif (ask_angela, etc.)
  • nombre_lieux : Nombre de lieux pour ce type
  • date_mesure : Date de la mesure

Table propositions

  • id : Identifiant unique
  • nom_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 OSM
  • latitude : Latitude du lieu
  • longitude : Longitude du lieu
  • adresse : Adresse complète
  • ville : Ville
  • statut : Statut (en_attente, accepte, rejete)
  • created_at : Date de création
  • updated_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 dans osm_data.geojson
  • Autres groupes : autres valeurs de harassment_prevention → sauvegardés dans osm_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ésultats
  • filter_tag : Tag utilisé pour séparer les résultats en groupes
  • primary_value : Valeur du tag pour le groupe principal
  • primary_output_file : Nom du fichier GeoJSON pour le groupe principal
  • other_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écutez make fetch-osm pour 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 timeout si 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 :

  1. Les fichiers PHP suivent les standards PSR-1/PSR-2
  2. La base de données est initialisée automatiquement au premier accès
  3. Les données OSM peuvent être rafraîchies régulièrement avec make fetch-osm
  4. Les villes peuvent être importées depuis data/villes.json avec make import-villes
  5. 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.

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 fichier cron.log pour 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.log pour surveiller déventuelles erreurs lors des mises à jour automatiques.