Voici l'explication détaillée ligne par ligne du code que vous avez partagé, qui
est destiné à afficher une carte Google Maps avec des itinéraires entre plusieurs
points (employés) et une destination finale.
### Fonction `initMap()`
Cette fonction initialise la carte et commence à géocoder les adresses des employés
pour tracer un itinéraire.
```javascript
function initMap() {
```
- Déclaration de la fonction `initMap()`, qui sera exécutée lorsque la page se
charge.
```javascript
const map = new google.maps.Map(document.getElementById("map"), {
zoom: 12,
center: { lat: 31.6295, lng: -7.9811 },
});
```
- **`const map`** : Crée une nouvelle carte Google Maps dans l'élément HTML avec
l'ID `map`.
- **`zoom: 12`** : Définit le niveau de zoom initial de la carte (plus le nombre
est élevé, plus le zoom est proche).
- **`center: { lat: 31.6295, lng: -7.9811 }`** : Définit les coordonnées (latitude
et longitude) du centre de la carte (par défaut).
```javascript
const geocoder = new google.maps.Geocoder();
```
- **`const geocoder`** : Crée un objet `Geocoder` de Google Maps qui est utilisé
pour convertir des adresses en coordonnées géographiques (géocodage).
```javascript
const employes = <?php echo json_encode($employes); ?>;
```
- **`const employes`** : Charge la liste des employés à partir du code PHP via
`json_encode`. Cela permet de convertir les données PHP en un tableau JavaScript
qui peut être utilisé dans le script.
```javascript
const destination = { lat: 31.6258, lng: -7.9892 };
```
- **`const destination`** : Définit la destination finale de l'itinéraire avec les
coordonnées géographiques (latitude et longitude).
### Fonction `geocodeAddresses()`
Cette fonction est responsable de géocoder chaque adresse des employés et de placer
un marqueur sur la carte pour chaque employé.
```javascript
const geocodeAddresses = async () => {
const locations = [];
```
- **`const geocodeAddresses = async () => {`** : Déclare une fonction asynchrone
qui géocode les adresses des employés. Elle retourne une promesse pour indiquer que
l'opération de géocodage est asynchrone.
- **`const locations = []`** : Initialise un tableau vide pour stocker les
positions géocodées des employés.
```javascript
for (const employee of employes) {
try {
const location = await geocodeAddress(geocoder, employee.adresse);
locations.push({
employee: employee,
location: location,
});
```
- **`for (const employee of employes)`** : Parcourt chaque employé dans le tableau
`employes`.
- **`const location = await geocodeAddress(geocoder, employee.adresse)`** : Appelle
la fonction `geocodeAddress()` (voir ci-dessous), qui géocode l'adresse de
l'employé. `await` attend que la géocodification soit terminée.
- **`locations.push({ employee: employee, location: location })`** : Ajoute l'objet
contenant l'employé et sa position géocodée dans le tableau `locations`.
```javascript
const marker = new google.maps.Marker({
position: location,
map: map,
title: `${employee.first_name} ${employee.last_name}`,
});
```
- **`const marker`** : Crée un nouveau marqueur sur la carte à la position géocodée
de l'employé.
- **`position: location`** : Place le marqueur à la position géocodée.
- **`map: map`** : Associe ce marqueur à la carte.
- **`title: `${employee.first_name} ${employee.last_name}``** : Définit le titre du
marqueur (affiché en survolant le marqueur avec la souris).
```javascript
const infoWindow = new google.maps.InfoWindow({
content: `
<strong>${employee.first_name}
${employee.last_name}</strong><br>
Adresse: ${employee.adresse}
`,
});
```
- **`const infoWindow`** : Crée une fenêtre d'information qui s'affiche lorsque
l'utilisateur clique sur un marqueur. Cette fenêtre contient le nom de l'employé et
son adresse.
```javascript
marker.addListener("click", () => {
infoWindow.open(map, marker);
});
```
- **`marker.addListener("click", () => {...})`** : Ajoute un écouteur d'événements
pour afficher la fenêtre d'information quand le marqueur est cliqué.
```javascript
} catch (error) {
console.error(`Erreur de géocodage pour ${employee.adresse}:`,
error);
}
}
return locations;
};
```
- **`catch (error)`** : Si le géocodage échoue pour une adresse, il est capturé et
un message d'erreur est affiché dans la console.
- **`return locations`** : La fonction retourne le tableau `locations` contenant
les coordonnées géocodées des employés.
### Fonction `geocodeAddress()`
Cette fonction géocode une adresse donnée.
```javascript
const geocodeAddress = (geocoder, address) => {
return new Promise((resolve, reject) => {
geocoder.geocode({ address: address }, (results, status) => {
if (status === "OK") {
resolve(results[0].geometry.location);
} else {
reject(status);
}
});
});
};
```
- **`geocodeAddress()`** : Cette fonction prend un `geocoder` et une `address`
comme arguments et retourne une promesse.
- **`geocoder.geocode({ address: address })`** : Appelle l'API de géocodage de
Google Maps pour obtenir les coordonnées de l'adresse.
- **`resolve(results[0].geometry.location)`** : Si le géocodage est réussi, la
promesse est résolue avec la première position géocodée.
- **`reject(status)`** : Si le géocodage échoue, la promesse est rejetée avec le
statut de l'échec.
### Appel de la fonction `geocodeAddresses()`
```javascript
geocodeAddresses().then((locations) => {
if (locations.length > 0) {
const waypoints = locations.map((loc) => ({
location: loc.location,
stopover: true,
}));
```
- **`geocodeAddresses().then((locations) => {...})`** : Appelle la fonction
`geocodeAddresses()` et attend que les géocodages soient terminés. Une fois que les
positions géocodées sont retournées, elles sont passées dans la fonction `then()`.
- **`const waypoints = locations.map((loc) => ({ location: loc.location, stopover:
true }))`** : Transforme les coordonnées géocodées en points de passage (waypoints)
que l'API Directions peut utiliser pour l'itinéraire.
```javascript
drawRouteWithAPI(waypoints, destination, map);
} else {
console.error("Aucun point valide pour dessiner un trajet.");
}
});
```
- **`drawRouteWithAPI(waypoints, destination, map)`** : Appelle la fonction
`drawRouteWithAPI()` pour dessiner l'itinéraire avec les points de passage et la
destination finale.
- **`else`** : Si aucune position géocodée valide n'a été trouvée, un message
d'erreur est affiché.
### Fonction `drawRouteWithAPI()`
Cette fonction dessine un itinéraire sur la carte en utilisant l'API Directions de
Google Maps.
```javascript
function drawRouteWithAPI(waypoints, destination, map) {
const directionsService = new google.maps.DirectionsService();
const directionsRenderer = new google.maps.DirectionsRenderer({
map: map,
suppressMarkers: true,
});
```
- **`const directionsService`** : Crée un service de directions de Google Maps pour
calculer l'itinéraire.
- **`const directionsRenderer`** : Crée un objet qui rendra l'itinéraire sur la
carte. L'option `suppressMarkers: true` empêche Google Maps d'ajouter des marqueurs
automatiques sur l'itinéraire.
```javascript
directionsService.route(
{
origin: waypoints[0].location,
destination: destination,
waypoints: waypoints.slice(1),
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING,
},
(response, status) => {
if (status === "OK") {
directionsRenderer.setDirections(response);
} else {
console.error("Erreur lors de la création de l'itinéraire :",
status);
}
}
);
}
```
- **`directionsService.route({...})`** : Calcule l'itinéraire en spécifiant
l'origine (premier employé), la destination finale, les points de passage et le
mode de transport (`DRIVING`).
- **`directionsRenderer.setDirections(response)`** : Affiche l'itinéraire sur la
carte.