mappa_logout.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <!DOCTYPE html>
  2. <html lang="it">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Mappa Interattiva con Layer Colorati</title>
  7. <!-- Fogli di stile -->
  8. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-italia@2.13.4/dist/css/bootstrap-italia.min.css">
  9. <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css">
  10. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css"/>
  11. <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
  12. <style>
  13. .top-bar { background-color: #004080; color: white; padding: 0.5rem 0; }
  14. .header { background-color: #0066CC; color: white; padding: 1rem 0; }
  15. /* Stile per il logo "PW" dentro un cerchio */
  16. .logo {
  17. font-family: 'Georgia', serif;
  18. font-size: 1.5rem;
  19. width: 50px; height: 50px;
  20. background-color: white;
  21. color: #0066CC;
  22. border-radius: 50%;
  23. margin-right: 10px;
  24. display: inline-flex;
  25. align-items: center;
  26. justify-content: center;
  27. }
  28. .header-title { color: white; font-size: 1.5rem; font-weight: bold; }
  29. .main-content { background-color: #f8f9fa; padding: 2rem 0; }
  30. #map { height: 500px; width: 100%; border-radius: 8px; }
  31. .search-container { margin: 20px 0; }
  32. .search-box { display: flex; gap: 10px; max-width: 600px; margin: 0 auto; }
  33. .coordinate-box { background: white; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); margin-top: 20px; }
  34. </style>
  35. </head>
  36. <body>
  37. <!-- Header -->
  38. <div class="top-bar">
  39. <div class="container">Project Work</div>
  40. </div>
  41. <!-- Header -->
  42. <header class="header">
  43. <div class="container">
  44. <div class="row align-items-center">
  45. <div class="col d-flex">
  46. <!-- Logo "PW" dentro un cerchio, ora cliccabile -->
  47. <a href="./mappa_logout.html" class="logo-link">
  48. <div class="logo">PW</div>
  49. </a>
  50. <h1 class="header-title">Mappa</h1>
  51. </div>
  52. <div class="col-auto d-flex align-items-center">
  53. <a href="./ADMIN.html" class="text-white me-3 link-underline-hover">Gestione Dati Immobiliari</a>
  54. <a href="./TFO.html" class="text-white me-3 link-underline-hover">TFO</a>
  55. <a href="./buildings.html" class="text-white me-3 link-underline-hover">Registrazione degli Edifici</a>
  56. <a href="./mappa_login.html" class="btn btn-light">Logout</a>
  57. </div>
  58. </div>
  59. </div>
  60. </header>
  61. <main class="main-content">
  62. <div class="container">
  63. <!-- Barra di ricerca -->
  64. <div class="search-container">
  65. <div class="search-box">
  66. <input type="text"
  67. id="address"
  68. class="form-control"
  69. placeholder="Inserisci l'indirizzo"
  70. style="flex-grow: 1;">
  71. <button id="searchBtn" class="btn btn-primary">
  72. <i class="fas fa-search"></i> Cerca
  73. </button>
  74. </div>
  75. </div>
  76. <!-- Mappa -->
  77. <div id="map"></div>
  78. <!-- Dati geografici -->
  79. <div class="coordinate-box">
  80. <div class="row">
  81. <div class="col-md-4 mb-3">
  82. <label class="form-label">Latitudine:</label>
  83. <input type="number" id="latInput" class="form-control" readonly>
  84. </div>
  85. <div class="col-md-4 mb-3">
  86. <label class="form-label">Longitudine:</label>
  87. <input type="number" id="lngInput" class="form-control" readonly>
  88. </div>
  89. <div class="col-md-4 mb-3">
  90. <label class="form-label">Indirizzo:</label>
  91. <input type="text" id="addressInput" class="form-control" readonly>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </main>
  97. <!-- Footer -->
  98. <footer id="footer" class="it-footer bg-black" role="contentinfo">
  99. <!-- Contenuto footer mantenuto uguale -->
  100. </footer>
  101. <!-- Script -->
  102. <!-- Includi lo script di ElevenLabs -->
  103. <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
  104. <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
  105. <script>
  106. // Inizializzazione Mappa
  107. const map = L.map('map').setView([41.9028, 12.4964], 13);
  108. L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
  109. // Layer edifici colorati
  110. const edificiLayer = L.layerGroup().addTo(map);
  111. let currentMarker = null;
  112. // Funzione principale per caricare gli edifici
  113. async function caricaEdifici() {
  114. if (map.getZoom() >= 16) {
  115. const bounds = map.getBounds();
  116. const bbox = `${bounds.getSouthWest().lat},${bounds.getSouthWest().lng},${bounds.getNorthEast().lat},${bounds.getNorthEast().lng}`;
  117. const query = `[out:json];
  118. (
  119. way["building"](${bbox});
  120. relation["building"](${bbox});
  121. );
  122. out geom;
  123. out tags;`;
  124. try {
  125. const response = await fetch(`https://overpass-api.de/api/interpreter?data=${encodeURIComponent(query)}`);
  126. const data = await response.json();
  127. edificiLayer.clearLayers();
  128. data.elements.forEach(element => {
  129. if (element.type === 'way' && element.geometry) {
  130. const latlngs = element.geometry.map(coord => [coord.lat, coord.lon]);
  131. var statoEdificio = false;
  132. let colorePoligono ;
  133. if (statoEdificio) colorePoligono = 'yellow';
  134. else colorePoligono = 'green';
  135. // const colori = ['#FF0000', '#00FF00'];
  136. const polygon = L.polygon(latlngs, {
  137. fillColor: colorePoligono,
  138. color: colorePoligono,
  139. fillOpacity: 0.5
  140. }).addTo(edificiLayer);
  141. polygon.on('click', async function() {
  142. var buildingType = element.tags && element.tags.building ? element.tags.building : 'Sconosciuto';
  143. try {
  144. await getAddress(latlngs[0][0], latlngs[0][1]);
  145. var popupContent = `
  146. <b>Coordinate:</b> ${latlngs[0][0]}, ${latlngs[0][1]}<br>
  147. <b>Tipo edificio:</b> ${buildingType}<br>
  148. <b>Indirizzo:</b> ${document.getElementById('addressInput').value}<br>
  149. <b>Stato:</b> ${statoEdificio}<br>
  150. <b>Codice Catastale:</b> nessuno
  151. `;
  152. polygon.bindPopup(popupContent).openPopup();
  153. } catch (error) {
  154. console.error("Errore nel recupero dell'indirizzo:", error);
  155. var popupContent = `
  156. <b>Coordinate:</b> ${latlngs[0][0]}, ${latlngs[0][1]}<br>
  157. <b>Tipo edificio:</b> ${buildingType}<br>
  158. <b>Indirizzo:</b> Indirizzo non disponibile<br>
  159. <b>Stato:</b> ${statoEdificio}<br>
  160. <b>Codice Catastale:</b> nessuno
  161. `;
  162. polygon.bindPopup(popupContent).openPopup();
  163. }
  164. });
  165. }
  166. });
  167. } catch (error) {
  168. console.error("Errore nel caricamento edifici:", error);
  169. }
  170. } else {
  171. edificiLayer.clearLayers();
  172. }
  173. }
  174. async function getAddress(lat, lng) {
  175. console.log(typeof(lat));
  176. console.log(typeof(lng));
  177. try {
  178. const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}`);
  179. const data = await response.json();
  180. if (data.address) {
  181. document.getElementById('addressInput').value = data.display_name;
  182. } else {
  183. document.getElementById('addressInput').value = "Indirizzo non trovato";
  184. }
  185. } catch (error) {
  186. console.error("Errore nel geocoding inverso:", error);
  187. document.getElementById('addressInput').value = "Errore nel geocoding inverso";
  188. }
  189. }
  190. // Funzioni di gestione posizione
  191. async function updatePosition(lat, lng) {
  192. try {
  193. const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lng}`);
  194. const data = await response.json();
  195. document.getElementById('latInput').value = lat;
  196. document.getElementById('lngInput').value = lng;
  197. document.getElementById('addressInput').value = data.display_name || "Indirizzo non disponibile";
  198. if (currentMarker) map.removeLayer(currentMarker);
  199. currentMarker = L.marker([lat, lng]).addTo(map);
  200. } catch (error) {
  201. console.error("Errore di geocoding inverso:", error);
  202. }
  203. }
  204. // Ricerca indirizzo
  205. async function searchAddress() {
  206. const address = document.getElementById('address').value;
  207. if (!address) return;
  208. try {
  209. const response = await fetch(`https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(address)}`);
  210. const data = await response.json();
  211. if (data.length === 0) {
  212. alert("Indirizzo non trovato");
  213. return;
  214. }
  215. const { lat, lon: lng } = data[0];
  216. map.setView([lat, lng], 18);
  217. updatePosition(lat, lng);
  218. } catch (error) {
  219. console.error("Errore di ricerca:", error);
  220. }
  221. }
  222. // Event listeners
  223. document.getElementById('searchBtn').addEventListener('click', searchAddress);
  224. document.getElementById('address').addEventListener('keypress', (e) => {
  225. if (e.key === 'Enter') searchAddress();
  226. });
  227. map.on('click', (e) => {
  228. const { lat, lng } = e.latlng;
  229. updatePosition(lat, lng);
  230. });
  231. map.on('moveend', caricaEdifici);
  232. map.on('zoomend', caricaEdifici);
  233. caricaEdifici();
  234. </script>
  235. <script src="https://cdn.jsdelivr.net/npm/bootstrap-italia@2.8.1/dist/js/bootstrap-italia.bundle.min.js"></script>
  236. <!-- Includi lo script di ElevenLabs -->
  237. <script src="https://elevenlabs.io/convai-widget/index.js" async type="text/javascript"></script>
  238. <!-- Widget ElevenLabs ConvAI -->
  239. <div id="ai-widget-container" style="position: fixed; bottom: 20px; right: 20px;">
  240. <elevenlabs-convai agent-id="2MJWbkNuIGTHNI71hKfL"></elevenlabs-convai>
  241. </div>
  242. <footer id="footer" class="it-footer bg-black" role="contentinfo">
  243. <div class="it-footer-main py-3">
  244. <div class="container">
  245. <section class="py-4">
  246. <div class="row">
  247. <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
  248. <div class="link-list-wrapper">
  249. <h2 class="h5">Esplora SINFI</h2>
  250. <ul id="footer-menu-col-1" class="link-list">
  251. <li id="menu-item-sinfi-1" class="menu-item">
  252. <a class="list-item" href="https://sinfi.it/portal/sinfi-menu/che-cose/">Cos'è SINFI</a>
  253. </li>
  254. <li id="menu-item-sinfi-2" class="menu-item">
  255. <a class="list-item" href="https://sinfi.it/realms/master/protocol/openid-connect/auth?client_id=sinfi_user_service&response_type=code&redirect_uri=https://sinfi.it/sinfi_gateway/labs_keycloak/post_login/&scope=email&state=">Infrastrutture Registrate</a>
  256. </li>
  257. <li id="menu-item-sinfi-3" class="menu-item">
  258. <a class="list-item" href="https://sinfi.it/portal/sinfi-menu/riferimenti-normativi/">Normative di Riferimento</a>
  259. </li>
  260. <li id="menu-item-sinfi-4" class="menu-item">
  261. <a class="list-item" href="https://sinfi.it/realms/master/protocol/openid-connect/auth?client_id=sinfi_user_service&response_type=code&redirect_uri=https://sinfi.it/sinfi_gateway/labs_keycloak/post_login/&scope=email&state=">Open Data SINFI</a>
  262. </li>
  263. </ul>
  264. </div>
  265. </div>
  266. <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
  267. <div class="link-list-wrapper">
  268. <h2 class="h5">Aiuto e Supporto</h2>
  269. <ul id="footer-menu-col-2" class="link-list">
  270. <li id="menu-item-aiuto-1" class="menu-item">
  271. <a class="list-item" href="./instructions.html">Istruzioni</a>
  272. </li>
  273. <li id="menu-item-aiuto-2" class="menu-item">
  274. <a class="list-item" href="./faq.html">FAQ - Domande Frequenti</a>
  275. </li>
  276. <li id="menu-item-aiuto-3" class="menu-item">
  277. <a class="list-item" href="./techsup.html">Segnalazioni e Supporto Tecnico</a>
  278. </li>
  279. </ul>
  280. </div>
  281. </div>
  282. <!-- Colonna "Community" con i loghi dei social -->
  283. <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
  284. <div class="link-list-wrapper">
  285. <h2 class="h5">Community</h2>
  286. <div class="social-icons">
  287. <a href="https://www.linkedin.com" target="_blank" class="me-3"><i class="fab fa-linkedin"></i></a>
  288. <a href="https://www.youtube.com" target="_blank" class="me-3"><i class="fab fa-youtube"></i></a>
  289. <a href="https://www.facebook.com" target="_blank" class="me-3"><i class="fab fa-facebook"></i></a>
  290. <a href="https://www.instagram.com" target="_blank" class="me-3"><i class="fab fa-instagram"></i></a>
  291. </div>
  292. </div>
  293. </div>
  294. <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
  295. <div class="link-list-wrapper">
  296. <h2 class="h5">SINFI</h2>
  297. <ul id="footer-menu-col-4" class="link-list">
  298. <li id="menu-item-377" class="menu-item">
  299. <a target="_blank" href="https://sinfi.it/portal/">Vai al sito ufficiale SINFI</a>
  300. </li>
  301. </ul>
  302. </div>
  303. </div>
  304. </div>
  305. </section>
  306. </div>
  307. </div>
  308. <div class="it-footer-small-prints clearfix">
  309. <div class="container">
  310. <nav class="menu-footer-menu-ita-container" aria-label="link utili">
  311. <ul id="menu-footer-menu-ita" class="it-footer-small-prints-list list-inline mb-0 d-flex flex-column flex-md-row">
  312. <li id="menu-item-413" class="menu-item list-inline-item"><a href="/media-policy/">Media Policy</a></li>
  313. <li id="menu-item-453" class="menu-item list-inline-item"><a href="/note-legali/">Privacy Policy &amp; Note Legali</a></li>
  314. <li id="menu-item-1310" class="menu-item list-inline-item"><a target="_blank" href="https://form.agid.gov.it/view/9df3de50-7a42-11ef-8989-9dcab5eaa914">Dichiarazione di accessibilità</a></li>
  315. <li id="menu-item-411" class="menu-item list-inline-item"><a href="/mappa-del-sito/">Mappa del sito</a></li>
  316. <li id="menu-item-1277" class="menu-item list-inline-item"><a href="/open-data-spid/">Open Data SPID</a></li>
  317. </ul>
  318. </nav>
  319. </div>
  320. </div>
  321. </footer>
  322. </body>
  323. </html>