{"id":115,"date":"2011-10-19T11:20:41","date_gmt":"2011-10-19T09:20:41","guid":{"rendered":"http:\/\/www.atrioweb.com\/blog\/?p=115"},"modified":"2015-03-19T10:10:44","modified_gmt":"2015-03-19T09:10:44","slug":"geolocalizacion-con-html5","status":"publish","type":"post","link":"https:\/\/www.atrioweb.com\/blog\/html5\/geolocalizacion-con-html5","title":{"rendered":"Geolocalizaci\u00f3n con HTML5"},"content":{"rendered":"<p>El nuevo estandar HTML5 permite detectar la geolocalizaci\u00f3n del usuario de una p\u00e1gina o aplicaci\u00f3n web de forma extremadamente sencilla. Este hecho, unido a la acelerada expansi\u00f3n del uso de internet en los m\u00f3viles que se est\u00e1 produciendo en los \u00faltimos a\u00f1os, abre nuevas y excitantes posibilidades al desarrollo de p\u00e1ginas web. As\u00ed, con el uso de HTML5 es posible, con relativa facilidad, ofrecer al usuario informaci\u00f3n sobre productos, servicios, eventos, etc, de forma personalizada, en funci\u00f3n de su ubicaci\u00f3n f\u00edsica.<\/p>\n<p><!--more-->La detecci\u00f3n de la geolocalizaci\u00f3n del usuario se lleva a cabo en HTML5 gracias a una potente <a href=\"http:\/\/www.w3.org\/TR\/geolocation-API\/\" target=\"_blank\">API JavaScript<\/a> muy f\u00e1cil de usar. La utilizaci\u00f3n de esta API, combinada con el uso de Google Maps o Yahoo Maps, hace posible que los desarrolladores web puedan situar al usuario sobre un mapa y guiarle con precisi\u00f3n o simplemente mostrarle lugares cercanos que puedan ser de su inter\u00e9s.<\/p>\n<p>A continuaci\u00f3n voy a exponer un ejemplo pr\u00e1ctico de esta API que pone de manifiesto la sencillez de su uso.<\/p>\n<h3>Demostraci\u00f3n<\/h3>\n<ul>\n<li><a href=\"http:\/\/www.atrioweb.com\/blog\/demos\/geolocation-html5\" target=\"_blank\">Ver demostraci\u00f3n<\/a><\/li>\n<\/ul>\n<h3>C\u00f3digo<\/h3>\n<pre class=\"xhtml\">&lt;!DOCTYPE html&gt;\r\n&lt;html lang=\"es\"&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=ISO-8859-1 \/&gt;\r\n&lt;title&gt;Geolocalizaci\u00f3n con HTML5&lt;\/title&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;h1&gt;Geolocalizaci\u00f3n con HTML5&lt;\/h1&gt;\r\n\r\n&lt;script src=\"http:\/\/maps.google.com\/maps\/api\/js?sensor=false\" type=\"text\/javascript\"&gt;&lt;\/script&gt;\r\n\r\n&lt;script&gt;\r\nfunction success(position) {\r\n var status = document.querySelector('#status');\r\n status.innerHTML = \"\u00a1Le encontramos!\";\r\n\r\n var mapcanvas = document.createElement('div');\r\n mapcanvas.id = 'mapcanvas';\r\n mapcanvas.style.height = '400px';\r\n mapcanvas.style.width = '560px';\r\n\r\n document.querySelector('#map').appendChild(mapcanvas);\r\n\r\n var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\r\n var myOptions = {\r\n zoom: 15,\r\n center: latlng,\r\n mapTypeControl: false,\r\n navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},\r\n mapTypeId: google.maps.MapTypeId.ROADMAP\r\n };\r\n var map = new google.maps.Map(document.getElementById(\"mapcanvas\"), myOptions);\r\n\r\n var marker = new google.maps.Marker({\r\n position: latlng,\r\n map: map,\r\n title:\"Usted est\u00e1 aqu\u00ed.\"\r\n });\r\n}\r\n\r\nfunction error(msg) {\r\n var status = document.getElementById('status');\r\n status.innerHTML= \"Error [\" + error.code + \"]: \" + error.message; \r\n}\r\n\r\nif (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(success, error,{maximumAge:60000, timeout: 4000});\r\n} else {\r\n error('Su navegador no tiene soporte para su geolocalizaci\u00f3n');\r\n}\r\n\r\n&lt;\/script&gt;\r\n\r\n&lt;p id=\"status\"&gt;Buscando su localizaci\u00f3n...&lt;\/p&gt;\r\n&lt;div id=\"map\"&gt;&lt;\/div&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Resumiendo, el c\u00f3digo realiza el siguiente trabajo:<\/p>\n<ul>\n<li>Detectamos si el navegador soporta la geolocalizaci\u00f3n.<\/li>\n<li>Si la respuesta es s\u00ed, reclamaremos las coordenadas de posici\u00f3n del usuario.<\/li>\n<li>Una vez recibidas las coordenadas, mostramos un mapa Google con la posici\u00f3n del usuario<em>.<\/em><\/li>\n<\/ul>\n<h3>Llamada a la Geolocation API<\/h3>\n<p>Al final del c\u00f3digo javascript se sit\u00faa la llamada a la Geolocation API:<\/p>\n<pre class=\"javascript\">if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(success, error,{maximumAge:60000, timeout: 4000});\r\n} else {\r\n error('Su navegador no tiene soporte para su geolocalizaci\u00f3n');\r\n}<\/pre>\n<p>Este bucle condicional lo que hace es &#8216;preguntar&#8217; al navegador si soporta la Geolocation API. En caso afirmativo, se realiza la llamada a la funci\u00f3n <code>getCurrentPosition<\/code>, mediante la cual se intenta obtener de forma as\u00edncrona las coordenadas de posici\u00f3n del usuario. En caso contrario, se muestra una ventana de alerta en la que se advierte al usuario de que su navegador no soporta su geolocalizaci\u00f3n.<\/p>\n<p>En la funci\u00f3n <code>getCurrentPosition<\/code> se definen a su vez dos funciones (<code>success<\/code> y <code>error<\/code>), que veremos m\u00e1s adelante, y con las que se gestionar\u00e1 que es lo que se har\u00e1 en caso de que todo vaya bien y obtengamos las coordenadas de posici\u00f3n del usuario o bien cu\u00e1l ser\u00e1 el camino a seguir si este intento fracasa.<\/p>\n<p>En la funci\u00f3n <code>getCurrentPosition<\/code> incluimos adem\u00e1s dos par\u00e1metros:<\/p>\n<ul>\n<li><code>timeout<\/code>: Indicamos cu\u00e1l es el tiempo m\u00e1ximo de espera para obtener las coordenadas del usuario (en milisegundos). Establecemos un valor de 4 segundos.<\/li>\n<li><code>maximumAge<\/code>: Indica la m\u00e1xima antig\u00fcedad de la posici\u00f3n cacheada del usuario (en milisegundos). Si el valor no est\u00e1 definido o es cero significa que debemos obtener la posici\u00f3n actual. Establecemos un valor de 60 segundos.<\/li>\n<\/ul>\n<h3>Mapa Google centrado en la posici\u00f3n del usuario<\/h3>\n<p>En caso de que recibamos con \u00e9xito las coordenadas de posici\u00f3n del usuario (que nos son entregadas a trav\u00e9s del objeto <code>position<\/code>: <code>position.coords.longitude<\/code> y <code>position.coords.latitude<\/code>), pasamos a ejecutar la funci\u00f3n <code>success<\/code>. Esta funci\u00f3n lo que hace es informar al usuario de que efectivamente lo hemos geolocalizado y utizamos la <a href=\"http:\/\/code.google.com\/intl\/es\/apis\/maps\/documentation\/javascript\/basics.html\" target=\"_blank\">API de Googlemaps<\/a> para mostrar un mapa con su posici\u00f3n en el centro del mismo.<\/p>\n<pre class=\"javascript\">function success(position) {\r\n var status = document.querySelector('#status');\r\n status.innerHTML = \"\u00a1Le encontramos!\";\r\n\r\n var mapcanvas = document.createElement('div');\r\n mapcanvas.id = 'mapcanvas';\r\n mapcanvas.style.height = '400px';\r\n mapcanvas.style.width = '560px';\r\n\r\n document.getElementById('map').appendChild(mapcanvas);\r\n\r\n var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\r\n\r\n var myOptions = {\r\n zoom: 15,\r\n center: latlng,\r\n mapTypeControl: false,\r\n navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},\r\n mapTypeId: google.maps.MapTypeId.ROADMAP\r\n };\r\n\r\n var map = new google.maps.Map(document.getElementById(\"mapcanvas\"), myOptions);\r\n\r\n var marker = new google.maps.Marker({\r\n position: latlng,\r\n map: map,\r\n title:\"Usted est\u00e1 aqu\u00ed.\"\r\n });\r\n}<\/pre>\n<p>En las l\u00edneas 2 y 3 sustituimos el texto contenido en el html #status (&#8216;Buscando su localizaci\u00f3n&#8230;&#8217;) por &#8216;\u00a1Le encontramos!&#8217;.<\/p>\n<p>El resto de la funci\u00f3n es un ejemplo de uso sencillo de la API de Googlemaps:<\/p>\n<ul>\n<li>Entre las l\u00edneas 5 y 8 definimos un nuevo elemento html (<code>div#map<\/code>) que contendr\u00e1 el mapa Google que crearemos a continuaci\u00f3n, y concretamos las dimensiones que tendr\u00e1.<\/li>\n<li>En la l\u00ednea 10 incrustamos el <code>#map<\/code> dentro de un elemento html ya existente.<\/li>\n<li>En la l\u00ednea 12 definimos una variable con la latitud y longitud del usuario para utilizarlo posteriomente en nuestro mapa.<\/li>\n<li>Entre las l\u00edneas 14 y 20 introducimos nuevos par\u00e1metros para nuestro mapa Google: el nivel del zoom, su centro (las coordenadas del usuario), los controles y el tipo de mapa que se mostrar\u00e1.<\/li>\n<li>En la l\u00ednea 22 creamos, por fin, nuestro mapa (el objeto <code>google.maps.Map<\/code>), y definimos el objeto html en el que se situar\u00e1 junto con los par\u00e1metros del mismo establecidos anteriomente.<\/li>\n<li>Entre las l\u00edneas 24 y 29 creamos un nuevo marcador para nuestro mapa, en el que se muestra la posici\u00f3n del usuario.<\/li>\n<\/ul>\n<h3>Error<\/h3>\n<p>La funci\u00f3n error se limita a mostrar en el html <code>#status<\/code> el c\u00f3digo y mensaje de error recibidos en caso de que no se pueda obtener las coordenadas del usuario.<\/p>\n<pre>function error(msg) {\r\n var status = document.getElementById('status');\r\n status.innerHTML= \"Error [\" + error.code + \"]: \" + error.message; \r\n}<\/pre>\n<h3>Otras propiedades de getCurrentPosition()<\/h3>\n<p>Este sencillo ejemplo de uso de la API Geolocation expuesto aqu\u00ed admite desarrollos mucho m\u00e1s complejos. Para empezar se puede recabar m\u00e1s informaci\u00f3n acerca de la situaci\u00f3n del usuario, m\u00e1s all\u00e1 de sus coordenadas. El objeto <code>position<\/code> devuelto por <code>getCurrentPosition<\/code> puede contener otras propiedades, como la altitud o velocidad de desplazamiento del usuario. Sin embargo, hoy por hoy pocas veces se obtienen valores precisos al respecto.<\/p>\n<p>A continuaci\u00f3n se muestran las propiedades del objetito <code>Position<\/code> devuelto por la funci\u00f3n <code>getCurrentPosition<\/code>:<\/p>\n<table class=\"posiciones\" summary=\"Propiedades del objeto Position\" cellspacing=\"0\">\n<colgroup>\n<col width=\"50%\" \/>\n<col width=\"50%\" \/> <\/colgroup>\n<thead>\n<tr>\n<th scope=\"col\">Propiedad<\/th>\n<th scope=\"col\">Valor<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">coords.latitude<\/th>\n<td>Latitud, en grados decimales<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">coords.longitude<\/th>\n<td>Longitud, en grados decimales<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">coords.altitude<\/th>\n<td>Altitud, en metros<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">coords.accuracy<\/th>\n<td>Nivel de precisi\u00f3n de las coordenadas, en metros.<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">coords.altitudeAccuracy<\/th>\n<td>Nivel de precisi\u00f3n de la altitud, en metros.<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">coords.heading<\/th>\n<td>Direcci\u00f3n en la que se desplaza el aparato que proporciona las coordenadas, en grados (de 0\u00ba a 360\u00ba), comenzando desde el norte y contando en el sentido de las agujas del reloj.<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">coords.speed<\/th>\n<td>Velocidad de desplazamiento del aparato, en metros por segundo<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">timestamp<\/th>\n<td>Momento en que la posici\u00f3n fue adquirida, en formato timestamp.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>La funci\u00f3n watchPosition()<\/h3>\n<p>Para terminar, comentar que adem\u00e1s de la funci\u00f3n <code>getCurrentPosition<\/code> (que como hemos visto proporciona informaci\u00f3n sobre la situaci\u00f3n del usuario en un punto determinado del tiempo y el espacio), la API Geolocation especifica la funci\u00f3n <code>watchPosition<\/code>, que facilita informaci\u00f3n acerca del <em>movimiento<\/em> del usuario, es decir, podemos seguir al usuario y conocer sus cambios de posici\u00f3n.<\/p>\n<p>Por tanto, la funci\u00f3n <code>watchPosition<\/code> ser\u00e1 de gran utilidad en el caso de que el usuario utilize un dispositivo m\u00f3vil. Por otro lado, el uso de ambas funciones es muy similar.<\/p>\n<h3>Privacidad<\/h3>\n<p>Es importante destacar que el usuario debe dar su consentimiento antes de enviar sus cooordenadas de posici\u00f3n a cualquier medio que lo reclame. Esto se implementa de forma aut\u00f3m\u00e1tica por los navegadores que soportan la geolocalizaci\u00f3n: al cargar la p\u00e1gina, el navegador muestra una ventana de di\u00e1logo en el que se informa al usuario de que la web est\u00e1 reclamando su ubicaci\u00f3n f\u00edsica y se le da la opci\u00f3n de aceptar o denegar esta petici\u00f3n.<\/p>\n<h3>Conclusi\u00f3n<\/h3>\n<p>Resulta evidente que la extensi\u00f3n del uso de HTML5 y consiguiente posibilidad de geolocalizar al usuario van a revolucionar el ya ancho campo del desarrollo de p\u00e1ginas y aplicaciones web. Como hemos se\u00f1alado al principio de este art\u00edculo, la posibilidad de mostrar al usuario productos y lugares de su inter\u00e9s cercanos a su ubicaci\u00f3n f\u00edsica abre un nuevo horizonte comercial para fabricantes, comerciantes y cualquiera que tenga informaci\u00f3n de inter\u00e9s que ofrecer a los internautas.<\/p>\n<p>Es cierto que la geolocalizaci\u00f3n con HTML5 s\u00f3lo funciona en las nuevas generaciones de navegadores que han adoptado el nuevo est\u00e1ndar: Firefox 3.5+, Chrome, Opera, Safari, . Afortunadamente, la velocidad de actualizaci\u00f3n de los usuarios al uso de navegadores de \u00faltima generaci\u00f3n es cada d\u00eda mayor, por lo que est\u00e1 creciendo con gran rapidez el n\u00famero de potenciales usuarios de esta nueva tecnolog\u00eda.<br \/>\n<!--  \n\n\n<h3>Implementaci\u00f3n de la geolocalizaci\u00f3n del usuario en vistarural.com<\/h3>\n\n\n\nPor \u00faltimo, pod\u00e9is ver en el siguiente enlace un ejemplo concreto de desarrollo m\u00e1s complejo de Geolocalizaci\u00f3n mezclado con Google Maps que hemos utilizado en el portal de casas rurales Vista rural:\n\n\n<ul>\n\t\n\n<li><a href=\"http:\/\/www.vistarural.com\/mapagl.php?lang=es\" target=\"_blank\">http:\/\/www.vistarural.com\/mapagl.php?lang=es<\/a><\/li>\n\n\n<\/ul>\n\n\nEste portal de alojamientos rurales desarrollado por nuestra empresa ped\u00eda a gritos la implementaci\u00f3n del sistema de geolocalizaci\u00f3n. La web ya dispon\u00eda de un mapa Google en el que se mostraban las casas rurales geolocalizadas (<a href=\"http:\/\/www.vistarural.com\/mapa?lang=es\" target=\"_blank\">http:\/\/www.vistarural.com\/mapa?lang=es<\/a>) , pero sin tener en cuenta la ubicaci\u00f3n del usuario: el centro del mapa se situaba aproximadamente en Madrid. En el nuevo mapa se tiene en cuenta la geolocalizaci\u00f3n del usuario y se muestran las casa rurales cercanas a su ubicaci\u00f3n.\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El nuevo estandar HTML5 permite detectar la geolocalizaci\u00f3n del usuario de una p\u00e1gina o aplicaci\u00f3n web de forma extremadamente sencilla. Este hecho, unido a la acelerada expansi\u00f3n del uso de internet en los m\u00f3viles que se est\u00e1 produciendo en los &hellip; <a href=\"https:\/\/www.atrioweb.com\/blog\/html5\/geolocalizacion-con-html5\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-115","post","type-post","status-publish","format-standard","hentry","category-html5"],"_links":{"self":[{"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/posts\/115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/comments?post=115"}],"version-history":[{"count":34,"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/posts\/115\/revisions"}],"predecessor-version":[{"id":421,"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/posts\/115\/revisions\/421"}],"wp:attachment":[{"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/media?parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/categories?post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.atrioweb.com\/blog\/wp-json\/wp\/v2\/tags?post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}