123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 |
- <!DOCTYPE html>
- <html lang="it">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Mappa con Bootstrap Italia e Overlay Edifici</title>
- <link href="https://cdn.jsdelivr.net/npm/bootstrap-italia@2.13.4/dist/css/bootstrap-italia.min.css" rel="stylesheet">
- <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css"/>
- <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
- <style>
- /* Stile per i label "Tipo Edificio" e "Data di Predisposizione" */
- label[for="buildingType"], label[for="preparationDate"] {
- font-weight: bold; /* Grassetto */
- font-family: inherit; /* Stesso font di "Codice Catastale Particella" */
- }
- /* Stile per i link con sottolineatura solo al passaggio del mouse */
- .link-underline-hover {
- text-decoration: none; /* Rimuove la sottolineatura di base */
- }
- .link-underline-hover:hover {
- text-decoration: underline; /* Aggiunge la sottolineatura solo al passaggio del mouse */
- }
- #buildingType {
- color: hsl(210, 17%, 44%); /* Colore del testo del select */
- }
- #buildingType option {
- color: hsl(210, 17%, 44%); /* Colore del testo delle opzioni */
- }
- #div-select {
- border-bottom: 1px solid hsl(210, 17%, 44%);
- margin-bottom: 5px;
- }
- /* Stile per la riga blu scuro */
- .top-bar {
- background-color: #004080; /* Blu scuro */
- color: white;
- padding: 0.5rem 0;
- text-align: left; /* Allineamento a sinistra */
- font-size: 0.9rem;
- }
- /* Stile per l'header */
- .header {
- background-color: #0066CC; /* Blu chiaro */
- color: white;
- padding: 1rem 0;
- }
- /* Stile per il logo "PW" dentro un cerchio */
- .logo {
- font-family: 'Georgia', serif; /* Font diverso */
- font-size: 1.5rem;
- font-weight: bold;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 50px; /* Diametro del cerchio */
- height: 50px; /* Diametro del cerchio */
- background-color: white; /* Colore di sfondo del cerchio */
- color: #0066CC; /* Colore del testo */
- border-radius: 50%; /* Rende l'elemento un cerchio */
- margin-right: 10px;
- }
- /* Stile per il titolo "Mappa" */
- .header-title {
- color: white;
- font-size: 1.5rem; /* Stessa grandezza di "Segnalazioni e Supporto Tecnico" */
- font-weight: bold;
- display: inline-block;
- vertical-align: middle;
- }
- .main-content {
- background-color: #f8f9fa; /* Grigio chiaro */
- padding: 2rem 0;
- }
- .table-responsive {
- overflow-x: auto;
- /* Aggiungi scroll orizzontale se la tabella è troppo larga */
- }
- .header, .footer {
- background-color: #0066CC; /* Blu istituzionale */
- color: white;
- padding: 1rem 0;
- }
- .main-content {
- background-color: #f8f9fa; /* Grigio chiaro */
- padding: 2rem 0;
- }
- #map {
- height: 500px;
- width: 100%;
- }
- #coordinate-inputs {
- margin-top: 10px;
- width: 50%;
- }
- </style>
- </head>
- <body>
- <!-- Riga blu scuro con scritto "Project Work" allineata a sinistra -->
- <div class="top-bar">
- <div class="container">
- Project Work
- </div>
- </div>
- <!-- Header -->
- <header class="header">
- <div class="container">
- <div class="row align-items-center">
- <div class="col d-flex">
- <!-- Logo "PW" dentro un cerchio, ora cliccabile -->
- <a href="./mappa_logout.html" class="logo-link">
- <div class="logo">PW</div>
- </a>
- <h1 class="header-title">Registrazione degli Edifici</h1>
- </div>
- <div class="col-auto d-flex align-items-center">
- <a href="./ADMIN.html" class="text-white me-3 link-underline-hover">Gestione Dati Immobiliari</a>
- <a href="./TFO.html" class="text-white me-3 link-underline-hover">TFO</a>
- <a href="./buildings.html" class="text-white me-3 link-underline-hover">Registrazione degli Edifici</a>
- <a href="./mappa_login.html" class="btn btn-light">Logout</a>
- </div>
- </div>
- </div>
- </header>
- <!-- Contenuto principale -->
- <div class="container mt-4">
- <h1 style="font-size: 1.5rem;">Registrazione degli edifici predisposti alla banda ultralarga</h1>
- <p>Compila il modulo sottostante per registrare un edificio predisposto alla banda ultralarga:</p>
- <form id="buildingForm">
- <div class="form-row">
- <div class="form-group col-md-6">
- <label for="address" style="font-weight: bold; color: black;">Indirizzo</label>
- <br>
- <br>
- <input type="text" class="form-control" id="address" placeholder="Via, n. civico, comune">
- </div>
- <div class="form-group col-md-6">
- <button type="button" class="btn btn-primary" id="search">Cerca</button>
- </div>
- </div>
- <div class="form-row">
- <div id="map"></div>
- </div>
- <div class="form-row">
- <div class="form-group col-md-3">
- <label for="latitude" style="font-weight: bold; color: black;">Latitudine</label>
- <br>
- <br>
- <input type="text" class="form-control" id="latitude" placeholder="Latitudine">
- </div>
- <div class="form-group col-md-3">
- <label for="latitude" style="font-weight: bold; color: black;">Longitudine</label>
- <br>
- <br>
- <input type="text" class="form-control" id="longitude" placeholder="Longitudine">
- </div>
- </div>
- <div class="form-row">
- <div class="form-group col-md-3">
- <label for="latitude" style="font-weight: bold; color: black;">Codice Comune</label>
- <br>
- <br>
- <input type="text" class="form-control" id="commonCode" placeholder="Codice comune" required>
- </div>
- </div>
- <div class="form-row">
- <div class="form-group col-md-3">
- <label for="latitude" style="font-weight: bold; color: black;">Codice Catastale Particella</label>
- <br>
- <br>
- <input type="text" class="form-control" id="cadastralCode" placeholder="Codice catastale" required>
- </div>
- </div>
- <label for="buildingType">Tipo Edificio</label>
- <br>
- <br>
- <div class="form-group col-md-3" id="div-select">
- <select class="form-control" id="buildingType">
- <option>Seleziona tipo di edificio</option>
- <option>Residenziale</option>
- <option>Commerciale</option>
- <option>Industriale</option>
- </select>
- </div>
- <br>
- <label for="preparationDate">Data di Predisposizione</label>
- <br>
- <br>
- <div class="form-group col-md-3">
- <input type="date" class="form-control" id="preparationDate" required>
- </div>
- <button type="button" class="btn btn-primary" id="add">Aggiungi</button>
- <button type="button" class="btn btn-secondary" id="cancellaRiga">Annulla</button>
-
- </form>
- <div class="data-table d-flex flex-column">
- <table class="table mt-4">
- <thead>
- <tr>
- <th>Indirizzo</th>
- <th>Latitudine</th>
- <th>Longitudine</th>
- <th>Comune</th>
- <th>Codice Catastale</th>
- <th>Tipo Edificio</th>
- <th>Data Predisposizione</th>
- <th>Azione</th>
- </tr>
- </thead>
- <tbody id="buildingTableBody">
- </tbody>
- </table>
- </div>
- <div class="d-flex justify-content-end mt-3">
- <button type="button" class="btn btn-success" id="submitButton">Invia</button>
- </div>
- </div>
- <!-- Script per la mappa e funzionalità -->
- <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js"></script>
- <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
- <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
- <script>
- // Inizializzazione Mappa
- const map = L.map('map').setView([41.9028, 12.4964], 13);
- L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
- // Layer edifici colorati
- const edificiLayer = L.layerGroup().addTo(map);
- let currentMarker = null;
- // Funzione principale per caricare gli edifici
- async function caricaEdifici() {
- if (map.getZoom() >= 16) {
- const bounds = map.getBounds();
- const bbox = `${bounds.getSouthWest().lat},${bounds.getSouthWest().lng},${bounds.getNorthEast().lat},${bounds.getNorthEast().lng}`;
-
- const query = `[out:json];
- (
- way["building"](${bbox});
- relation["building"](${bbox});
- );
- out geom;
- out tags;`;
- try {
- const response = await fetch(`https://overpass-api.de/api/interpreter?data=${encodeURIComponent(query)}`);
- const data = await response.json();
- edificiLayer.clearLayers();
-
- data.elements.forEach(element => {
- if (element.type === 'way' && element.geometry) {
- const latlngs = element.geometry.map(coord => [coord.lat, coord.lon]);
- var statoEdificio = false;
- let colorePoligono ;
- if (statoEdificio) colorePoligono = 'yellow';
- else colorePoligono = 'green';
-
- // const colori = ['#FF0000', '#00FF00'];
- const polygon = L.polygon(latlngs, {
- fillColor: colorePoligono,
- color: colorePoligono,
- fillOpacity: 0.5
- }).addTo(edificiLayer);
- polygon.on('click', async function() {
- var buildingType = element.tags && element.tags.building ? element.tags.building : 'Sconosciuto';
- try {
- await getAddress(latlngs[0][0], latlngs[0][1]);
- var popupContent = `
- <b>Coordinate:</b> ${latlngs[0][0]}, ${latlngs[0][1]}<br>
- <b>Tipo edificio:</b> ${buildingType}<br>
- <b>Indirizzo:</b> ${document.getElementById('addressInput').value}<br>
- <b>Stato:</b> ${statoEdificio}<br>
- <b>Codice Catastale:</b> nessuno
- `;
- polygon.bindPopup(popupContent).openPopup();
- } catch (error) {
- console.error("Errore nel recupero dell'indirizzo:", error);
- var popupContent = `
- <b>Coordinate:</b> ${latlngs[0][0]}, ${latlngs[0][1]}<br>
- <b>Tipo edificio:</b> ${buildingType}<br>
- <b>Indirizzo:</b> Indirizzo non disponibile<br>
- <b>Stato:</b> ${statoEdificio}<br>
- <b>Codice Catastale:</b> nessuno
- `;
- polygon.bindPopup(popupContent).openPopup();
- }
- });
- }
- });
- } catch (error) {
- console.error("Errore nel caricamento edifici:", error);
- }
- } else {
- edificiLayer.clearLayers();
- }
- }
- // Carica gli edifici quando la mappa viene spostata o zoomata
- map.on('moveend', caricaEdifici);
- map.on('zoomend', caricaEdifici);
- // Carica gli edifici all'avvio
- caricaEdifici();
- // Listener per il click sulla mappa
- map.on('click', function(e) {
- const lat = e.latlng.lat; // Latitudine del punto cliccato
- const lng = e.latlng.lng; // Longitudine del punto cliccato
- // Aggiorna i campi del form
- document.getElementById('latitude').value = lat;
- document.getElementById('longitude').value = lng;
- // Ottieni l'indirizzo dalle coordinate
- getAddress(lat, lng);
- // Rimuovi il marker precedente (se esiste)
- if (currentMarker) {
- map.removeLayer(currentMarker);
- }
- // Aggiungi un nuovo marker sulla mappa
- currentMarker = L.marker([lat, lng]).addTo(map)
- .bindPopup(`Coordinate: ${lat}, ${lng}`)
- .openPopup();
- });
- // Funzione per ottenere l'indirizzo dalle coordinate
- async function getAddress(lat, lng) {
- try {
- const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}`);
- const data = await response.json();
- if (data.address) {
- document.getElementById('address').value = data.display_name;
- } else {
- document.getElementById('address').value = "Indirizzo non trovato";
- }
- } catch (error) {
- console.error("Errore nel geocoding inverso:", error);
- document.getElementById('address').value = "Errore nel geocoding inverso";
- }
- }
- // Funzione per ottenere l'indirizzo dalle coordinate
- async function getAddress(lat, lng) {
- try {
- const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}`);
- const data = await response.json();
- if (data.address) {
- document.getElementById('address').value = data.display_name;
- } else {
- document.getElementById('address').value = "Indirizzo non trovato";
- }
- } catch (error) {
- console.error("Errore nel geocoding inverso:", error);
- document.getElementById('address').value = "Errore nel geocoding inverso";
- }
- }
- // Variabile per memorizzare il marker corrente
- var marker;
- // Gestione della ricerca dell'indirizzo
- document.getElementById('search').addEventListener('click', function() {
- var address = document.getElementById('address').value;
- if (address) {
- // Effettua una richiesta all'API di Nominatim per geocodificare l'indirizzo
- fetch(`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(address)}&format=json`)
- .then(response => response.json())
- .then(data => {
- if (data && data.length > 0) {
- var lat = parseFloat(data[0].lat); // Latitudine
- var lon = parseFloat(data[0].lon); // Longitudine
- // Rimuovi il marker precedente (se esiste)
- if (marker) {
- map.removeLayer(marker);
- }
- // Aggiungi un nuovo marker sulla mappa
- marker = L.marker([lat, lon]).addTo(map)
- .bindPopup(`Indirizzo: ${data[0].display_name}`)
- .openPopup();
- // Centra la mappa sulla nuova posizione
- map.setView([lat, lon], 16);
- // Riempie i campi di input per latitudine e longitudine
- document.getElementById('latitude').value = lat;
- document.getElementById('longitude').value = lon;
- } else {
- alert('Indirizzo non trovato.');
- }
- })
- .catch(error => {
- console.error('Errore durante la geocodifica:', error);
- alert('Si è verificato un errore durante la ricerca dell\'indirizzo.');
- });
- } else {
- alert('Inserisci un indirizzo.');
- }
- });
- // Funzione per aggiungere una riga alla tabella con controllo dei campi
- function aggiungiRiga() {
- // Recupera i valori dai campi di input
- const indirizzo = document.getElementById("address").value.trim();
- const latitudine = document.getElementById("latitude").value.trim();
- const longitudine = document.getElementById("longitude").value.trim();
- const codiceComune = document.getElementById("commonCode").value.trim();
- const codiceCatastale = document.getElementById("cadastralCode").value.trim();
- const tipodiedificio = document.getElementById("buildingType").value.trim();
- const datadipredisposizione = document.getElementById("preparationDate").value.trim();
-
- // Controllo se tutti i campi sono compilati
- if (!indirizzo || !latitudine || !longitudine || !codiceComune ||
- !codiceCatastale || !tipodiedificio || !datadipredisposizione) {
- alert("Compila tutti i campi prima di aggiungere l'edificio!");
- return; // Blocca l'inserimento
- }
-
- // Crea una nuova riga nella tabella
- const tabella = document.querySelector("#buildingTableBody");
- const nuovaRiga = tabella.insertRow();
-
- // Crea le celle della riga e inserisci i valori
- const celle = [];
- for (let i = 0; i < 7; i++) {
- celle.push(nuovaRiga.insertCell());
- }
-
- celle[0].textContent = indirizzo;
- celle[1].textContent = latitudine;
- celle[2].textContent = longitudine;
- celle[3].textContent = codiceComune;
- celle[4].textContent = codiceCatastale;
- celle[5].textContent = tipodiedificio;
- celle[6].textContent = datadipredisposizione;
-
- // Aggiungi i pulsanti di modifica e cancellazione
- const azioniCell = nuovaRiga.insertCell();
- azioniCell.innerHTML = `
- <button class="btn btn-sm btn-primary" onclick="modificaRiga(this)"><i class="fas fa-edit"></i></button>
- <button class="btn btn-sm btn-danger" onclick="cancellaRiga(this)"><i class="fas fa-trash"></i></button>
- `;
-
- // Resetta i campi del form dopo l'inserimento
- document.getElementById("buildingForm").reset();
- }
- // Collega la funzione aggiungiRiga() al pulsante "Aggiungi"
- document.getElementById('add').addEventListener('click', function() {
- aggiungiRiga();
- });
- // Funzione per modificare una riga
- function modificaRiga(button) {
- const riga = button.parentNode.parentNode;
- const celle = riga.cells;
- // Popola i campi del form con i dati della riga
- document.getElementById("address").value = celle[0].textContent;
- document.getElementById("latitude").value = celle[1].textContent;
- document.getElementById("longitude").value = celle[2].textContent;
- document.getElementById("commonCode").value = celle[3].textContent;
- document.getElementById("cadastralCode").value = celle[4].textContent;
- document.getElementById("buildingType").value = celle[5].textContent;
- document.getElementById("preparationDate").value = celle[6].textContent;
- // Rimuovi la riga dalla tabella
- riga.remove();
- }
- // Funzione per cancellare una riga con conferma
- function cancellaRiga(button) {
- // Mostra un alert di conferma
- const isConfirmed = confirm("Sei sicuro di voler eliminare questa riga?");
-
- // Se l'utente conferma, elimina la riga
- if (isConfirmed) {
- const riga = button.parentNode.parentNode;
- riga.remove();
- }
- }
- // Gestione dell'invio dei dati
- document.getElementById('submitButton').addEventListener('click', function() {
- alert('Dati inviati!');
- });
- // Funzione per cancellare tutti i campi del modulo
- function resetForm() {
- document.getElementById("buildingForm").reset();
- }
-
- // Aggiungi evento al pulsante "Annulla"
- document.getElementById('cancellaRiga').addEventListener('click', function() {
- resetForm();
- });
- </script>
- <script src="https://elevenlabs.io/convai-widget/index.js" async type="text/javascript"></script>
- <div id="ai-widget-container" style="position: fixed; bottom: 20px; right: 20px;">
- <elevenlabs-convai agent-id="2MJWbkNuIGTHNI71hKfL"></elevenlabs-convai>
- </div>
- <!-- Footer -->
- <footer id="footer" class="it-footer bg-black mt-5" role="contentinfo"></footer>
- <footer id="footer" class="it-footer bg-black" role="contentinfo">
- <div class="it-footer-main py-3">
- <div class="container">
- <section class="py-4">
- <div class="row">
- <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
- <div class="link-list-wrapper">
- <h2 class="h5">Esplora SINFI</h2>
- <ul id="footer-menu-col-1" class="link-list">
- <li id="menu-item-sinfi-1" class="menu-item">
- <a class="list-item" href="https://sinfi.it/portal/sinfi-menu/che-cose/">Cos'è SINFI</a>
- </li>
- <li id="menu-item-sinfi-2" class="menu-item">
- <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>
- </li>
- <li id="menu-item-sinfi-3" class="menu-item">
- <a class="list-item" href="https://sinfi.it/portal/sinfi-menu/riferimenti-normativi/">Normative di Riferimento</a>
- </li>
- <li id="menu-item-sinfi-4" class="menu-item">
- <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>
- </li>
- </ul>
- </div>
- </div>
- <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
- <div class="link-list-wrapper">
- <h2 class="h5">Aiuto e Supporto</h2>
- <ul id="footer-menu-col-2" class="link-list">
- <li id="menu-item-aiuto-1" class="menu-item">
- <a class="list-item" href="./instructions.html">Istruzioni</a>
- </li>
- <li id="menu-item-aiuto-2" class="menu-item">
- <a class="list-item" href="./faq.html">FAQ - Domande Frequenti</a>
- </li>
- <li id="menu-item-aiuto-3" class="menu-item">
- <a class="list-item" href="./techsup.html">Segnalazioni e Supporto Tecnico</a>
- </li>
- </ul>
- </div>
- </div>
- <!-- Colonna "Community" con i loghi dei social -->
- <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
- <div class="link-list-wrapper">
- <h2 class="h5">Community</h2>
- <div class="social-icons">
- <a href="https://www.linkedin.com" target="_blank" class="me-3"><i class="fab fa-linkedin"></i></a>
- <a href="https://www.youtube.com" target="_blank" class="me-3"><i class="fab fa-youtube"></i></a>
- <a href="https://www.facebook.com" target="_blank" class="me-3"><i class="fab fa-facebook"></i></a>
- <a href="https://www.instagram.com" target="_blank" class="me-3"><i class="fab fa-instagram"></i></a>
- </div>
- </div>
- </div>
- <div class="col-lg-3 col-md-3 col-sm-6 pb-2">
- <div class="link-list-wrapper">
- <h2 class="h5">SINFI</h2>
- <ul id="footer-menu-col-4" class="link-list">
- <li id="menu-item-377" class="menu-item">
- <a target="_blank" href="https://sinfi.it/portal/">Vai al sito ufficiale SINFI</a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </section>
- </div>
- </div>
- <div class="it-footer-small-prints clearfix">
- <div class="container">
- <nav class="menu-footer-menu-ita-container" aria-label="link utili">
- <ul id="menu-footer-menu-ita" class="it-footer-small-prints-list list-inline mb-0 d-flex flex-column flex-md-row">
- <li id="menu-item-413" class="menu-item list-inline-item"><a href="/media-policy/">Media Policy</a></li>
- <li id="menu-item-453" class="menu-item list-inline-item"><a href="/note-legali/">Privacy Policy & Note Legali</a></li>
- <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>
- <li id="menu-item-411" class="menu-item list-inline-item"><a href="/mappa-del-sito/">Mappa del sito</a></li>
- <li id="menu-item-1277" class="menu-item list-inline-item"><a href="/open-data-spid/">Open Data SPID</a></li>
- </ul>
- </nav>
- </div>
- </div>
- </footer>
- </body>
- </html>
|