knnCorsica/activite1/knn_corse.html

631 lines
No EOL
67 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Classification k-NN Interactive - Corse</title>
<!-- Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1400px;
margin: 0 auto;
background: white;
border-radius: 15px;
overflow: hidden;
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
}
.header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px;
text-align: center;
}
.header h1 {
font-size: 2.5em;
margin-bottom: 10px;
}
.header p {
font-size: 1.2em;
opacity: 0.9;
}
.main-content {
display: grid;
grid-template-columns: 350px 1fr;
gap: 0;
}
.sidebar {
background: #f5f5f5;
padding: 30px;
border-right: 2px solid #ddd;
max-height: 900px;
overflow-y: auto;
}
.controls {
background: white;
padding: 20px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.controls h3 {
margin-bottom: 15px;
color: #333;
font-size: 1.2em;
}
.control-group {
margin-bottom: 20px;
}
.control-group label {
display: block;
font-weight: bold;
color: #555;
margin-bottom: 8px;
}
.slider-container {
display: flex;
align-items: center;
gap: 10px;
}
input[type="range"] {
flex: 1;
height: 8px;
border-radius: 5px;
background: #ddd;
outline: none;
}
input[type="range"]::-webkit-slider-thumb {
appearance: none;
width: 20px;
height: 20px;
border-radius: 50%;
background: #667eea;
cursor: pointer;
}
input[type="range"]::-moz-range-thumb {
width: 20px;
height: 20px;
border-radius: 50%;
background: #667eea;
cursor: pointer;
border: none;
}
.k-value {
background: #667eea;
color: white;
padding: 5px 15px;
border-radius: 20px;
font-weight: bold;
min-width: 40px;
text-align: center;
}
.result-box {
background: white;
padding: 20px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.result-box h3 {
margin-bottom: 15px;
color: #333;
}
.prediction {
font-size: 1.3em;
font-weight: bold;
padding: 15px;
border-radius: 8px;
text-align: center;
margin-bottom: 15px;
}
.prediction.corse-sud {
background: #ffebee;
color: #c62828;
}
.prediction.haute-corse {
background: #e3f2fd;
color: #1565c0;
}
.prediction.no-result {
background: #f5f5f5;
color: #666;
}
.coords {
font-size: 0.9em;
color: #666;
text-align: center;
margin-bottom: 10px;
}
.votes {
display: flex;
justify-content: space-around;
margin-bottom: 15px;
}
.vote-item {
text-align: center;
}
.vote-count {
font-size: 2em;
font-weight: bold;
}
.vote-count.red {
color: #c62828;
}
.vote-count.blue {
color: #1565c0;
}
.neighbors-list {
max-height: 300px;
overflow-y: auto;
background: #fafafa;
padding: 10px;
border-radius: 5px;
}
.neighbor-item {
padding: 10px;
margin-bottom: 8px;
background: white;
border-radius: 5px;
border-left: 4px solid #ddd;
}
.neighbor-item.dept-2a {
border-left-color: #c62828;
}
.neighbor-item.dept-2b {
border-left-color: #1565c0;
}
.neighbor-name {
font-weight: bold;
margin-bottom: 3px;
}
.neighbor-corse {
font-style: italic;
color: #666;
font-size: 0.9em;
}
.neighbor-distance {
font-size: 0.9em;
color: #666;
}
.instructions {
background: #fff3cd;
border-left: 4px solid #ffc107;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
}
.instructions h4 {
margin-bottom: 10px;
color: #856404;
}
.instructions ul {
margin-left: 20px;
color: #856404;
}
.instructions li {
margin-bottom: 5px;
}
.legend {
background: white;
padding: 15px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.legend h4 {
margin-bottom: 10px;
color: #333;
}
.legend-item {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 8px;
}
.legend-circle {
width: 20px;
height: 20px;
border-radius: 50%;
border: 2px solid #333;
}
.legend-circle.red {
background: #e74c3c;
}
.legend-circle.blue {
background: #3498db;
}
.legend-circle.marker {
background: #95a5a6;
border: 3px solid #000;
}
#map {
height: 900px;
cursor: crosshair;
}
.leaflet-popup-content {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
button {
padding: 10px 20px;
border: none;
border-radius: 5px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s;
width: 100%;
margin-bottom: 10px;
}
button:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
.btn-reset {
background: #f44336;
color: white;
}
.btn-random {
background: #4CAF50;
color: white;
}
.stats {
background: #e3f2fd;
padding: 10px;
border-radius: 5px;
font-size: 0.9em;
text-align: center;
margin-top: 15px;
color: #1565c0;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🗺️ Classification k-NN Interactive</h1>
<p>Haute-Corse ou Corse du Sud ?</p>
<div class="stats">
<strong>387</strong> villages chargés
</div>
</div>
<div class="main-content">
<div class="sidebar">
<div class="instructions">
<h4>📋 Instructions</h4>
<ul>
<li><strong>Cliquez</strong> n'importe où sur la carte</li>
<li>Ajustez la valeur de <strong>k</strong> avec le curseur</li>
<li>Observez les <strong>k plus proches villages</strong></li>
<li>La <strong>classification</strong> se fait par vote majoritaire</li>
</ul>
</div>
<div class="controls">
<h3>⚙️ Paramètres</h3>
<div class="control-group">
<label>Nombre de voisins (k) :</label>
<div class="slider-container">
<input type="range" id="kSlider" min="1" max="21" value="5" step="2">
<span class="k-value" id="kValue">5</span>
</div>
</div>
<button class="btn-random" onclick="placeRandomPoint()">🎲 Point Aléatoire</button>
<button class="btn-reset" onclick="resetClassification()">🔄 Réinitialiser</button>
</div>
<div class="result-box" id="resultBox">
<h3>🎯 Résultat</h3>
<div class="prediction no-result" id="prediction">
Cliquez sur la carte
</div>
<div class="coords" id="coords"></div>
<div id="votesContainer" style="display: none;">
<div class="votes">
<div class="vote-item">
<div class="vote-count red" id="votes2A">0</div>
<div>Corse du Sud</div>
</div>
<div class="vote-item">
<div class="vote-count blue" id="votes2B">0</div>
<div>Haute-Corse</div>
</div>
</div>
<h4>🏘️ Plus proches voisins :</h4>
<div class="neighbors-list" id="neighborsList"></div>
</div>
</div>
<div class="legend">
<h4>Légende</h4>
<div class="legend-item">
<div class="legend-circle red"></div>
<span>Corse du Sud (2A)</span>
</div>
<div class="legend-item">
<div class="legend-circle blue"></div>
<span>Haute-Corse (2B)</span>
</div>
<div class="legend-item">
<div class="legend-circle marker"></div>
<span>Point à classifier</span>
</div>
</div>
</div>
<div id="map"></div>
</div>
</div>
<!-- Leaflet JS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
// Données des villages (embarquées depuis le CSV)
const villages = [{"name": "Afa", "nameCorse": "Afà", "lat": 41.984099158, "lon": 8.798384636, "dept": "2A", "altitude": 173.0}, {"name": "Alando", "nameCorse": "Alandu", "lat": 42.307923468, "lon": 9.286438857, "dept": "2B", "altitude": 659.0}, {"name": "Albertacce", "nameCorse": "Albertacce", "lat": 42.311736325, "lon": 8.924113162, "dept": "2B", "altitude": 1435.0}, {"name": "Ambiegna", "nameCorse": "Ambiegna", "lat": 42.087881677, "lon": 8.77334639, "dept": "2A", "altitude": 168.0}, {"name": "Arbellara", "nameCorse": "Arbiddali", "lat": 41.671484206, "lon": 8.989411005, "dept": "2A", "altitude": 214.0}, {"name": "Aullène", "nameCorse": "Auddè", "lat": 41.807022288, "lon": 9.092922973, "dept": "2A", "altitude": 1124.0}, {"name": "Balogna", "nameCorse": "Balogna", "lat": 42.187366095, "lon": 8.754098668, "dept": "2A", "altitude": 539.0}, {"name": "Bastia", "nameCorse": "Bastia", "lat": 42.686414633, "lon": 9.425141541, "dept": "2B", "altitude": 260.0}, {"name": "Bigorno", "nameCorse": "Bigornu", "lat": 42.531345808, "lon": 9.302728988, "dept": "2B", "altitude": 671.0}, {"name": "Biguglia", "nameCorse": "Biguglia", "lat": 42.61657278, "lon": 9.440821107, "dept": "2B", "altitude": 72.0}, {"name": "Bilia", "nameCorse": "Bilia", "lat": 41.621985218, "lon": 8.90490826, "dept": "2A", "altitude": 398.0}, {"name": "Brando", "nameCorse": "Brandu", "lat": 42.779653432, "lon": 9.450590588, "dept": "2B", "altitude": 493.0}, {"name": "Cagnano", "nameCorse": "Cagnanu", "lat": 42.872170492, "lon": 9.443557009, "dept": "2B", "altitude": 249.0}, {"name": "Calvi", "nameCorse": "Calvi", "lat": 42.545056158, "lon": 8.76006141, "dept": "2B", "altitude": 99.0}, {"name": "Campitello", "nameCorse": "Campitellu", "lat": 42.526951928, "lon": 9.324989461, "dept": "2B", "altitude": 655.0}, {"name": "Casalabriva", "nameCorse": "Casalabriva", "lat": 41.759907282, "lon": 8.92558467, "dept": "2A", "altitude": 451.0}, {"name": "Castellare-di-Casinca", "nameCorse": "U Castellà di Casinca", "lat": 42.470882238, "lon": 9.501396959, "dept": "2B", "altitude": 52.0}, {"name": "Castellare-di-Mercurio", "nameCorse": "U Castellà di Mercoriu", "lat": 42.310042781, "lon": 9.246588717, "dept": "2B", "altitude": 651.0}, {"name": "Castello-di-Rostino", "nameCorse": "Castellu di Rustinu", "lat": 42.471494035, "lon": 9.297984515, "dept": "2B", "altitude": 463.0}, {"name": "Cervione", "nameCorse": "Cervioni", "lat": 42.320960615, "lon": 9.516328611, "dept": "2B", "altitude": 174.0}, {"name": "Corte", "nameCorse": "Corti", "lat": 42.270219558, "lon": 9.083127876, "dept": "2B", "altitude": 1301.0}, {"name": "Croce", "nameCorse": "A Croce", "lat": 42.407784001, "lon": 9.357450274, "dept": "2B", "altitude": 779.0}, {"name": "Crocicchia", "nameCorse": "A Crucichja", "lat": 42.473573975, "lon": 9.352551876, "dept": "2B", "altitude": 619.0}, {"name": "Favone", "nameCorse": "Funi", "lat": 41.813484388, "lon": 9.352409643, "dept": "2A", "altitude": 285.0}, {"name": "Francardo", "nameCorse": "Francardu", "lat": 42.382592655, "lon": 9.193716559, "dept": "2B", "altitude": 530.0}, {"name": "Furiani", "nameCorse": "Furiani", "lat": 42.652181399, "lon": 9.416709053, "dept": "2B", "altitude": 203.0}, {"name": "Galéria", "nameCorse": "Galeria", "lat": 42.407960609, "lon": 8.70713078, "dept": "2B", "altitude": 381.0}, {"name": "Ghisonaccia", "nameCorse": "A Ghisunaccia", "lat": 42.043736738, "lon": 9.422930938, "dept": "2B", "altitude": 35.0}, {"name": "Levie", "nameCorse": "Livia", "lat": 41.651592663, "lon": 9.11575364, "dept": "2A", "altitude": 628.0}, {"name": "Loreto-di-Casinca", "nameCorse": "Loretu di Casinca", "lat": 42.476560658, "lon": 9.425072468, "dept": "2B", "altitude": 640.0}, {"name": "Marignana", "nameCorse": "Marignana", "lat": 42.208985566, "lon": 8.690764867, "dept": "2A", "altitude": 674.0}, {"name": "Mela", "nameCorse": "Mela", "lat": 41.683477908, "lon": 9.092481156, "dept": "2A", "altitude": 488.0}, {"name": "Moca-Croce", "nameCorse": "Macà è Croci", "lat": 41.787617666, "lon": 9.010018558, "dept": "2A", "altitude": 710.0}, {"name": "Monte", "nameCorse": "Monte", "lat": 42.482896791, "lon": 9.401684112, "dept": "2B", "altitude": 506.0}, {"name": "Moriani Plage", "nameCorse": "A Padulella", "lat": 42.368543705, "lon": 9.509244013, "dept": "2B", "altitude": 126.0}, {"name": "Muracciole", "nameCorse": "E Muracciole", "lat": 42.168067922, "lon": 9.19010691, "dept": "2B", "altitude": 886.0}, {"name": "Murato", "nameCorse": "Muratu", "lat": 42.567488213, "lon": 9.327568214, "dept": "2B", "altitude": 668.0}, {"name": "Novale", "nameCorse": "A Nuvale", "lat": 42.30481733, "lon": 9.411128601, "dept": "2B", "altitude": 770.0}, {"name": "Olcani", "nameCorse": "Olcani", "lat": 42.806047774, "lon": 9.386810335, "dept": "2B", "altitude": 710.0}, {"name": "Omessa", "nameCorse": "Omessa", "lat": 42.382592655, "lon": 9.193716559, "dept": "2B", "altitude": 530.0}, {"name": "Palasca", "nameCorse": "Palasca", "lat": 42.629902138, "lon": 9.057287078, "dept": "2B", "altitude": 177.0}, {"name": "Palneca", "nameCorse": "Palleca", "lat": 41.991820611, "lon": 9.189004468, "dept": "2A", "altitude": 1283.0}, {"name": "Perelli", "nameCorse": "I Pirelli", "lat": 42.314571009, "lon": 9.388646318, "dept": "2B", "altitude": 893.0}, {"name": "Peri", "nameCorse": "I Peri", "lat": 42.004108, "lon": 8.912431225, "dept": "2A", "altitude": 537.0}, {"name": "Pero-Casevecchie", "nameCorse": "Peru è Casevechje", "lat": 42.415898621, "lon": 9.464461145, "dept": "2B", "altitude": 535.0}, {"name": "Pianello", "nameCorse": "U Pianellu", "lat": 42.297735632, "lon": 9.356328684, "dept": "2B", "altitude": 962.0}, {"name": "Piano", "nameCorse": "U Pianu", "lat": 42.441283087, "lon": 9.397228426, "dept": "2B", "altitude": 612.0}, {"name": "Pianottoli-Caldarello", "nameCorse": "Pianottuli è Caldareddu", "lat": 41.504855488, "lon": 9.048610742, "dept": "2A", "altitude": 190.0}, {"name": "Piedicorte-di-Gaggio", "nameCorse": "Pedicorti di Caghju", "lat": 42.214947914, "lon": 9.323352874, "dept": "2B", "altitude": 447.0}, {"name": "Pietrapola-les-Bains", "nameCorse": "Petrapola", "lat": 42.015837338, "lon": 9.264232102, "dept": "2B", "altitude": 928.0}, {"name": "Pino", "nameCorse": "Pinu", "lat": 42.905222016, "lon": 9.353769399, "dept": "2B", "altitude": 308.0}, {"name": "Pioggiola", "nameCorse": "Pioghjula", "lat": 42.522456117, "lon": 8.974927807, "dept": "2B", "altitude": 1119.0}, {"name": "Poggio-d'Oletta", "nameCorse": "U Poghju d'Oletta", "lat": 42.656892578, "lon": 9.359153809, "dept": "2B", "altitude": 311.0}, {"name": "Poggiolo", "nameCorse": "U Pighjolu", "lat": 42.162669782, "lon": 8.898744992, "dept": "2A", "altitude": 817.0}, {"name": "Poggio-Mezzana", "nameCorse": "Poghju è Mezana", "lat": 42.401462441, "lon": 9.512030352, "dept": "2B", "altitude": 113.0}, {"name": "Polveroso", "nameCorse": "U Pulverosu", "lat": 42.401203387, "lon": 9.361395421, "dept": "2B", "altitude": 618.0}, {"name": "Riventosa", "nameCorse": "A Riventosa", "lat": 42.247726488, "lon": 9.203165174, "dept": "2B", "altitude": 425.0}, {"name": "Rusio", "nameCorse": "Rusiu", "lat": 42.353850161, "lon": 9.258527475, "dept": "2B", "altitude": 1148.0}, {"name": "Saint Antoine", "nameCorse": "Sant'Antone", "lat": 42.043736738, "lon": 9.422930938, "dept": "2B", "altitude": 35.0}, {"name": "Saliceto", "nameCorse": "U Salicetu", "lat": 42.410520775, "lon": 9.263971715, "dept": "2B", "altitude": 679.0}, {"name": "San Lorenzo", "nameCorse": "San Lorenzu", "lat": 42.38954311, "lon": 9.288566111, "dept": "2B", "altitude": 840.0}, {"name": "Sant'Andréa-d'Orcino", "nameCorse": "Sant'Andria d'Urcinu", "lat": 42.044833699, "lon": 8.789100245, "dept": "2A", "altitude": 263.0}, {"name": "Sartène", "nameCorse": "Sartè", "lat": 41.571781333, "lon": 8.935507856, "dept": "2A", "altitude": 190.0}, {"name": "Solenzara", "nameCorse": "Sulinzara", "lat": 41.813484388, "lon": 9.352409643, "dept": "2A", "altitude": 285.0}, {"name": "Sorbo Ocagnano", "nameCorse": "Sorbu è Ocagnanu", "lat": 42.482672899, "lon": 9.488464533, "dept": "2B", "altitude": 101.0}, {"name": "Tallone", "nameCorse": "Tallone", "lat": 42.184365901, "lon": 9.465645988, "dept": "2B", "altitude": 119.0}, {"name": "Tarco", "nameCorse": "Tarcu", "lat": 41.753235671, "lon": 9.330136574, "dept": "2A", "altitude": 426.0}, {"name": "Tattone", "nameCorse": "Tattò", "lat": 42.152494442, "lon": 9.120723761, "dept": "2B", "altitude": 1244.0}, {"name": "Tavera", "nameCorse": "Tavera", "lat": 42.069723105, "lon": 9.016762047, "dept": "2A", "altitude": 873.0}, {"name": "Valle-d'Orezza", "nameCorse": "A Valle d'Orezza", "lat": 42.362343619, "lon": 9.40334978, "dept": "2B", "altitude": 747.0}, {"name": "Venaco", "nameCorse": "Venacu", "lat": 42.213918028, "lon": 9.137186586, "dept": "2B", "altitude": 1222.0}, {"name": "Vezzani", "nameCorse": "Vizzani", "lat": 42.157535989, "lon": 9.29219028, "dept": "2B", "altitude": 577.0}, {"name": "Vivario", "nameCorse": "Vivariu", "lat": 42.152494442, "lon": 9.120723761, "dept": "2B", "altitude": 1244.0}, {"name": "Volpajola", "nameCorse": "A Vulpaiola", "lat": 42.519867456, "lon": 9.360362944, "dept": "2B", "altitude": 385.0}, {"name": "Aléria", "nameCorse": "Aleria", "lat": 42.106100541, "lon": 9.495920292, "dept": "2B", "altitude": 19.0}, {"name": "Altiani", "nameCorse": "Altiani", "lat": 42.21988286, "lon": 9.278582603, "dept": "2B", "altitude": 369.0}, {"name": "Avapessa", "nameCorse": "Avapessa", "lat": 42.559045538, "lon": 8.893822971, "dept": "2B", "altitude": 442.0}, {"name": "Barbaggio", "nameCorse": "Barbaghju", "lat": 42.68403287, "lon": 9.368383831, "dept": "2B", "altitude": 299.0}, {"name": "Bastelica", "nameCorse": "Bastelica", "lat": 41.988202996, "lon": 9.048770899, "dept": "2A", "altitude": 1133.0}, {"name": "Belvédère-Campomoro", "nameCorse": "Belvidè è Campumoru", "lat": 41.617493972, "lon": 8.823763667, "dept": "2A", "altitude": 173.0}, {"name": "Calacuccia", "nameCorse": "Calacuccia", "lat": 42.32334002, "lon": 9.034454548, "dept": "2B", "altitude": 1150.0}, {"name": "Campi", "nameCorse": "Campi", "lat": 42.268421021, "lon": 9.42340261, "dept": "2B", "altitude": 547.0}, {"name": "Carpineto", "nameCorse": "U Carpinetu", "lat": 42.355816993, "lon": 9.380036665, "dept": "2B", "altitude": 689.0}, {"name": "Casabianca", "nameCorse": "A Casabianca", "lat": 42.446912546, "lon": 9.371438459, "dept": "2B", "altitude": 652.0}, {"name": "Castirla", "nameCorse": "Castirla", "lat": 42.368110887, "lon": 9.125662016, "dept": "2B", "altitude": 775.0}, {"name": "Érone", "nameCorse": "Erone", "lat": 42.375538829, "lon": 9.266421193, "dept": "2B", "altitude": 669.0}, {"name": "Feliceto", "nameCorse": "U Filicetu", "lat": 42.549098073, "lon": 8.939971216, "dept": "2B", "altitude": 536.0}, {"name": "Foce", "nameCorse": "Foci è Bilzesi", "lat": 41.622016364, "lon": 9.036079, "dept": "2A", "altitude": 418.0}, {"name": "Folelli", "nameCorse": "I Fulelli", "lat": 42.454841775, "lon": 9.497220418, "dept": "2B", "altitude": 120.0}, {"name": "Gavignano", "nameCorse": "Gavignanu", "lat": 42.424118586, "lon": 9.250834128, "dept": "2B", "altitude": 569.0}, {"name": "Giocatojo", "nameCorse": "Ghjucatoghju", "lat": 42.443980232, "lon": 9.346162636, "dept": "2B", "altitude": 716.0}, {"name": "Grosseto-Prugna", "nameCorse": "Grussettu è Prugna", "lat": 41.881679666, "lon": 8.8180744, "dept": "2A", "altitude": 349.0}, {"name": "Guargualé", "nameCorse": "Guargualè", "lat": 41.827608574, "lon": 8.927786507, "dept": "2A", "altitude": 426.0}, {"name": "Lento", "nameCorse": "Lentu", "lat": 42.53133798, "lon": 9.263000703, "dept": "2B", "altitude": 931.0}, {"name": "L'Île-Rousse", "nameCorse": "Lisula (Isula Rossa)", "lat": 42.631697062, "lon": 8.933933268, "dept": "2B", "altitude": 36.0}, {"name": "Lozzi", "nameCorse": "Lozzi", "lat": 42.362293727, "lon": 8.981020761, "dept": "2B", "altitude": 1554.0}, {"name": "Lumio", "nameCorse": "Lumiu", "lat": 42.58003415, "lon": 8.825470213, "dept": "2B", "altitude": 100.0}, {"name": "Marine de Canella", "nameCorse": "Marina di Cannedda", "lat": 41.813484388, "lon": 9.352409643, "dept": "2A", "altitude": 285.0}, {"name": "Meria", "nameCorse": "Meria", "lat": 42.919922654, "lon": 9.436626608, "dept": "2B", "altitude": 216.0}, {"name": "Oletta", "nameCorse": "Oletta", "lat": 42.641773997, "lon": 9.333297468, "dept": "2B", "altitude": 211.0}, {"name": "Olmeta-di-Tuda", "nameCorse": "Olmeta di Tuda", "lat": 42.612322524, "lon": 9.363945407, "dept": "2B", "altitude": 302.0}, {"name": "Olmiccia", "nameCorse": "Ulimiccia", "lat": 41.670651674, "lon": 9.033579591, "dept": "2A", "altitude": 192.0}, {"name": "Osani", "nameCorse": "Osani", "lat": 42.343210456, "lon": 8.623256444, "dept": "2A", "altitude": 255.0}, {"name": "Ota", "nameCorse": "Ota", "lat": 42.254915069, "lon": 8.733420349, "dept": "2A", "altitude": 573.0}, {"name": "Pastricciola", "nameCorse": "Pastricciola", "lat": 42.143534665, "lon": 9.016661089, "dept": "2A", "altitude": 1032.0}, {"name": "Penta-Acquatella", "nameCorse": "Penta è Acquatella", "lat": 42.463219499, "lon": 9.372503735, "dept": "2B", "altitude": 511.0}, {"name": "Petreto-Bicchisano", "nameCorse": "Pitretu è Bicchisgià", "lat": 41.770617869, "lon": 8.969676171, "dept": "2A", "altitude": 606.0}, {"name": "Piedipartino", "nameCorse": "U Pedipartinu", "lat": 42.357818151, "lon": 9.344917642, "dept": "2B", "altitude": 1099.0}, {"name": "Pie-d'Orezza", "nameCorse": "U Ped'Orezza", "lat": 42.374283692, "lon": 9.338168108, "dept": "2B", "altitude": 1051.0}, {"name": "Pietra-di-Verde", "nameCorse": "A Petra di Verde", "lat": 42.292706467, "lon": 9.444427237, "dept": "2B", "altitude": 515.0}, {"name": "Pietralba", "nameCorse": "Petralba", "lat": 42.542992942, "lon": 9.183540313, "dept": "2B", "altitude": 661.0}, {"name": "Pietricaggio", "nameCorse": "U Petricaghju", "lat": 42.329371523, "lon": 9.376444081, "dept": "2B", "altitude": 954.0}, {"name": "Pigna", "nameCorse": "Pigna", "lat": 42.599594739, "lon": 8.899643154, "dept": "2B", "altitude": 199.0}, {"name": "Piobetta", "nameCorse": "Piupeta", "lat": 42.34031583, "lon": 9.367213393, "dept": "2B", "altitude": 1072.0}, {"name": "Ponte-Leccia", "nameCorse": "U Ponte à a Leccia", "lat": 42.447442972, "lon": 9.254839416, "dept": "2B", "altitude": 584.0}, {"name": "Quasquara", "nameCorse": "Quasquara", "lat": 41.909019445, "lon": 9.00915712, "dept": "2A", "altitude": 995.0}, {"name": "Quercitello", "nameCorse": "U Quarcitellu", "lat": 42.427994577, "lon": 9.342287535, "dept": "2B", "altitude": 780.0}, {"name": "Rutali", "nameCorse": "Rutali", "lat": 42.582984073, "lon": 9.38185368, "dept": "2B", "altitude": 578.0}, {"name": "Sainte-Lucie-de-Porto-Vecchio", "nameCorse": "Santa Lucia di Portivechju", "lat": 41.721323664, "lon": 9.266906298, "dept": "2A", "altitude": 574.0}, {"name": "San Gavino di Tenda", "nameCorse": "San Gavinu di Tenda", "lat": 42.652658905, "lon": 9.152870999, "dept": "2B", "altitude": 417.0}, {"name": "San Giuliano", "nameCorse": "San Ghjulianu", "lat": 42.288176427, "lon": 9.529030364, "dept": "2B", "altitude": 49.0}, {"name": "Santa Maria di Lota", "nameCorse": "Santa Maria di Lota", "lat": 42.751399922, "lon": 9.423742517, "dept": "2B", "altitude": 543.0}, {"name": "Santa Reparata di Moriani", "nameCorse": "Santa Riparata di Moriani", "lat": 42.351493627, "lon": 9.455646602, "dept": "2B", "altitude": 830.0}, {"name": "Sant'Andréa di Bozio", "nameCorse": "Sant'Andria di Boziu", "lat": 42.276933646, "lon": 9.284012946, "dept": "2B", "altitude": 703.0}, {"name": "Serra-di-Scopamène", "nameCorse": "A Sarra di Scupamena", "lat": 41.778397913, "lon": 9.10945997, "dept": "2A", "altitude": 1040.0}, {"name": "Serriera", "nameCorse": "A Sarrera", "lat": 42.30710231, "lon": 8.732587166, "dept": "2A", "altitude": 548.0}, {"name": "Sollacaro", "nameCorse": "Suddacarò", "lat": 41.741671271, "lon": 8.88000405, "dept": "2A", "altitude": 201.0}, {"name": "Sorbollano", "nameCorse": "Surbuddà", "lat": 41.750045408, "lon": 9.115741672, "dept": "2A", "altitude": 704.0}, {"name": "Soveria", "nameCorse": "Suveria", "lat": 42.349616968, "lon": 9.146357138, "dept": "2B", "altitude": 894.0}, {"name": "Stazzona", "nameCorse": "A Stazzona", "lat": 42.380164629, "lon": 9.375561105, "dept": "2B", "altitude": 452.0}, {"name": "Tarrano", "nameCorse": "Tarranu", "lat": 42.34423574, "lon": 9.401886383, "dept": "2B", "altitude": 684.0}, {"name": "Tasso", "nameCorse": "Tassu", "lat": 41.950459429, "lon": 9.09336522, "dept": "2A", "altitude": 1142.0}, {"name": "Tolla", "nameCorse": "Todda", "lat": 41.968373368, "lon": 8.969188641, "dept": "2A", "altitude": 772.0}, {"name": "Tomino", "nameCorse": "Tuminu", "lat": 42.943861568, "lon": 9.44531518, "dept": "2B", "altitude": 145.0}, {"name": "Tox", "nameCorse": "Tocchisu", "lat": 42.243920282, "lon": 9.442949117, "dept": "2B", "altitude": 372.0}, {"name": "Urbalacone", "nameCorse": "Urbalaconu", "lat": 41.826622451, "lon": 8.948910033, "dept": "2A", "altitude": 324.0}, {"name": "Urtaca", "nameCorse": "Urtaca", "lat": 42.620839816, "lon": 9.147910762, "dept": "2B", "altitude": 407.0}, {"name": "Vallecalle", "nameCorse": "Vallecalle", "lat": 42.59968682, "lon": 9.337178683, "dept": "2B", "altitude": 279.0}, {"name": "Valle-di-Rostino", "nameCorse": "Valle di Rustinu", "lat": 42.460117779, "lon": 9.264946452, "dept": "2B", "altitude": 487.0}, {"name": "Viggianello", "nameCorse": "Vighjaneddu", "lat": 41.668941046, "lon": 8.944901982, "dept": "2A", "altitude": 167.0}, {"name": "Vignale", "nameCorse": "Vignale", "lat": 42.536988042, "lon": 9.395981853, "dept": "2B", "altitude": 414.0}, {"name": "Villanova", "nameCorse": "Villanova", "lat": 41.963230481, "lon": 8.670013801, "dept": "2A", "altitude": 259.0}, {"name": "Ville-di-Pietrabugno", "nameCorse": "E Ville di Petrabugnu", "lat": 42.715990142, "lon": 9.427402606, "dept": "2B", "altitude": 419.0}, {"name": "Zilia", "nameCorse": "Zilia", "lat": 42.518910536, "lon": 8.903243603, "dept": "2B", "altitude": 692.0}, {"name": "Appietto", "nameCorse": "Appietu", "lat": 42.00345914, "lon": 8.733864943, "dept": "2A", "altitude": 250.0}, {"name": "Argiusta-Moriccio", "nameCorse": "Arghjusta è Muricciu", "lat": 41.815418536, "lon": 9.032650196, "dept": "2A", "altitude": 710.0}, {"name": "Asco", "nameCorse": "Ascu", "lat": 42.434499645, "lon": 8.997095065, "dept": "2B", "altitude": 1382.0}, {"name": "Azilone Ampaza", "nameCorse": "Azilonu è Ampaza", "lat": 41.870638716, "lon": 9.016697474, "dept": "2A", "altitude": 612.0}, {"name": "Azzana", "nameCorse": "Azzana", "lat": 42.112842887, "lon": 8.931331876, "dept": "2A", "altitude": 644.0}, {"name": "Bastelicaccia", "nameCorse": "A Bastilicaccia", "lat": 41.935379337, "lon": 8.836589723, "dept": "2A", "altitude": 107.0}, {"name": "Bocognano", "nameCorse": "Bucugnà", "lat": 42.088739774, "lon": 9.070832593, "dept": "2A", "altitude": 1153.0}, {"name": "Cambia", "nameCorse": "Cambia", "lat": 42.368771929, "lon": 9.302086757, "dept": "2B", "altitude": 905.0}, {"name": "Carbuccia", "nameCorse": "Carbuccia", "lat": 42.030469338, "lon": 8.936785201, "dept": "2A", "altitude": 508.0}, {"name": "Carcheto-Brustico", "nameCorse": "Carchetu è Brusticu", "lat": 42.355169325, "lon": 9.360190647, "dept": "2B", "altitude": 905.0}, {"name": "Carticasi", "nameCorse": "Carticasi", "lat": 42.347884499, "lon": 9.304041972, "dept": "2B", "altitude": 1048.0}, {"name": "Casevecchie", "nameCorse": "E Casevechje", "lat": 42.135680677, "lon": 9.367689873, "dept": "2B", "altitude": 321.0}, {"name": "Castifao", "nameCorse": "Castifau", "lat": 42.526053978, "lon": 9.1191624, "dept": "2B", "altitude": 488.0}, {"name": "Chisa", "nameCorse": "Chisà", "lat": 41.921131467, "lon": 9.265733256, "dept": "2B", "altitude": 683.0}, {"name": "Corrano", "nameCorse": "Currà", "lat": 41.881942483, "lon": 9.071029024, "dept": "2A", "altitude": 513.0}, {"name": "Costa", "nameCorse": "A Costa", "lat": 42.575888016, "lon": 8.999087263, "dept": "2B", "altitude": 297.0}, {"name": "Cuttoli-Corticchiato", "nameCorse": "Cutuli è Curtichjatu", "lat": 41.976786839, "lon": 8.883279935, "dept": "2A", "altitude": 466.0}, {"name": "Farinole", "nameCorse": "Farringule", "lat": 42.729654089, "lon": 9.365399919, "dept": "2B", "altitude": 395.0}, {"name": "Favalello", "nameCorse": "U Favalellu", "lat": 42.287456671, "lon": 9.248604359, "dept": "2B", "altitude": 426.0}, {"name": "Felce", "nameCorse": "Felce", "lat": 42.346046887, "lon": 9.425120642, "dept": "2B", "altitude": 905.0}, {"name": "Forciolo", "nameCorse": "U Furciolu", "lat": 41.848098218, "lon": 9.015462121, "dept": "2A", "altitude": 432.0}, {"name": "Fozzano", "nameCorse": "Fozzà", "lat": 41.698563612, "lon": 8.987659621, "dept": "2A", "altitude": 342.0}, {"name": "Giuncaggio", "nameCorse": "Ghjuncaghju", "lat": 42.191310434, "lon": 9.38352629, "dept": "2B", "altitude": 271.0}, {"name": "Grossa", "nameCorse": "A Grossa", "lat": 41.602318096, "lon": 8.86442058, "dept": "2A", "altitude": 252.0}, {"name": "Guagno", "nameCorse": "Guagnu", "lat": 42.178286555, "lon": 8.98392941, "dept": "2A", "altitude": 1200.0}, {"name": "Guitera-les-Bains", "nameCorse": "A Vuttera", "lat": 41.922370397, "lon": 9.078574208, "dept": "2A", "altitude": 862.0}, {"name": "Isolaccio-di-Fiumorbo", "nameCorse": "L'Isulacciu di Fiumorbu", "lat": 42.015837338, "lon": 9.264232102, "dept": "2B", "altitude": 928.0}, {"name": "Lano", "nameCorse": "Lanu", "lat": 42.378903669, "lon": 9.235259414, "dept": "2B", "altitude": 823.0}, {"name": "Letia", "nameCorse": "Letia", "lat": 42.214914413, "lon": 8.87695352, "dept": "2A", "altitude": 964.0}, {"name": "Linguizzetta", "nameCorse": "Linguizzetta", "lat": 42.217767861, "lon": 9.509959362, "dept": "2B", "altitude": 92.0}, {"name": "Manso", "nameCorse": "U Mansu", "lat": 42.370935911, "lon": 8.818884048, "dept": "2B", "altitude": 890.0}, {"name": "Mazzola", "nameCorse": "A Mazzola", "lat": 42.304307939, "lon": 9.327333922, "dept": "2B", "altitude": 1049.0}, {"name": "Molini", "nameCorse": "I Mulini", "lat": 41.86066083, "lon": 8.877731508, "dept": "2A", "altitude": 488.0}, {"name": "Moltifao", "nameCorse": "Moltifau", "lat": 42.474312405, "lon": 9.123341042, "dept": "2B", "altitude": 593.0}, {"name": "Occhiatana", "nameCorse": "Ochjatana", "lat": 42.596773705, "lon": 8.998549075, "dept": "2B", "altitude": 322.0}, {"name": "Ogliastro", "nameCorse": "Ogliastru", "lat": 42.822221341, "lon": 9.354625421, "dept": "2B", "altitude": 417.0}, {"name": "Olmeto", "nameCorse": "Ulmetu", "lat": 41.712094263, "lon": 8.904666687, "dept": "2A", "altitude": 293.0}, {"name": "Olmi-Cappella", "nameCorse": "Olmi è Cappella", "lat": 42.520107802, "lon": 9.019923665, "dept": "2B", "altitude": 1025.0}, {"name": "Ortiporio", "nameCorse": "Ortiporiu", "lat": 42.456479299, "lon": 9.345094755, "dept": "2B", "altitude": 759.0}, {"name": "Orto", "nameCorse": "Ortu", "lat": 42.198884881, "lon": 8.957623504, "dept": "2A", "altitude": 1243.0}, {"name": "Piedigriggio", "nameCorse": "Pedigrisgiu", "lat": 42.446285826, "lon": 9.18174561, "dept": "2B", "altitude": 353.0}, {"name": "Pietranera", "nameCorse": "Petranera", "lat": 42.7325634, "lon": 9.432341417, "dept": "2B", "altitude": 407.0}, {"name": "Pietraserena", "nameCorse": "Petraserena", "lat": 42.233745006, "lon": 9.354649252, "dept": "2B", "altitude": 514.0}, {"name": "Pietrosella", "nameCorse": "Pitrusedda", "lat": 41.828388927, "lon": 8.813564382, "dept": "2A", "altitude": 268.0}, {"name": "Pila-Canale", "nameCorse": "Pila è Canali", "lat": 41.792130713, "lon": 8.898406314, "dept": "2A", "altitude": 204.0}, {"name": "Poggio-di-Venaco", "nameCorse": "U Poghju di Venacu", "lat": 42.268695229, "lon": 9.205973945, "dept": "2B", "altitude": 398.0}, {"name": "Poggio-Marinaccio", "nameCorse": "U Poghju Marinacciu", "lat": 42.436106435, "lon": 9.347133242, "dept": "2B", "altitude": 645.0}, {"name": "Popolasca", "nameCorse": "Upulasca", "lat": 42.437461206, "lon": 9.135258451, "dept": "2B", "altitude": 793.0}, {"name": "Portigliolo", "nameCorse": "Purtigliolu", "lat": 41.769220036, "lon": 8.752801633, "dept": "2A", "altitude": 212.0}, {"name": "Prunelli-di-Casacconi", "nameCorse": "I Prunelli di Casacconi", "lat": 42.509944635, "lon": 9.405483212, "dept": "2B", "altitude": 159.0}, {"name": "Quenza", "nameCorse": "Quenza", "lat": 41.807500353, "lon": 9.200726813, "dept": "2A", "altitude": 1105.0}, {"name": "Rapaggio", "nameCorse": "Rapaghju", "lat": 42.375058194, "lon": 9.383937899, "dept": "2B", "altitude": 531.0}, {"name": "Rogliano", "nameCorse": "Ruglianu", "lat": 42.972122193, "lon": 9.426061606, "dept": "2B", "altitude": 147.0}, {"name": "Rosazia", "nameCorse": "Rusazia", "lat": 42.125334299, "lon": 8.861925294, "dept": "2A", "altitude": 587.0}, {"name": "Sagone", "nameCorse": "Savone", "lat": 42.1507896, "lon": 8.730071527, "dept": "2A", "altitude": 331.0}, {"name": "Sainte-Lucie-de-Tallano", "nameCorse": "Santa Lucia di Tallà", "lat": 41.668133274, "lon": 9.061131462, "dept": "2A", "altitude": 376.0}, {"name": "Salice", "nameCorse": "U salice", "lat": 42.104686784, "lon": 8.902309872, "dept": "2A", "altitude": 583.0}, {"name": "Sampolo", "nameCorse": "Sampolu", "lat": 41.946486583, "lon": 9.120742619, "dept": "2A", "altitude": 931.0}, {"name": "San Damiano", "nameCorse": "San Damianu", "lat": 42.406030999, "lon": 9.414212625, "dept": "2B", "altitude": 620.0}, {"name": "San Giovanni di Moriani", "nameCorse": "San Ghjuvanni di Moriani", "lat": 42.373178854, "lon": 9.465822164, "dept": "2B", "altitude": 577.0}, {"name": "San-Gavino-di-Fiumorbo", "nameCorse": "San Gavinu di Fiumorbu", "lat": 41.971505019, "lon": 9.247435686, "dept": "2B", "altitude": 1026.0}, {"name": "Santa Lucia di Mercurio", "nameCorse": "Santa Lucia di Mercoriu", "lat": 42.317971958, "lon": 9.220470203, "dept": "2B", "altitude": 727.0}, {"name": "Santa Lucia di Moriani", "nameCorse": "Santa Lucia di Moriani", "lat": 42.384149681, "lon": 9.510667948, "dept": "2B", "altitude": 87.0}, {"name": "Santo Pietro di Tenda", "nameCorse": "Santu Petru di Tenda", "lat": 42.672454406, "lon": 9.203779594, "dept": "2B", "altitude": 236.0}, {"name": "Santo Pietro di Venaco", "nameCorse": "San Petru di Venacu", "lat": 42.245017676, "lon": 9.164616982, "dept": "2B", "altitude": 1115.0}, {"name": "Sarrola-Carcopino", "nameCorse": "Sarrula è Carcupinu", "lat": 42.001804096, "lon": 8.835119475, "dept": "2A", "altitude": 241.0}, {"name": "Serra-di-Fiumorbo", "nameCorse": "Serra di Fiumorbu", "lat": 41.971818306, "lon": 9.328709317, "dept": "2B", "altitude": 369.0}, {"name": "Soccia", "nameCorse": "A Soccia", "lat": 42.209514801, "lon": 8.922484339, "dept": "2A", "altitude": 1232.0}, {"name": "Solaro", "nameCorse": "U Sulaghju", "lat": 41.879729335, "lon": 9.320753989, "dept": "2B", "altitude": 498.0}, {"name": "Sorio", "nameCorse": "Soriu", "lat": 42.577541785, "lon": 9.244900728, "dept": "2B", "altitude": 845.0}, {"name": "Valle-di-Campoloro", "nameCorse": "A Valle di Campulori", "lat": 42.335484289, "lon": 9.515431559, "dept": "2B", "altitude": 148.0}, {"name": "Valle-di-Mezzana", "nameCorse": "Vaddi di Mizana", "lat": 42.023677226, "lon": 8.820219186, "dept": "2A", "altitude": 474.0}, {"name": "Ventiseri", "nameCorse": "Vintisari", "lat": 41.941134978, "lon": 9.362670018, "dept": "2B", "altitude": 208.0}, {"name": "Verdèse", "nameCorse": "A Verdese", "lat": 42.393390948, "lon": 9.372080859, "dept": "2B", "altitude": 485.0}, {"name": "Vero", "nameCorse": "Veru", "lat": 42.061137696, "lon": 8.922243833, "dept": "2A", "altitude": 542.0}, {"name": "Vescovato", "nameCorse": "U Viscuvatu", "lat": 42.515771377, "lon": 9.473989387, "dept": "2B", "altitude": 55.0}, {"name": "Vico", "nameCorse": "Vicu", "lat": 42.1507896, "lon": 8.730071527, "dept": "2A", "altitude": 331.0}, {"name": "Zérubia", "nameCorse": "Zirubia", "lat": 41.751101958, "lon": 9.056943378, "dept": "2A", "altitude": 762.0}, {"name": "Zigliara", "nameCorse": "Ziddara", "lat": 41.834494139, "lon": 8.983551172, "dept": "2A", "altitude": 335.0}, {"name": "Zonza", "nameCorse": "Zonza", "lat": 41.721323664, "lon": 9.266906298, "dept": "2A", "altitude": 574.0}, {"name": "Zoza", "nameCorse": "Zoza", "lat": 41.721274416, "lon": 9.071461428, "dept": "2A", "altitude": 398.0}, {"name": "Ajaccio", "nameCorse": "Aiacciu", "lat": 41.934714906, "lon": 8.700944147, "dept": "2A", "altitude": 136.0}, {"name": "Ampriani", "nameCorse": "Ampriani", "lat": 42.254069427, "lon": 9.356980634, "dept": "2B", "altitude": 546.0}, {"name": "Antisanti", "nameCorse": "Antisanti", "lat": 42.156532393, "lon": 9.3835262, "dept": "2B", "altitude": 245.0}, {"name": "Arbori", "nameCorse": "Arburi", "lat": 42.128066991, "lon": 8.795671346, "dept": "2A", "altitude": 346.0}, {"name": "Aregno", "nameCorse": "Aregnu", "lat": 42.590900289, "lon": 8.876938763, "dept": "2B", "altitude": 124.0}, {"name": "Barrettali", "nameCorse": "Barrettali", "lat": 42.873175358, "lon": 9.360537313, "dept": "2B", "altitude": 456.0}, {"name": "Belgodère", "nameCorse": "Belgudè", "lat": 42.608057753, "lon": 9.014173798, "dept": "2B", "altitude": 177.0}, {"name": "Bisinchi", "nameCorse": "Bisinchi", "lat": 42.486019143, "lon": 9.319438296, "dept": "2B", "altitude": 481.0}, {"name": "Bonifacio", "nameCorse": "Bunifaziu", "lat": 41.435013642, "lon": 9.185681095, "dept": "2A", "altitude": 95.0}, {"name": "Bustanico", "nameCorse": "Bustanicu", "lat": 42.327134133, "lon": 9.308731954, "dept": "2B", "altitude": 1085.0}, {"name": "Calcatoggio", "nameCorse": "Calcatoghju", "lat": 42.028473495, "lon": 8.738326994, "dept": "2A", "altitude": 235.0}, {"name": "Calenzana", "nameCorse": "Calinzana", "lat": 42.478233108, "lon": 8.804164887, "dept": "2B", "altitude": 596.0}, {"name": "Campile", "nameCorse": "Campile", "lat": 42.495874387, "lon": 9.355468104, "dept": "2B", "altitude": 402.0}, {"name": "Campo", "nameCorse": "Campu", "lat": 41.890771999, "lon": 9.000227322, "dept": "2A", "altitude": 714.0}, {"name": "Canale-di-Verde", "nameCorse": "Canale di Verde", "lat": 42.265070947, "lon": 9.501682966, "dept": "2B", "altitude": 212.0}, {"name": "Canavaggia", "nameCorse": "A Canavaghja", "lat": 42.496582029, "lon": 9.234597593, "dept": "2B", "altitude": 646.0}, {"name": "Cargèse", "nameCorse": "Carghjese", "lat": 42.154461459, "lon": 8.626883142, "dept": "2A", "altitude": 179.0}, {"name": "Casalta", "nameCorse": "A Casalta", "lat": 42.435560307, "lon": 9.423293866, "dept": "2B", "altitude": 298.0}, {"name": "Casamaccioli", "nameCorse": "Casamacciuli", "lat": 42.282832216, "lon": 8.995293774, "dept": "2B", "altitude": 1510.0}, {"name": "Casanova", "nameCorse": "A Casanova", "lat": 42.261871783, "lon": 9.151974719, "dept": "2B", "altitude": 1201.0}, {"name": "Castineta", "nameCorse": "Castineta", "lat": 42.428151857, "lon": 9.272871351, "dept": "2B", "altitude": 646.0}, {"name": "Cateri", "nameCorse": "I Catari", "lat": 42.569234613, "lon": 8.896582034, "dept": "2B", "altitude": 356.0}, {"name": "Cauro", "nameCorse": "Cavru", "lat": 41.903933079, "lon": 8.893570079, "dept": "2A", "altitude": 362.0}, {"name": "Chiatra", "nameCorse": "Chjatra", "lat": 42.287456145, "lon": 9.489738458, "dept": "2B", "altitude": 214.0}, {"name": "Coggia", "nameCorse": "Coghja", "lat": 42.112397941, "lon": 8.735268745, "dept": "2A", "altitude": 266.0}, {"name": "Cognocoli-Monticchi", "nameCorse": "Cugnoculu è Muntichji", "lat": 41.802400595, "lon": 8.865927867, "dept": "2A", "altitude": 401.0}, {"name": "Eccica-Suarella", "nameCorse": "Eccica è Suaredda", "lat": 41.922967405, "lon": 8.894632094, "dept": "2A", "altitude": 196.0}, {"name": "Erbajolo", "nameCorse": "Erbaghjolu", "lat": 42.253058568, "lon": 9.263518462, "dept": "2B", "altitude": 487.0}, {"name": "Ersa", "nameCorse": "Ersa", "lat": 42.987189767, "lon": 9.38307572, "dept": "2B", "altitude": 179.0}, {"name": "Ficaja", "nameCorse": "Ficaghja", "lat": 42.421419454, "lon": 9.377909174, "dept": "2B", "altitude": 468.0}, {"name": "Figari", "nameCorse": "Figari", "lat": 41.516178028, "lon": 9.120207127, "dept": "2A", "altitude": 228.0}, {"name": "Focicchia", "nameCorse": "Fughjichja", "lat": 42.250218538, "lon": 9.292631017, "dept": "2B", "altitude": 614.0}, {"name": "Ghisoni", "nameCorse": "Ghisoni", "lat": 42.090679736, "lon": 9.20997778, "dept": "2B", "altitude": 1071.0}, {"name": "Giuncheto", "nameCorse": "Ghjunchetu", "lat": 41.586272265, "lon": 8.957309352, "dept": "2A", "altitude": 398.0}, {"name": "Granace", "nameCorse": "Granaccia", "lat": 41.640462631, "lon": 9.011964568, "dept": "2A", "altitude": 302.0}, {"name": "Lecci", "nameCorse": "Lecci", "lat": 41.665826255, "lon": 9.318756924, "dept": "2A", "altitude": 116.0}, {"name": "Lopigna", "nameCorse": "Lopigna", "lat": 42.089854585, "lon": 8.854582179, "dept": "2A", "altitude": 426.0}, {"name": "Loreto-di-Tallano", "nameCorse": "Laretu d'Attallà", "lat": 41.69992436, "lon": 9.03147424, "dept": "2A", "altitude": 309.0}, {"name": "Lugo-di-Nazza", "nameCorse": "U Lugu di Nazza", "lat": 42.075917936, "lon": 9.32399106, "dept": "2B", "altitude": 335.0}, {"name": "Luri", "nameCorse": "Luri", "lat": 42.893359929, "lon": 9.410319042, "dept": "2B", "altitude": 318.0}, {"name": "Mausoléo", "nameCorse": "U Musuleu", "lat": 42.495194508, "lon": 8.965300464, "dept": "2B", "altitude": 1192.0}, {"name": "Mignataja", "nameCorse": "A Mignataghja", "lat": 41.941134978, "lon": 9.362670018, "dept": "2B", "altitude": 208.0}, {"name": "Miomo", "nameCorse": "Miomu", "lat": 42.751399922, "lon": 9.423742517, "dept": "2B", "altitude": 543.0}, {"name": "Monacia-d'Aullène", "nameCorse": "A Munacia d'Auddè", "lat": 41.524825434, "lon": 9.011623108, "dept": "2A", "altitude": 314.0}, {"name": "Morsiglia", "nameCorse": "Mursiglia", "lat": 42.935746225, "lon": 9.373642508, "dept": "2B", "altitude": 253.0}, {"name": "Morta", "nameCorse": "A Morta", "lat": 42.007264725, "lon": 9.367477287, "dept": "2B", "altitude": 113.0}, {"name": "Nessa", "nameCorse": "Nesce", "lat": 42.549250368, "lon": 8.955449628, "dept": "2B", "altitude": 644.0}, {"name": "Noceta", "nameCorse": "Nuceta", "lat": 42.202866893, "lon": 9.209151, "dept": "2B", "altitude": 551.0}, {"name": "Novella", "nameCorse": "Nuvella", "lat": 42.597336578, "lon": 9.103111016, "dept": "2B", "altitude": 306.0}, {"name": "Olivese", "nameCorse": "Livesi", "lat": 41.840754048, "lon": 9.068910135, "dept": "2A", "altitude": 806.0}, {"name": "Olmo", "nameCorse": "L'Olmu", "lat": 42.500966147, "lon": 9.4137889, "dept": "2B", "altitude": 386.0}, {"name": "Ortale", "nameCorse": "L'Ortale", "lat": 42.310583643, "lon": 9.43481212, "dept": "2B", "altitude": 422.0}, {"name": "Pancheraccia", "nameCorse": "A Pancheraccia", "lat": 42.196509397, "lon": 9.404937717, "dept": "2B", "altitude": 251.0}, {"name": "Parata", "nameCorse": "A Parata", "lat": 42.367370002, "lon": 9.419511907, "dept": "2B", "altitude": 835.0}, {"name": "Patrimonio", "nameCorse": "Patrimoniu", "lat": 42.70684118, "lon": 9.367291211, "dept": "2B", "altitude": 330.0}, {"name": "Piazzali", "nameCorse": "I Piazzali", "lat": 42.319849138, "lon": 9.40624796, "dept": "2B", "altitude": 490.0}, {"name": "Piazzole", "nameCorse": "E Piazzole", "lat": 42.394305864, "lon": 9.406026984, "dept": "2B", "altitude": 597.0}, {"name": "Piedicroce", "nameCorse": "Pedicroce", "lat": 42.383602991, "lon": 9.367496412, "dept": "2B", "altitude": 582.0}, {"name": "Pietroso", "nameCorse": "U Petrosu", "lat": 42.126673307, "lon": 9.299766506, "dept": "2B", "altitude": 535.0}, {"name": "Poggio-di-Nazza", "nameCorse": "U Poghju di Nazza", "lat": 42.052471465, "lon": 9.292823274, "dept": "2B", "altitude": 620.0}, {"name": "Porticcio", "nameCorse": "Purtichju", "lat": 41.881679666, "lon": 8.8180744, "dept": "2A", "altitude": 349.0}, {"name": "Propriano", "nameCorse": "Prupià", "lat": 41.650480026, "lon": 8.893782923, "dept": "2A", "altitude": 131.0}, {"name": "Prunelli-di-Fiumorbo", "nameCorse": "I Prunelli di Fiumorbu", "lat": 42.007264725, "lon": 9.367477287, "dept": "2B", "altitude": 113.0}, {"name": "Querciolo", "nameCorse": "U Querciolu", "lat": 42.482672899, "lon": 9.488464533, "dept": "2B", "altitude": 101.0}, {"name": "Rapale", "nameCorse": "Rapale", "lat": 42.620693423, "lon": 9.304226711, "dept": "2B", "altitude": 217.0}, {"name": "Sainte-Marie-Sichée", "nameCorse": "Santa Maria Sichè", "lat": 41.884499455, "lon": 8.979258665, "dept": "2A", "altitude": 682.0}, {"name": "San-Gavino-di-Carbini", "nameCorse": "San Gavinu di Carbini", "lat": 41.6808746, "lon": 9.233197674, "dept": "2A", "altitude": 471.0}, {"name": "Santa-Maria-Figaniella", "nameCorse": "Santa Maria Ficaniedda", "lat": 41.724797617, "lon": 9.008692108, "dept": "2A", "altitude": 571.0}, {"name": "Sant'Andrea di Cotone", "nameCorse": "Sant'Andria di u Cotone", "lat": 42.314731034, "lon": 9.472934033, "dept": "2B", "altitude": 451.0}, {"name": "Sari-d'Orcino", "nameCorse": "Sari d'Urcinu", "lat": 42.064793742, "lon": 8.833814061, "dept": "2A", "altitude": 562.0}, {"name": "Serra-di-Ferro", "nameCorse": "A Sarra di Farru", "lat": 41.741305905, "lon": 8.812689336, "dept": "2A", "altitude": 135.0}, {"name": "Sotta", "nameCorse": "Sotta", "lat": 41.555644785, "lon": 9.181631152, "dept": "2A", "altitude": 287.0}, {"name": "Taglio-Isolaccio", "nameCorse": "Tagliu è Isulacciu", "lat": 42.434761907, "lon": 9.495861718, "dept": "2B", "altitude": 121.0}, {"name": "Tralonca", "nameCorse": "Tralonca", "lat": 42.340626954, "lon": 9.192853447, "dept": "2B", "altitude": 715.0}, {"name": "Travo", "nameCorse": "U Travu", "lat": 41.879729335, "lon": 9.320753989, "dept": "2B", "altitude": 498.0}, {"name": "Vallica", "nameCorse": "A Vallica", "lat": 42.517505492, "lon": 9.057996561, "dept": "2B", "altitude": 757.0}, {"name": "Venzolasca", "nameCorse": "A Venzulasca", "lat": 42.501541943, "lon": 9.493148146, "dept": "2B", "altitude": 40.0}, {"name": "Ville-di-Paraso", "nameCorse": "E Ville di Parasu", "lat": 42.58198927, "lon": 8.989693518, "dept": "2B", "altitude": 316.0}, {"name": "Zalana", "nameCorse": "Zalana", "lat": 42.25378544, "lon": 9.381355656, "dept": "2B", "altitude": 493.0}, {"name": "Zévaco", "nameCorse": "Zevacu", "lat": 41.887254351, "lon": 9.045323738, "dept": "2A", "altitude": 742.0}, {"name": "Zuani", "nameCorse": "Zuani", "lat": 42.265394888, "lon": 9.340839826, "dept": "2B", "altitude": 714.0}, {"name": "Aghione", "nameCorse": "Aghjone", "lat": 42.09858371, "lon": 9.41182181, "dept": "2B", "altitude": 83.0}, {"name": "Aiti", "nameCorse": "Aiti", "lat": 42.404034764, "lon": 9.228973435, "dept": "2B", "altitude": 606.0}, {"name": "Alata", "nameCorse": "Alata", "lat": 41.973630938, "lon": 8.731653878, "dept": "2A", "altitude": 244.0}, {"name": "Albitreccia", "nameCorse": "Albitreccia", "lat": 41.86066083, "lon": 8.877731508, "dept": "2A", "altitude": 488.0}, {"name": "Algajola", "nameCorse": "L'Algaiola", "lat": 42.60478, "lon": 8.857309253, "dept": "2B", "altitude": 78.0}, {"name": "Altagène", "nameCorse": "Altaghjè", "lat": 41.709341198, "lon": 9.077320052, "dept": "2A", "altitude": 728.0}, {"name": "Alzi", "nameCorse": "L'Alzi", "lat": 42.31255873, "lon": 9.314211407, "dept": "2B", "altitude": 998.0}, {"name": "Arro", "nameCorse": "Arru", "lat": 42.096711741, "lon": 8.80432428, "dept": "2A", "altitude": 319.0}, {"name": "Borgo", "nameCorse": "U Borgu", "lat": 42.574004682, "lon": 9.457384712, "dept": "2B", "altitude": 121.0}, {"name": "Campana", "nameCorse": "A Campana", "lat": 42.388404949, "lon": 9.340363117, "dept": "2B", "altitude": 1059.0}, {"name": "Canari", "nameCorse": "Canari", "lat": 42.842994572, "lon": 9.345139796, "dept": "2B", "altitude": 447.0}, {"name": "Cannelle", "nameCorse": "I Canneddi", "lat": 42.047811428, "lon": 8.816968797, "dept": "2A", "altitude": 360.0}, {"name": "Carbini", "nameCorse": "Carbini", "lat": 41.6758019, "lon": 9.159962103, "dept": "2A", "altitude": 722.0}, {"name": "Cardo-Torgia", "nameCorse": "Cardu è Torghja", "lat": 41.852428162, "lon": 8.97181311, "dept": "2A", "altitude": 381.0}, {"name": "Cargiaca", "nameCorse": "Carghjaca", "lat": 41.732245332, "lon": 9.040954726, "dept": "2A", "altitude": 522.0}, {"name": "Casaglione", "nameCorse": "Casaglione", "lat": 42.069544281, "lon": 8.76036097, "dept": "2A", "altitude": 153.0}, {"name": "Castiglione", "nameCorse": "Castiglione", "lat": 42.409266106, "lon": 9.11456258, "dept": "2B", "altitude": 1036.0}, {"name": "Centuri", "nameCorse": "Centuri", "lat": 42.967299152, "lon": 9.364562278, "dept": "2B", "altitude": 221.0}, {"name": "Ciamannacce", "nameCorse": "Ciamanaccia", "lat": 41.973021385, "lon": 9.138412717, "dept": "2A", "altitude": 1318.0}, {"name": "Conca", "nameCorse": "Conca", "lat": 41.753235671, "lon": 9.330136574, "dept": "2A", "altitude": 426.0}, {"name": "Corbara", "nameCorse": "Curbara", "lat": 42.617463796, "lon": 8.901371157, "dept": "2B", "altitude": 115.0}, {"name": "Corscia", "nameCorse": "Corscia", "lat": 42.36912127, "lon": 9.055683928, "dept": "2B", "altitude": 1275.0}, {"name": "Coti-Chiavari", "nameCorse": "Coti Chjavari", "lat": 41.769220036, "lon": 8.752801633, "dept": "2A", "altitude": 212.0}, {"name": "Cozzano", "nameCorse": "Cuzzà", "lat": 41.933423808, "lon": 9.18627726, "dept": "2A", "altitude": 1250.0}, {"name": "Cristinacce", "nameCorse": "E Cristinacce", "lat": 42.243558113, "lon": 8.855476205, "dept": "2A", "altitude": 1099.0}, {"name": "Evisa", "nameCorse": "Evisa", "lat": 42.285205276, "lon": 8.820545759, "dept": "2A", "altitude": 1160.0}, {"name": "Frasseto", "nameCorse": "Frassetu", "lat": 41.920065663, "lon": 9.039339609, "dept": "2A", "altitude": 1010.0}, {"name": "Giovicacce", "nameCorse": "Ghjuvicaccia", "lat": 41.946486583, "lon": 9.120742619, "dept": "2A", "altitude": 931.0}, {"name": "Girolata", "nameCorse": "Ghjirulatu", "lat": 42.343210456, "lon": 8.623256444, "dept": "2A", "altitude": 255.0}, {"name": "Isolella", "nameCorse": "L'isulella", "lat": 41.828388927, "lon": 8.813564382, "dept": "2A", "altitude": 268.0}, {"name": "La Porta", "nameCorse": "A Porta", "lat": 42.424509445, "lon": 9.358285544, "dept": "2B", "altitude": 631.0}, {"name": "Lama", "nameCorse": "Lama", "lat": 42.58037041, "lon": 9.165869709, "dept": "2B", "altitude": 583.0}, {"name": "Lavatoggio", "nameCorse": "Lavatoghju", "lat": 42.573525634, "lon": 8.86117754, "dept": "2B", "altitude": 401.0}, {"name": "Lucciana", "nameCorse": "Lucciana", "lat": 42.541495443, "lon": 9.473319063, "dept": "2B", "altitude": 66.0}, {"name": "Macinaggio", "nameCorse": "U Macinaghju", "lat": 42.972122193, "lon": 9.426061606, "dept": "2B", "altitude": 147.0}, {"name": "Matra", "nameCorse": "Matra", "lat": 42.282877731, "lon": 9.388145686, "dept": "2B", "altitude": 653.0}, {"name": "Moïta", "nameCorse": "Moita", "lat": 42.281916177, "lon": 9.410701158, "dept": "2B", "altitude": 627.0}, {"name": "Monacia-d'Orezza", "nameCorse": "A Munacia d'Orezza", "lat": 42.381282416, "lon": 9.404972062, "dept": "2B", "altitude": 622.0}, {"name": "Moncale", "nameCorse": "U Mucale", "lat": 42.503349971, "lon": 8.819545913, "dept": "2B", "altitude": 229.0}, {"name": "Montegrosso", "nameCorse": "Montegrossu", "lat": 42.543663598, "lon": 8.855619194, "dept": "2B", "altitude": 247.0}, {"name": "Monticello", "nameCorse": "Munticellu", "lat": 42.621908943, "lon": 8.96175403, "dept": "2B", "altitude": 131.0}, {"name": "Morosaglia", "nameCorse": "Merusaglia", "lat": 42.447442972, "lon": 9.254839416, "dept": "2B", "altitude": 584.0}, {"name": "Muro", "nameCorse": "Muru", "lat": 42.546200932, "lon": 8.91727282, "dept": "2B", "altitude": 477.0}, {"name": "Murzo", "nameCorse": "Murzu", "lat": 42.158617987, "lon": 8.846746277, "dept": "2A", "altitude": 654.0}, {"name": "Nocario", "nameCorse": "Nucariu", "lat": 42.395383375, "lon": 9.347999187, "dept": "2B", "altitude": 836.0}, {"name": "Nonza", "nameCorse": "Nonza", "lat": 42.788421198, "lon": 9.354620265, "dept": "2B", "altitude": 308.0}, {"name": "Ocana", "nameCorse": "Ocana", "lat": 41.95029011, "lon": 8.909484856, "dept": "2A", "altitude": 426.0}, {"name": "Olmeta-di-Capocorso", "nameCorse": "Olmeta di Capicorsu", "lat": 42.76662536, "lon": 9.377150937, "dept": "2B", "altitude": 545.0}, {"name": "Partinello", "nameCorse": "Partinellu", "lat": 42.318887178, "lon": 8.689536408, "dept": "2A", "altitude": 324.0}, {"name": "Penta-di-Casinca", "nameCorse": "A Penta di Casinca", "lat": 42.454841775, "lon": 9.497220418, "dept": "2B", "altitude": 120.0}, {"name": "Piana", "nameCorse": "A Piana", "lat": 42.225980207, "lon": 8.629135134, "dept": "2A", "altitude": 378.0}, {"name": "Pietracorbara", "nameCorse": "A Petracurbara", "lat": 42.844693715, "lon": 9.438161192, "dept": "2B", "altitude": 313.0}, {"name": "Piève", "nameCorse": "A Pieve", "lat": 42.602563476, "lon": 9.295995774, "dept": "2B", "altitude": 526.0}, {"name": "Porri", "nameCorse": "Porri", "lat": 42.449261473, "lon": 9.441966528, "dept": "2B", "altitude": 349.0}, {"name": "Porto", "nameCorse": "Portu", "lat": 42.254915069, "lon": 8.733420349, "dept": "2A", "altitude": 573.0}, {"name": "Porto-Vecchio", "nameCorse": "Portivechju", "lat": 41.592638608, "lon": 9.253642063, "dept": "2A", "altitude": 196.0}, {"name": "Prato-di-Giovellina", "nameCorse": "U Pratu di Ghjuvellina", "lat": 42.419022064, "lon": 9.169230292, "dept": "2B", "altitude": 517.0}, {"name": "Pruno", "nameCorse": "U Prunu", "lat": 42.42434454, "lon": 9.448133189, "dept": "2B", "altitude": 331.0}, {"name": "Renno", "nameCorse": "Rennu", "lat": 42.206614166, "lon": 8.820333351, "dept": "2A", "altitude": 955.0}, {"name": "Rezza", "nameCorse": "Reza", "lat": 42.123684074, "lon": 8.952481117, "dept": "2A", "altitude": 694.0}, {"name": "Rospigliani", "nameCorse": "Ruspigliani", "lat": 42.194036469, "lon": 9.238021239, "dept": "2B", "altitude": 619.0}, {"name": "Saint-Florent", "nameCorse": "San Fiurenzu", "lat": 42.69204221, "lon": 9.326144109, "dept": "2B", "altitude": 73.0}, {"name": "San Gavino d'Ampugnani", "nameCorse": "San Gavinu d'Ampugnani", "lat": 42.4173683, "lon": 9.425640894, "dept": "2B", "altitude": 355.0}, {"name": "San Martino di Lota", "nameCorse": "San Martinu di Lota", "lat": 42.7325634, "lon": 9.432341417, "dept": "2B", "altitude": 407.0}, {"name": "San Nicolao", "nameCorse": "San Niculaiu", "lat": 42.368543705, "lon": 9.509244013, "dept": "2B", "altitude": 126.0}, {"name": "Santa Maria Poggio", "nameCorse": "Santa Maria Poghju", "lat": 42.350303367, "lon": 9.508073863, "dept": "2B", "altitude": 230.0}, {"name": "Santa Reparata di Balagna", "nameCorse": "Santa Riparata di Balagna", "lat": 42.601368217, "lon": 8.931733241, "dept": "2B", "altitude": 201.0}, {"name": "Sant'Antonino", "nameCorse": "Sant'Antuninu", "lat": 42.584511842, "lon": 8.908424902, "dept": "2B", "altitude": 316.0}, {"name": "Sari-Solenzara", "nameCorse": "Sari di Sulinzara", "lat": 41.813484388, "lon": 9.352409643, "dept": "2A", "altitude": 285.0}, {"name": "Scata", "nameCorse": "Scata", "lat": 42.422242874, "lon": 9.404226001, "dept": "2B", "altitude": 361.0}, {"name": "Scolca", "nameCorse": "Scolca", "lat": 42.538730176, "lon": 9.364871046, "dept": "2B", "altitude": 819.0}, {"name": "Sermano", "nameCorse": "Sermanu", "lat": 42.315096946, "lon": 9.266283956, "dept": "2B", "altitude": 782.0}, {"name": "Silvareccio", "nameCorse": "U Silvarecciu", "lat": 42.452776483, "lon": 9.417778706, "dept": "2B", "altitude": 733.0}, {"name": "Sisco", "nameCorse": "Siscu", "lat": 42.814388831, "lon": 9.442807921, "dept": "2B", "altitude": 427.0}, {"name": "Speloncato", "nameCorse": "U Spiluncatu", "lat": 42.574023464, "lon": 8.9695723, "dept": "2B", "altitude": 379.0}, {"name": "Talasani", "nameCorse": "Talasani", "lat": 42.417836969, "lon": 9.507426546, "dept": "2B", "altitude": 137.0}, {"name": "Tavaco", "nameCorse": "Tavacu", "lat": 42.031657485, "lon": 8.884974446, "dept": "2A", "altitude": 461.0}, {"name": "Ucciani", "nameCorse": "Aucciani", "lat": 42.047197897, "lon": 8.982585246, "dept": "2A", "altitude": 718.0}, {"name": "Valle-d'Alesani", "nameCorse": "E Valli d'Alisgiani", "lat": 42.328016128, "lon": 9.434606151, "dept": "2B", "altitude": 655.0}, {"name": "Velone-Orneto", "nameCorse": "Vilone è Urnetu", "lat": 42.39097936, "lon": 9.451708549, "dept": "2B", "altitude": 634.0}, {"name": "Zicavo", "nameCorse": "Zicavu", "lat": 41.884420509, "lon": 9.16690313, "dept": "2A", "altitude": 1273.0}];
let map, testMarker, neighborMarkers = [], neighborLines = [];
let currentK = 5;
// Initialiser la carte
function initMap() {
map = L.map('map').setView([42.15, 9.05], 9);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Ajouter tous les villages
villages.forEach(village => {
const color = village.dept === '2A' ? '#e74c3c' : '#3498db';
L.circleMarker([village.lat, village.lon], {
radius: 3,
fillColor: color,
color: '#333',
weight: 1,
opacity: 1,
fillOpacity: 0.5
}).bindPopup(`<b>${village.name}</b><br>${village.nameCorse}<br>${village.dept}`)
.addTo(map);
});
// Ajouter le gestionnaire de clic
map.on('click', onMapClick);
}
// Calcul de distance Haversine
function haversineDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // Rayon de la Terre en km
const dLat = (lat2 - lat1) * Math.PI / 180;
const dLon = (lon2 - lon1) * Math.PI / 180;
const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return R * c;
}
// Classification k-NN
function knnClassify(lat, lon, k) {
// Calculer distances
const distances = villages.map(village => ({
...village,
distance: haversineDistance(lat, lon, village.lat, village.lon)
}));
// Trier par distance
distances.sort((a, b) => a.distance - b.distance);
// Prendre les k plus proches
const neighbors = distances.slice(0, k);
// Voter
const votes = { '2A': 0, '2B': 0 };
neighbors.forEach(n => votes[n.dept]++);
const prediction = votes['2A'] > votes['2B'] ? '2A' : '2B';
return { prediction, neighbors, votes };
}
// Gestionnaire de clic sur la carte
function onMapClick(e) {
const lat = e.latlng.lat;
const lon = e.latlng.lng;
classifyPoint(lat, lon);
}
// Classifier un point
function classifyPoint(lat, lon) {
// Supprimer les anciens marqueurs
if (testMarker) map.removeLayer(testMarker);
neighborMarkers.forEach(m => map.removeLayer(m));
neighborLines.forEach(l => map.removeLayer(l));
neighborMarkers = [];
neighborLines = [];
// Classifier
const result = knnClassify(lat, lon, currentK);
// Ajouter le marqueur du point test
testMarker = L.circleMarker([lat, lon], {
radius: 12,
fillColor: '#95a5a6',
color: '#000',
weight: 3,
opacity: 1,
fillOpacity: 0.8
}).addTo(map);
// Ajouter les marqueurs et lignes des voisins
result.neighbors.forEach(neighbor => {
const nColor = neighbor.dept === '2A' ? '#e74c3c' : '#3498db';
// Ligne
const line = L.polyline(
[[lat, lon], [neighbor.lat, neighbor.lon]],
{color: nColor, weight: 2, opacity: 0.5}
).addTo(map);
neighborLines.push(line);
// Marqueur
const marker = L.circleMarker([neighbor.lat, neighbor.lon], {
radius: 8,
fillColor: nColor,
color: '#333',
weight: 2,
opacity: 1,
fillOpacity: 0.8
}).bindPopup(`<b>${neighbor.name}</b><br>${neighbor.nameCorse}<br>${neighbor.dept}<br>Distance: ${neighbor.distance.toFixed(2)} km`)
.addTo(map);
neighborMarkers.push(marker);
});
// Afficher les résultats
displayResults(lat, lon, result);
}
// Afficher les résultats
function displayResults(lat, lon, result) {
const predictionDiv = document.getElementById('prediction');
const coordsDiv = document.getElementById('coords');
const votesContainer = document.getElementById('votesContainer');
const votes2A = document.getElementById('votes2A');
const votes2B = document.getElementById('votes2B');
const neighborsList = document.getElementById('neighborsList');
// Coordonnées
coordsDiv.textContent = `(${lat.toFixed(4)}, ${lon.toFixed(4)})`;
// Prédiction
const deptName = result.prediction === '2A' ? 'Corse du Sud (2A)' : 'Haute-Corse (2B)';
const cssClass = result.prediction === '2A' ? 'corse-sud' : 'haute-corse';
predictionDiv.textContent = deptName;
predictionDiv.className = 'prediction ' + cssClass;
// Votes
votes2A.textContent = result.votes['2A'];
votes2B.textContent = result.votes['2B'];
votesContainer.style.display = 'block';
// Liste des voisins
neighborsList.innerHTML = '';
result.neighbors.forEach(neighbor => {
const div = document.createElement('div');
div.className = `neighbor-item dept-${neighbor.dept.toLowerCase()}`;
div.innerHTML = `
<div class="neighbor-name">${neighbor.name} (${neighbor.dept})</div>
<div class="neighbor-corse">${neighbor.nameCorse}</div>
<div class="neighbor-distance">Distance: ${neighbor.distance.toFixed(2)} km</div>
`;
neighborsList.appendChild(div);
});
}
// Point aléatoire
function placeRandomPoint() {
const lat = 41.3 + Math.random() * (43.0 - 41.3);
const lon = 8.5 + Math.random() * (9.6 - 8.5);
classifyPoint(lat, lon);
map.setView([lat, lon], 10);
}
// Réinitialiser
function resetClassification() {
if (testMarker) map.removeLayer(testMarker);
neighborMarkers.forEach(m => map.removeLayer(m));
neighborLines.forEach(l => map.removeLayer(l));
neighborMarkers = [];
neighborLines = [];
testMarker = null;
document.getElementById('prediction').textContent = 'Cliquez sur la carte';
document.getElementById('prediction').className = 'prediction no-result';
document.getElementById('coords').textContent = '';
document.getElementById('votesContainer').style.display = 'none';
map.setView([42.15, 9.05], 9);
}
// Gestionnaire du slider k
document.getElementById('kSlider').addEventListener('input', function(e) {
currentK = parseInt(e.target.value);
document.getElementById('kValue').textContent = currentK;
// Reclassifier si un point existe
if (testMarker) {
const latlng = testMarker.getLatLng();
classifyPoint(latlng.lat, latlng.lng);
}
});
// Initialisation
initMap();
</script>
</body>
</html>