feat: Gestion des secteurs et migration v3.0.4+304
- Ajout système complet de gestion des secteurs avec contours géographiques - Import des contours départementaux depuis GeoJSON - API REST pour la gestion des secteurs (/api/sectors) - Service de géolocalisation pour déterminer les secteurs - Migration base de données avec tables x_departements_contours et sectors_adresses - Interface Flutter pour visualisation et gestion des secteurs - Ajout thème sombre dans l'application - Corrections diverses et optimisations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
172
api/test_import_diagnostic.php
Normal file
172
api/test_import_diagnostic.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
/**
|
||||
* Script de diagnostic pour l'import des contours départementaux
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/src/Config/AppConfig.php';
|
||||
require_once __DIR__ . '/src/Core/Database.php';
|
||||
|
||||
echo "Diagnostic de l'import des contours départementaux\n";
|
||||
echo "=================================================\n\n";
|
||||
|
||||
try {
|
||||
// Initialiser la base de données
|
||||
$appConfig = AppConfig::getInstance();
|
||||
Database::init($appConfig->getDatabaseConfig());
|
||||
$db = Database::getInstance();
|
||||
|
||||
// 1. Vérifier la table
|
||||
echo "1. Vérification de la table x_departements_contours:\n";
|
||||
$sql = "SHOW TABLES LIKE 'x_departements_contours'";
|
||||
$stmt = $db->query($sql);
|
||||
if ($stmt->rowCount() > 0) {
|
||||
echo " ✓ Table existe\n";
|
||||
|
||||
// Compter les enregistrements
|
||||
$sql = "SELECT COUNT(*) as count FROM x_departements_contours";
|
||||
$stmt = $db->query($sql);
|
||||
$result = $stmt->fetch();
|
||||
echo " - Nombre d'enregistrements : " . $result['count'] . "\n";
|
||||
} else {
|
||||
echo " ✗ Table n'existe pas\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// 2. Tester l'API geo.api.gouv.fr
|
||||
echo "\n2. Test de l'API geo.api.gouv.fr:\n";
|
||||
$testDept = '22';
|
||||
$url = "https://geo.api.gouv.fr/departements/{$testDept}?fields=nom,contour";
|
||||
|
||||
$context = stream_context_create([
|
||||
'http' => [
|
||||
'timeout' => 30,
|
||||
'header' => "User-Agent: Geosector/1.0\r\n"
|
||||
]
|
||||
]);
|
||||
|
||||
echo " - Récupération du département $testDept...\n";
|
||||
$response = @file_get_contents($url, false, $context);
|
||||
|
||||
if ($response === false) {
|
||||
echo " ✗ Erreur lors de la récupération\n";
|
||||
$error = error_get_last();
|
||||
echo " - Erreur : " . $error['message'] . "\n";
|
||||
} else {
|
||||
echo " ✓ Données récupérées\n";
|
||||
$data = json_decode($response, true);
|
||||
|
||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||
echo " ✗ Erreur JSON : " . json_last_error_msg() . "\n";
|
||||
} else {
|
||||
echo " - Nom : " . ($data['nom'] ?? 'Non trouvé') . "\n";
|
||||
echo " - Contour présent : " . (isset($data['contour']) ? 'Oui' : 'Non') . "\n";
|
||||
|
||||
if (isset($data['contour']['coordinates'])) {
|
||||
$coords = $data['contour']['coordinates'];
|
||||
|
||||
// Analyser la structure
|
||||
echo "\n3. Analyse de la structure des coordonnées:\n";
|
||||
echo " - Type de contour : " . ($data['contour']['type'] ?? 'Inconnu') . "\n";
|
||||
echo " - Niveaux d'imbrication : ";
|
||||
|
||||
$level = 0;
|
||||
$temp = $coords;
|
||||
while (is_array($temp) && !is_numeric($temp[0] ?? null)) {
|
||||
$level++;
|
||||
$temp = $temp[0];
|
||||
}
|
||||
echo "$level\n";
|
||||
|
||||
// Tester la conversion en WKT
|
||||
echo "\n4. Test de conversion en WKT:\n";
|
||||
|
||||
// Extraction des coordonnées selon le type
|
||||
$ring = null;
|
||||
if ($data['contour']['type'] === 'Polygon') {
|
||||
$ring = $coords[0];
|
||||
} elseif ($data['contour']['type'] === 'MultiPolygon') {
|
||||
$ring = $coords[0][0];
|
||||
}
|
||||
|
||||
if ($ring) {
|
||||
$points = [];
|
||||
foreach ($ring as $i => $point) {
|
||||
if ($i < 5) { // Afficher les 5 premiers points
|
||||
echo " - Point $i : [" . $point[0] . ", " . $point[1] . "]\n";
|
||||
}
|
||||
$points[] = $point[0] . ' ' . $point[1];
|
||||
}
|
||||
echo " - Total points : " . count($ring) . "\n";
|
||||
|
||||
// Créer le WKT
|
||||
$wkt = 'POLYGON((' . implode(',', $points) . '))';
|
||||
echo " - WKT (début) : " . substr($wkt, 0, 100) . "...\n";
|
||||
|
||||
// Tester l'insertion
|
||||
echo "\n5. Test d'insertion dans la base:\n";
|
||||
try {
|
||||
$sql = "INSERT INTO x_departements_contours
|
||||
(code_dept, nom_dept, contour, bbox_min_lat, bbox_max_lat, bbox_min_lng, bbox_max_lng)
|
||||
VALUES
|
||||
(:code, :nom, ST_GeomFromText(:polygon, 4326), :min_lat, :max_lat, :min_lng, :max_lng)";
|
||||
|
||||
$stmt = $db->prepare($sql);
|
||||
|
||||
// Calculer la bounding box
|
||||
$lats = array_map(function($p) { return $p[1]; }, $ring);
|
||||
$lngs = array_map(function($p) { return $p[0]; }, $ring);
|
||||
|
||||
$params = [
|
||||
'code' => $testDept,
|
||||
'nom' => $data['nom'],
|
||||
'polygon' => $wkt,
|
||||
'min_lat' => min($lats),
|
||||
'max_lat' => max($lats),
|
||||
'min_lng' => min($lngs),
|
||||
'max_lng' => max($lngs)
|
||||
];
|
||||
|
||||
echo " - Paramètres :\n";
|
||||
echo " * Code : " . $params['code'] . "\n";
|
||||
echo " * Nom : " . $params['nom'] . "\n";
|
||||
echo " * BBox : [" . $params['min_lat'] . ", " . $params['min_lng'] . "] - [" . $params['max_lat'] . ", " . $params['max_lng'] . "]\n";
|
||||
|
||||
// Ne pas vraiment insérer, juste tester
|
||||
echo " - Test de validation du polygone...\n";
|
||||
$testSql = "SELECT ST_IsValid(ST_GeomFromText(:polygon, 4326)) as is_valid";
|
||||
$testStmt = $db->prepare($testSql);
|
||||
$testStmt->execute(['polygon' => $wkt]);
|
||||
$testResult = $testStmt->fetch();
|
||||
|
||||
if ($testResult['is_valid']) {
|
||||
echo " ✓ Polygone valide\n";
|
||||
} else {
|
||||
echo " ✗ Polygone invalide\n";
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo " ✗ Erreur : " . $e->getMessage() . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 6. Vérifier les logs d'erreur PHP
|
||||
echo "\n6. Dernières erreurs PHP:\n";
|
||||
$errorLog = ini_get('error_log');
|
||||
if ($errorLog && file_exists($errorLog)) {
|
||||
$lines = array_slice(file($errorLog), -5);
|
||||
foreach ($lines as $line) {
|
||||
if (strpos($line, 'departements_contours') !== false) {
|
||||
echo " " . trim($line) . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "✗ Erreur : " . $e->getMessage() . "\n";
|
||||
echo "Trace:\n" . $e->getTraceAsString() . "\n";
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
Reference in New Issue
Block a user