up wiki compare
This commit is contained in:
parent
d2936d5730
commit
1535cf8ee3
8 changed files with 1036 additions and 79 deletions
|
@ -2334,8 +2334,74 @@ final class AdminController extends AbstractController
|
|||
$city = $statsRepo->findOneBy(['zone' => $inseeCode]);
|
||||
|
||||
if (!$city) {
|
||||
$this->addFlash('error', 'Ville non trouvée pour le code INSEE ' . $inseeCode);
|
||||
return $this->redirectToRoute('app_admin');
|
||||
// Si aucune stats n'existe, rechercher dans l'API geo.api.gouv.fr
|
||||
$apiUrl = "https://geo.api.gouv.fr/communes/{$inseeCode}";
|
||||
$response = @file_get_contents($apiUrl);
|
||||
|
||||
if ($response === false) {
|
||||
$this->addFlash('error', 'Ville non trouvée pour le code INSEE ' . $inseeCode . ' et impossible de récupérer les informations depuis l\'API geo.api.gouv.fr.');
|
||||
return $this->redirectToRoute('app_admin');
|
||||
}
|
||||
|
||||
$communeData = json_decode($response, true);
|
||||
if (!$communeData || !isset($communeData['nom'])) {
|
||||
$this->addFlash('error', 'Aucune commune trouvée avec ce code INSEE dans l\'API geo.api.gouv.fr.');
|
||||
return $this->redirectToRoute('app_admin');
|
||||
}
|
||||
|
||||
// Créer un nouvel objet Stats avec les données de l'API
|
||||
$city = new Stats();
|
||||
$city->setZone($inseeCode)
|
||||
->setName($communeData['nom'])
|
||||
->setDateCreated(new \DateTime())
|
||||
->setDateModified(new \DateTime())
|
||||
->setKind('osmose_request');
|
||||
|
||||
// Ajouter la population si disponible
|
||||
if (isset($communeData['population'])) {
|
||||
$city->setPopulation($communeData['population']);
|
||||
}
|
||||
|
||||
// Ajouter les coordonnées si disponibles
|
||||
if (isset($communeData['centre']) && isset($communeData['centre']['coordinates'])) {
|
||||
$city->setLon((string)$communeData['centre']['coordinates'][0]);
|
||||
$city->setLat((string)$communeData['centre']['coordinates'][1]);
|
||||
} else {
|
||||
// Si les coordonnées ne sont pas dans la réponse initiale, faire une requête spécifique
|
||||
try {
|
||||
$apiUrl = 'https://geo.api.gouv.fr/communes/' . $inseeCode . '?fields=centre';
|
||||
$response = @file_get_contents($apiUrl);
|
||||
if ($response !== false) {
|
||||
$data = json_decode($response, true);
|
||||
if (isset($data['centre']['coordinates']) && count($data['centre']['coordinates']) === 2) {
|
||||
$city->setLon((string)$data['centre']['coordinates'][0]);
|
||||
$city->setLat((string)$data['centre']['coordinates'][1]);
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Ignorer les erreurs lors de la récupération des coordonnées
|
||||
}
|
||||
}
|
||||
|
||||
// Ajouter les codes postaux si disponibles
|
||||
if (isset($communeData['codesPostaux']) && !empty($communeData['codesPostaux'])) {
|
||||
$city->setCodesPostaux(implode(',', $communeData['codesPostaux']));
|
||||
}
|
||||
|
||||
// Ajouter le code EPCI si disponible
|
||||
if (isset($communeData['codeEpci'])) {
|
||||
$city->setCodeEpci((int)$communeData['codeEpci']);
|
||||
}
|
||||
|
||||
// Ajouter le SIREN si disponible
|
||||
if (isset($communeData['siren'])) {
|
||||
$city->setSiren((int)$communeData['siren']);
|
||||
}
|
||||
|
||||
// Ne pas faire de labourage des Places pour cette ville
|
||||
// Persister l'objet Stats
|
||||
$this->entityManager->persist($city);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
// Récupérer le thème sélectionné (par défaut: tous)
|
||||
|
@ -2347,11 +2413,86 @@ final class AdminController extends AbstractController
|
|||
// Récupérer les problèmes Osmose pour cette ville
|
||||
$osmoseIssues = $this->getOsmoseIssuesForCity($city, $theme);
|
||||
|
||||
// Créer un mapping inverse des items Osmose vers les thèmes
|
||||
$itemToThemeMapping = [];
|
||||
$themeToItemsMapping = [
|
||||
'charging_station' => [8410, 8411],
|
||||
'school' => [8031],
|
||||
'healthcare' => [8211, 7220, 8331],
|
||||
'laboratory' => [7240, 8351],
|
||||
'police' => [8190, 8191],
|
||||
'defibrillator' => [8370],
|
||||
'places' => [7240, 8351, 8211, 7220, 8331, 8031],
|
||||
'restaurants' => [8030, 8031, 8032],
|
||||
'hotels' => [8040, 8041, 8042],
|
||||
'tourism' => [8010, 8011, 8012, 8013],
|
||||
'leisure' => [8050, 8051, 8052],
|
||||
'transportation' => [4010, 4020, 4030, 4040],
|
||||
'amenities' => [8080, 8081, 8082],
|
||||
];
|
||||
|
||||
foreach ($themeToItemsMapping as $themeName => $itemIds) {
|
||||
foreach ($itemIds as $itemId) {
|
||||
if (!isset($itemToThemeMapping[$itemId])) {
|
||||
$itemToThemeMapping[$itemId] = [];
|
||||
}
|
||||
$itemToThemeMapping[$itemId][] = $themeName;
|
||||
}
|
||||
}
|
||||
|
||||
// Compter les problèmes par thème
|
||||
$issuesByTheme = [];
|
||||
foreach ($themes as $themeKey => $themeLabel) {
|
||||
$issuesByTheme[$themeKey] = 0;
|
||||
}
|
||||
|
||||
// Ajouter un compteur pour "Autres" (problèmes qui ne correspondent à aucun thème)
|
||||
$issuesByTheme['other'] = 0;
|
||||
|
||||
// Compter les problèmes par niveau de sévérité
|
||||
$issuesByLevel = [
|
||||
1 => 0, // Critique
|
||||
2 => 0, // Important
|
||||
3 => 0, // Avertissement
|
||||
];
|
||||
|
||||
foreach ($osmoseIssues as $issue) {
|
||||
// Compter par niveau de sévérité
|
||||
$level = (int)$issue['level'];
|
||||
if (isset($issuesByLevel[$level])) {
|
||||
$issuesByLevel[$level]++;
|
||||
}
|
||||
|
||||
// Compter par thème
|
||||
$itemId = (int)$issue['item'];
|
||||
$counted = false;
|
||||
|
||||
if (isset($itemToThemeMapping[$itemId])) {
|
||||
foreach ($itemToThemeMapping[$itemId] as $themeName) {
|
||||
if (isset($issuesByTheme[$themeName])) {
|
||||
$issuesByTheme[$themeName]++;
|
||||
$counted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Si le problème n'a été compté dans aucun thème, l'ajouter à "Autres"
|
||||
if (!$counted) {
|
||||
$issuesByTheme['other']++;
|
||||
}
|
||||
}
|
||||
|
||||
// Ajouter le libellé pour "Autres"
|
||||
$themes['other'] = 'Autres problèmes';
|
||||
|
||||
return $this->render('admin/osmose_issues_map.html.twig', [
|
||||
'city' => $city,
|
||||
'theme' => $theme,
|
||||
'themes' => $themes,
|
||||
'osmoseIssues' => $osmoseIssues
|
||||
'osmoseIssues' => $osmoseIssues,
|
||||
'issuesByTheme' => $issuesByTheme,
|
||||
'issuesByLevel' => $issuesByLevel,
|
||||
'osmoseApiUrl' => 'https://osmose.openstreetmap.fr/fr/map/#zoom=14&lat=' . $city->getLat() . '&lon=' . $city->getLon()
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -2478,20 +2619,33 @@ final class AdminController extends AbstractController
|
|||
{
|
||||
// Mapping des thèmes vers les items Osmose
|
||||
$themeToItemsMapping = [
|
||||
'places' => [8230, 8240, 8250, 8260], // Commerces et services
|
||||
'charging_station' => [8410, 8411],
|
||||
'school' => [8031],
|
||||
'healthcare' => [8211, 7220, 8331],
|
||||
'laboratory' => [7240, 8351],
|
||||
'police' => [8190, 8191],
|
||||
'defibrillator' => [8370],
|
||||
'places' => [7240, 8351, 8211, 7220, 8331, 8031],
|
||||
'restaurants' => [8030, 8031, 8032], // Restaurants et cafés
|
||||
'hotels' => [8040, 8041, 8042], // Hébergements
|
||||
'tourism' => [8010, 8011, 8012, 8013], // Tourisme
|
||||
'leisure' => [8050, 8051, 8052], // Loisirs
|
||||
'healthcare' => [8060, 8061, 8062], // Santé
|
||||
'education' => [8070, 8071, 8072], // Éducation
|
||||
'transportation' => [4010, 4020, 4030, 4040], // Transport
|
||||
'amenities' => [8080, 8081, 8082], // Équipements
|
||||
// Si d'autres thèmes sont nécessaires, ajoutez-les ici
|
||||
];
|
||||
|
||||
// Si le thème est 'all' ou n'existe pas dans le mapping, retourner un tableau vide
|
||||
if ($theme === 'all' || !isset($themeToItemsMapping[$theme])) {
|
||||
// Si le thème est 'all', retourner tous les items uniques de tous les thèmes
|
||||
if ($theme === 'all') {
|
||||
$allItems = [];
|
||||
foreach ($themeToItemsMapping as $items) {
|
||||
$allItems = array_merge($allItems, $items);
|
||||
}
|
||||
return array_unique($allItems);
|
||||
}
|
||||
|
||||
// Si le thème n'existe pas dans le mapping, retourner un tableau vide
|
||||
if (!isset($themeToItemsMapping[$theme])) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue