{"id":28,"date":"2025-04-16T19:44:12","date_gmt":"2025-04-16T17:44:12","guid":{"rendered":"https:\/\/erban.parc-de-camelot.fr\/?page_id=28"},"modified":"2025-04-25T01:20:30","modified_gmt":"2025-04-24T23:20:30","slug":"accueil","status":"publish","type":"page","link":"https:\/\/erban.parc-de-camelot.fr\/","title":{"rendered":"Accueil"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"28\" class=\"elementor elementor-28\">\n\t\t\t\t<div class=\"elementor-element elementor-element-efdf54f e-flex e-con-boxed e-con e-parent\" data-id=\"efdf54f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b49ddb8 elementor-widget elementor-widget-html\" data-id=\"b49ddb8\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 1. CSS + JS Leaflet -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\r\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\r\n\r\n<!-- 2. Container pour la carte -->\r\n<div id=\"map\" style=\"height: 600px;\"><\/div>\r\n<button id=\"recentrer-btn\" style=\"position: absolute; top: 10px; left: 10px; z-index: 1000;\">\r\n  Recentrer sur ma position\r\n<\/button>\r\n\r\n<!-- 3. Script d'initialisation -->\r\n<script>\r\n    let map = L.map(\"map\").setView([49.380802, 2.413522], 13);\r\n    L.tileLayer(\"https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png\", {\r\n        attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a>',\r\n    }).addTo(map);\r\n\r\n\/\/test erwan debut modification marqueur de position en live\r\n let positionMarker;\r\n    let positionCircle;\r\n\r\n    if (navigator.geolocation) {\r\n        navigator.geolocation.watchPosition(\r\n            (position) => {\r\n                const lat = position.coords.latitude;\r\n                const lng = position.coords.longitude;\r\n    \r\n                \/\/ Centrer la carte si c'est la premi\u00e8re fois\r\n                if (!positionMarker) {\r\n                    map.setView([lat, lng], 15);\r\n                }\r\n    \r\n                \/\/ Mettre \u00e0 jour ou cr\u00e9er le marqueur\r\n                if (positionMarker) {\r\n                    positionMarker.setLatLng([lat, lng]);\r\n                    positionCircle.setLatLng([lat, lng]);\r\n                } else {\r\n                    positionMarker = L.marker([lat, lng]).addTo(map);\r\n                    positionCircle = L.circle([lat, lng], {\r\n                        radius: 10,\r\n                        color: \"blue\",\r\n                        fillOpacity: 1\r\n                    }).addTo(map);\r\n                }\r\n            },\r\n            (error) => {\r\n                alert(\"Impossible de r\u00e9cup\u00e9rer votre position : \" + error.message);\r\n            },\r\n            {\r\n                enableHighAccuracy: true,\r\n                maximumAge: 1000,\r\n                timeout: 10000\r\n            }\r\n        );\r\n    } else {\r\n        alert(\"La g\u00e9olocalisation n'est pas prise en charge par ce navigateur.\");\r\n    }\r\n\r\n\/\/test fin modif Erwan\r\n    \r\n    \/\/ Fonction pour g\u00e9n\u00e9rer une couleur al\u00e9atoire\r\n    function getRandomColor() {\r\n        const letters = '0123456789ABCDEF';\r\n        let color = '#';\r\n        for (let i = 0; i < 6; i++) {\r\n            color += letters[Math.floor(Math.random() * 16)];\r\n        }\r\n        return color;\r\n    }\r\n\r\n    async function fetchGPSData() {\r\n        try {\r\n            \/\/ R\u00e9cup\u00e9rer les IMEI\r\n            const responseIMEI = await fetch(\"get_imei.php\");\r\n            const { IMEI } = await responseIMEI.json();\r\n\r\n            \/\/ Parcourir chaque IMEI et r\u00e9cup\u00e9rer les donn\u00e9es GPS\r\n            for (const { IMEI: currentIMEI, couleur } of IMEI) {\r\n                const responseGPS = await fetch(`get_gps.php?IMEI=${currentIMEI}`);\r\n                const { polyline, lastPoint } = await responseGPS.json();\r\n\r\n                \/\/ Convertir X et Y en nombres et filtrer les points invalides\r\n                const convertedPolyline = polyline.map(point => {\r\n                    const X = parseFloat(point.X);\r\n                    const Y = parseFloat(point.Y);\r\n                    return { X, Y };\r\n                }).filter(point => !isNaN(point.X) && !isNaN(point.Y)); \/\/ Filtrer les points invalides\r\n\r\n                \/\/ Appliquer une couleur al\u00e9atoire \u00e0 chaque polyline\r\n                const polylineColor = couleur;\r\n\r\n                \/\/ Cr\u00e9er la polyline pour cet IMEI\r\n                const polylineLayer = L.polyline(convertedPolyline.map(point => [point.X, point.Y]), { color: polylineColor }).addTo(map);\r\n\r\n                \/\/ G\u00e9rer le dernier point\r\n                if (lastPoint) {\r\n                    const lastPointConverted = {\r\n                        X: parseFloat(lastPoint.X),\r\n                        Y: parseFloat(lastPoint.Y)\r\n                    };\r\n                    if (!isNaN(lastPointConverted.X) && !isNaN(lastPointConverted.Y)) {\r\n                        L.marker([lastPointConverted.X, lastPointConverted.Y]).addTo(map);\r\n                    }\r\n                }\r\n\r\n                \/\/ Ajuster la carte autour de la polyline\r\n                if (convertedPolyline.length > 0) {\r\n                    \/\/map.fitBounds(polylineLayer.getBounds());\r\n                }\r\n            }\r\n        } catch (error) {\r\n            console.error(\"Erreur lors du chargement des donn\u00e9es GPS:\", error);\r\n        }\r\n    }\r\n\r\n    fetchGPSData();\r\n    setInterval(fetchGPSData, 5000);\r\n    \r\n    document.getElementById(\"recentrer-btn\").addEventListener(\"click\", () => {\r\n        if (positionMarker) {\r\n            map.setView(positionMarker.getLatLng(), 15);\r\n        }\r\n    });\r\n    \r\n\r\n\/\/ Ouvrir Google map lors d'un appui long sur la carte\r\nlet longPressTimeout;\r\n\r\nmap.on('mousedown', function (e) {\r\n    longPressTimeout = setTimeout(() => {\r\n        const lat = e.latlng.lat;\r\n        const lng = e.latlng.lng;\r\n        const url = `https:\/\/www.google.com\/maps?q=${lat},${lng}`;\r\n        window.open(url, '_blank'); \/\/ Ouvre dans un nouvel onglet\r\n    }, 1000); \/\/ Appui long = 1 seconde\r\n});\r\n\r\nmap.on('mouseup', function () {\r\n    clearTimeout(longPressTimeout);\r\n});\r\n\r\nmap.on('mouseout', function () {\r\n    clearTimeout(longPressTimeout);\r\n});\r\n\r\n\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Recentrer sur ma position<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-28","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/pages\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/comments?post=28"}],"version-history":[{"count":85,"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/pages\/28\/revisions"}],"predecessor-version":[{"id":147,"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/pages\/28\/revisions\/147"}],"wp:attachment":[{"href":"https:\/\/erban.parc-de-camelot.fr\/index.php\/wp-json\/wp\/v2\/media?parent=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}