{"id":164050,"date":"2025-05-14T09:00:00","date_gmt":"2025-05-14T07:00:00","guid":{"rendered":"https:\/\/gtechgroup.it\/blog\/geolocation-api-localizzare-utenti-html5\/"},"modified":"2025-05-14T09:00:00","modified_gmt":"2025-05-14T07:00:00","slug":"geolocation-api-localizzare-utenti-html5","status":"publish","type":"post","link":"https:\/\/gtechgroup.it\/blog\/geolocation-api-localizzare-utenti-html5\/","title":{"rendered":"Geolocation API: Come Localizzare gli Utenti con HTML5"},"content":{"rendered":"<p style=\"text-align: justify;\">La <strong>Geolocation API<\/strong> \u00e8 una delle API web pi\u00f9 potenti introdotte con HTML5, permettendo alle applicazioni web di accedere alla posizione geografica dell&#8217;utente tramite il browser. Questa funzionalit\u00e0 apre scenari applicativi straordinari: dallo store locator che mostra i negozi pi\u00f9 vicini, alle app di consegna che tracciano la posizione in tempo reale, fino alle mappe interattive personalizzate. In questa guida analizzeremo come implementare la geolocalizzazione in modo corretto, rispettando la privacy degli utenti e gestendo tutti i casi limite.<\/p>\n<h2>Come Funziona la Geolocation API<\/h2>\n<p style=\"text-align: justify;\">La Geolocation API \u00e8 accessibile attraverso l&#8217;oggetto <strong>navigator.geolocation<\/strong>, disponibile nel browser. Il browser determina la posizione dell&#8217;utente combinando diverse fonti di dati, la cui disponibilit\u00e0 varia in base al dispositivo: <strong>GPS<\/strong> (la fonte pi\u00f9 precisa, disponibile su smartphone e tablet), <strong>Wi-Fi<\/strong> (triangolazione basata sulle reti wireless circostanti), <strong>celle telefoniche<\/strong> (per i dispositivi mobili) e <strong>indirizzo IP<\/strong> (la fonte meno precisa, usata come fallback).<\/p>\n<p style=\"text-align: justify;\">La precisione della posizione dipende dalla fonte utilizzata. Il GPS pu\u00f2 raggiungere una precisione di pochi metri, il Wi-Fi di circa 20-50 metri, le celle telefoniche di alcune centinaia di metri, mentre la geolocalizzazione basata su IP pu\u00f2 essere imprecisa di diversi chilometri. Il browser sceglie automaticamente la fonte pi\u00f9 accurata disponibile, ma \u00e8 possibile influenzare questa scelta tramite le opzioni della richiesta.<\/p>\n<p style=\"text-align: justify;\">Un requisito fondamentale \u00e8 che la Geolocation API funziona <strong>esclusivamente su connessioni HTTPS<\/strong>. Questa restrizione, introdotta progressivamente dai browser a partire dal 2016, garantisce che i dati di posizione dell&#8217;utente viaggino in modo crittografato. Su HTTP, la chiamata a navigator.geolocation restituisce undefined o genera un errore. L&#8217;unica eccezione \u00e8 localhost per lo sviluppo locale.<\/p>\n<h2>getCurrentPosition: Ottenere la Posizione Corrente<\/h2>\n<p style=\"text-align: justify;\">Il metodo principale della Geolocation API \u00e8 <strong>getCurrentPosition()<\/strong>, che richiede la posizione dell&#8217;utente una sola volta. Accetta tre parametri: una callback di successo (obbligatoria), una callback di errore (opzionale ma fortemente consigliata) e un oggetto di opzioni (opzionale).<\/p>\n<p style=\"text-align: justify;\">La <strong>callback di successo<\/strong> riceve un oggetto Position che contiene un oggetto coords con le informazioni sulla posizione. Le propriet\u00e0 principali di coords sono: <strong>latitude<\/strong> e <strong>longitude<\/strong> (sempre disponibili, espresse in gradi decimali), <strong>accuracy<\/strong> (precisione in metri), <strong>altitude<\/strong> (altitudine in metri, pu\u00f2 essere null), <strong>altitudeAccuracy<\/strong> (precisione dell&#8217;altitudine), <strong>heading<\/strong> (direzione di spostamento in gradi) e <strong>speed<\/strong> (velocit\u00e0 in metri al secondo). L&#8217;oggetto Position contiene anche una propriet\u00e0 <strong>timestamp<\/strong> con il momento della rilevazione.<\/p>\n<p style=\"text-align: justify;\">La <strong>callback di errore<\/strong> riceve un oggetto PositionError con una propriet\u00e0 code che indica il tipo di errore: <strong>1 (PERMISSION_DENIED)<\/strong> se l&#8217;utente ha negato il permesso, <strong>2 (POSITION_UNAVAILABLE)<\/strong> se la posizione non \u00e8 determinabile, e <strong>3 (TIMEOUT)<\/strong> se la richiesta ha superato il tempo massimo. \u00c8 essenziale gestire tutti e tre i casi per offrire un&#8217;esperienza utente robusta.<\/p>\n<p style=\"text-align: justify;\">L&#8217;oggetto <strong>opzioni<\/strong> permette di configurare tre parametri: <strong>enableHighAccuracy<\/strong> (booleano, richiede la massima precisione possibile, utilizzando il GPS se disponibile; aumenta il consumo di batteria), <strong>timeout<\/strong> (tempo massimo in millisecondi per ottenere la posizione) e <strong>maximumAge<\/strong> (et\u00e0 massima in millisecondi di una posizione memorizzata nella cache che \u00e8 accettabile restituire; 0 forza una nuova rilevazione).<\/p>\n<h2>watchPosition: Monitoraggio Continuo della Posizione<\/h2>\n<p style=\"text-align: justify;\">Il metodo <strong>watchPosition()<\/strong> funziona in modo simile a getCurrentPosition() ma, anzich\u00e9 restituire la posizione una sola volta, continua a monitorarla e chiama la callback di successo ogni volta che la posizione cambia significativamente. Questo metodo \u00e8 essenziale per applicazioni di navigazione, tracking in tempo reale e qualsiasi scenario che richieda aggiornamenti continui.<\/p>\n<p style=\"text-align: justify;\">watchPosition() restituisce un <strong>identificatore numerico<\/strong> (watch ID) che pu\u00f2 essere utilizzato successivamente per interrompere il monitoraggio tramite il metodo <strong>clearWatch(watchId)<\/strong>. \u00c8 fondamentale chiamare clearWatch quando il monitoraggio non \u00e8 pi\u00f9 necessario, per evitare un consumo eccessivo di batteria e risorse del dispositivo.<\/p>\n<p style=\"text-align: justify;\">La frequenza degli aggiornamenti dipende dal dispositivo e dalla fonte di dati utilizzata. Con il GPS attivo e enableHighAccuracy impostato su true, gli aggiornamenti possono essere molto frequenti (ogni secondo o meno). Con fonti meno precise come il Wi-Fi, gli aggiornamenti sono meno frequenti. L&#8217;applicazione deve essere progettata per gestire sia aggiornamenti rapidi che intervalli prolungati senza aggiornamenti.<\/p>\n<p style=\"text-align: justify;\">Un pattern comune prevede di mostrare un indicatore di caricamento durante la prima rilevazione e di aggiornare progressivamente la posizione sulla mappa. Per le applicazioni di navigazione, \u00e8 utile combinare watchPosition con la bussola del dispositivo (disponibile tramite la DeviceOrientation API) per mostrare la direzione in cui l&#8217;utente sta guardando.<\/p>\n<h2>Il Modello di Permessi e la Privacy<\/h2>\n<p style=\"text-align: justify;\">La Geolocation API \u00e8 una delle API web pi\u00f9 sensibili dal punto di vista della <strong>privacy<\/strong>, e i browser implementano un rigoroso modello di permessi per proteggere gli utenti. Quando un sito web richiede la posizione, il browser mostra un prompt all&#8217;utente chiedendo esplicitamente il consenso. L&#8217;utente pu\u00f2 concedere il permesso, negarlo o semplicemente ignorare la richiesta (che viene trattata come un rifiuto dopo il timeout).<\/p>\n<p style=\"text-align: justify;\">Il permesso \u00e8 vincolato all&#8217;origine (dominio) e viene memorizzato dal browser. L&#8217;utente pu\u00f2 revocare il permesso in qualsiasi momento attraverso le impostazioni del browser o cliccando sull&#8217;icona del lucchetto nella barra degli indirizzi. \u00c8 importante progettare l&#8217;applicazione in modo che funzioni anche senza geolocalizzazione, offrendo alternative come l&#8217;inserimento manuale dell&#8217;indirizzo.<\/p>\n<p style=\"text-align: justify;\">Dal punto di vista del <strong>GDPR<\/strong> e della normativa europea sulla privacy, i dati di geolocalizzazione sono considerati dati personali. Questo significa che, oltre al consenso del browser, potrebbe essere necessario un consenso esplicito nell&#8217;ambito dell&#8217;informativa sulla privacy del sito. \u00c8 consigliabile spiegare chiaramente all&#8217;utente perch\u00e9 la posizione viene richiesta e come verr\u00e0 utilizzata, prima di invocare getCurrentPosition().<\/p>\n<p style=\"text-align: justify;\">La <strong>Permissions API<\/strong> (navigator.permissions.query) permette di verificare lo stato del permesso di geolocalizzazione prima di effettuare la richiesta, consentendo di personalizzare l&#8217;interfaccia in base allo stato corrente (&#8220;granted&#8221;, &#8220;denied&#8221; o &#8220;prompt&#8221;). Questo approccio migliora l&#8217;esperienza utente evitando richieste di permesso inattese.<\/p>\n<h2>Casi d&#8217;Uso Pratici e Strategie di Fallback<\/h2>\n<p style=\"text-align: justify;\">Le applicazioni pratiche della Geolocation API sono molteplici e coprono settori diversi dello sviluppo web:<\/p>\n<ul>\n<li><strong>Store locator<\/strong>: mostrare i punti vendita pi\u00f9 vicini alla posizione dell&#8217;utente, con calcolo delle distanze e indicazioni stradali. \u00c8 il caso d&#8217;uso pi\u00f9 comune per le attivit\u00e0 commerciali con sedi fisiche<\/li>\n<li><strong>Personalizzazione dei contenuti<\/strong>: mostrare meteo locale, notizie della zona, eventi nelle vicinanze o promozioni geolocalizzate<\/li>\n<li><strong>App di consegna<\/strong>: tracking in tempo reale della posizione del corriere e del cliente, con aggiornamento dinamico dell&#8217;ETA<\/li>\n<li><strong>Check-in<\/strong>: verificare che l&#8217;utente si trovi effettivamente nel luogo dichiarato, utile per app di ristorazione, eventi o fitness<\/li>\n<li><strong>Compilazione automatica<\/strong>: pre-compilare campi di indirizzo nei moduli basandosi sulla posizione approssimativa dell&#8217;utente<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Le <strong>strategie di fallback<\/strong> sono essenziali per gestire i casi in cui la geolocalizzazione non \u00e8 disponibile o viene rifiutata dall&#8217;utente. Le opzioni includono: geocodifica basata sull&#8217;indirizzo IP (meno precisa ma non richiede consenso), campo di ricerca per indirizzo o CAP, selezione da una mappa, e utilizzo della posizione dell&#8217;ultima visita (se salvata con il consenso dell&#8217;utente in localStorage). Per approfondire come memorizzare dati nel browser, consulta la nostra guida su <a href=\"https:\/\/gtechgroup.it\/blog\/web-storage-localstorage-sessionstorage-html5\/\">localStorage e sessionStorage<\/a>.<\/p>\n<p style=\"text-align: justify;\">\u00c8 fondamentale fornire sempre un&#8217;alternativa funzionale quando la geolocalizzazione non \u00e8 disponibile. Un sito che si blocca o mostra solo un errore quando l&#8217;utente nega il permesso di posizione offre un&#8217;esperienza scadente e pu\u00f2 perdere visitatori e potenziali clienti.<\/p>\n<p style=\"text-align: justify;\">Hai bisogno di aiuto con l&#8217;implementazione della geolocalizzazione nel tuo sito web? <strong>G Tech Group<\/strong> offre servizi di sviluppo web professionale e consulenza tecnica. Contattaci a <strong>support@gtechgroup.it<\/strong> o via WhatsApp al <strong>0465 84 62 45<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La Geolocation API \u00e8 una delle API web pi\u00f9 potenti introdotte con HTML5, permettendo alle applicazioni web di accedere alla posizione geografica dell&#8217;utente tramite il&hellip;<\/p>\n","protected":false},"author":2,"featured_media":164230,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"1246","_seopress_titles_title":"Geolocation API: Come Localizzare gli Utenti con HTML5 %%sep%% %%sitename%%","_seopress_titles_desc":"Come utilizzare la Geolocation API di HTML5: getCurrentPosition, watchPosition, gestione permessi, privacy, HTTPS e casi d'uso pratici.","_seopress_robots_index":"","footnotes":""},"categories":[1246],"tags":[787],"class_list":["post-164050","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-html","tag-sviluppo-web"],"_links":{"self":[{"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/posts\/164050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/comments?post=164050"}],"version-history":[{"count":0,"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/posts\/164050\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/media\/164230"}],"wp:attachment":[{"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/media?parent=164050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/categories?post=164050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gtechgroup.it\/blog\/wp-json\/wp\/v2\/tags?post=164050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}