2010-12-10 4 views
5

Estoy trabajando en un script para obtener las Geolocaciones (Lat, lon) que puedo usar para centrar mi instancia de google maps. Por ahora trabajo con 2 tecnologías posibles. Uno es el objeto google.loader.ClientLocation. No he probado este todavía porque me devuelve nulo. Creo que porque no vivo en una ubicación regular (Willemstad, Curazao utilizando una conexión inalámbrica a Internet. Por lo tanto, mi módem es inalámbrico).Geolocalizaciones con Javascript

Por lo tanto, hice un plan de copia de seguridad usando navigator.geolocation. Esto funciona muy bien en Chrome, pero Firefox da un tiempo de espera y no funciona en absoluto en IE.

¿Alguien conoce un buen método alternativo para obtener la geolocalización de los usuarios? ¿Alguien tiene alguna recomendación sobre mi código sobre cómo puede ser más estable?

Establecí un tiempo de espera para navigator.geolocation porque no quiero que mis usuarios esperen más de 5 segundos. Aumentar el tiempo de espera no mejora la confiabilidad de Firefox.

function init_tracker_map() { 
var latitude; 
var longitude; 

if(google.loader.ClientLocation) { 
    latitude = (google.loader.ClientLocation.latitude); 
    longitude = (google.loader.ClientLocation.longitude); 
    buildMap(latitude, longitude); 
} 
else if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(
    function(position) { 
    latitude = (position.coords.latitude); 
    longitude = (position.coords.longitude); 
    buildMap(latitude, longitude); 
    }, 
    function errorCallback(error) { 
    useDefaultLatLon(); 
    }, 
    { 
    enableHighAccuracy:false, 
    maximumAge:Infinity, 
    timeout:5000 
    } 
); 
} 
else { 
    useDefaultLatLon(); 
} 
} 

function useDefaultLatLon() { 
latitude = (51.81540697949437); 
longitude = (5.72113037109375); 
buildMap(latitude, longitude); 
} 

ps. Soy consciente de que hay más preguntas como esta en SO, pero no pude encontrar una respuesta clara. Espero que la gente haya hecho nuevos descubrimientos.

Actualización: Probado google gears aswell. Succesfull en cromo de nuevo. Falla en FF e IE.

var geo = google.gears.factory.create('beta.geolocation'); 
if(geo) { 
    function updatePosition(position) { 
    alert('Current lat/lon is: ' + position.latitude + ',' + position.longitude); 
    } 

    function handleError(positionError) { 
    alert('Attempt to get location failed: ' + positionError.message); 
    } 
    geo.getCurrentPosition(updatePosition, handleError); 
} 

Actualización 2:navigator.geolocation funciona bien en FF de mi lugar de trabajo.

Resultado final

Esto funciona muy bien. Obtener una clave de API de ipinfodb.org

var Geolocation = new geolocate(false, true); 
Geolocation.checkcookie(function() { 
    alert('Visitor latitude code : ' + Geolocation.getField('Latitude')); 
    alert('Visitor Longitude code : ' + Geolocation.getField('Longitude')); 
}); 

function geolocate(timezone, cityPrecision) { 
    alert("Using IPInfoDB"); 
    var key = 'your api code'; 
    var api = (cityPrecision) ? "ip_query.php" : "ip_query_country.php"; 
    var domain = 'api.ipinfodb.com'; 
    var version = 'v2'; 
    var url = "http://" + domain + "/" + version + "/" + api + "?key=" + key + "&output=json" + ((timezone) ? "&timezone=true" : "&timezone=false") + "&callback=?"; 
    var geodata; 
    var JSON = JSON || {}; 
    var callback = function() { 
     alert("lol"); 
    } 

    // implement JSON.stringify serialization 
    JSON.stringify = JSON.stringify || function (obj) { 
     var t = typeof (obj); 
     if (t != "object" || obj === null) { 
      // simple data type 
      if (t == "string") obj = '"'+obj+'"'; 
      return String(obj); 
     } 
     else { 
      // recurse array or object 
      var n, v, json = [], arr = (obj && obj.constructor == Array); 
      for (n in obj) { 
       v = obj[n]; t = typeof(v); 
       if (t == "string") v = '"'+v+'"'; 
       else if (t == "object" && v !== null) v = JSON.stringify(v); 
       json.push((arr ? "" : '"' + n + '":') + String(v)); 
      } 
      return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); 
     } 
    }; 

    // implement JSON.parse de-serialization 
    JSON.parse = JSON.parse || function (str) { 
     if (str === "") str = '""'; 
     eval("var p=" + str + ";"); 
     return p; 
    }; 

    // Check if cookie already exist. If not, query IPInfoDB 
    this.checkcookie = function(callback) { 
     geolocationCookie = getCookie('geolocation'); 
     if (!geolocationCookie) { 
      getGeolocation(callback); 
     } 
     else { 
      geodata = JSON.parse(geolocationCookie); 
      callback(); 
     } 
    } 

    // Return a geolocation field 
    this.getField = function(field) { 
     try { 
      return geodata[field]; 
     } catch(err) {} 
    } 

    // Request to IPInfoDB 
    function getGeolocation(callback) { 
     try { 
      $.getJSON(url, 
        function(data){ 
       if (data['Status'] == 'OK') { 
        geodata = data; 
        JSONString = JSON.stringify(geodata); 
        setCookie('geolocation', JSONString, 365); 
        callback(); 
       } 
      }); 
     } catch(err) {} 
    } 

    // Set the cookie 
    function setCookie(c_name, value, expire) { 
     var exdate=new Date(); 
     exdate.setDate(exdate.getDate()+expire); 
     document.cookie = c_name+ "=" +escape(value) + ((expire==null) ? "" : ";expires="+exdate.toGMTString()); 
    } 

    // Get the cookie content 
    function getCookie(c_name) { 
     if (document.cookie.length > 0) { 
      c_start=document.cookie.indexOf(c_name + "="); 
      if (c_start != -1){ 
       c_start=c_start + c_name.length+1; 
       c_end=document.cookie.indexOf(";",c_start); 
       if (c_end == -1) { 
        c_end=document.cookie.length; 
       } 
       return unescape(document.cookie.substring(c_start,c_end)); 
      } 
     } 
     return ''; 
    } 
} 

Respuesta

1
+1

Gracias por el enlace. Algunas recomendaciones pueden ser útiles allí, pero están muy enfocadas en dispositivos móviles. –

+0

¿No es el código diseñado para ser portátil entre dispositivos móviles y web (especialmente aquellos bajo las especificaciones API de W3C)? Es comprensible que el GPS no exista, pero pensé que se suponía que debía regresar a algo seguro. – jocull

1

He tenido un problema similar y, para los navegadores sin geolocalización, fue con la ubicación del lado del servidor basado en IP del usuario.

Dos servicios de geolocalización libre distribución son:

He encontrado MaxMind para mí mucho más precisa.

Si es posible dentro de su proyecto, puede consultar la ubicación antes de representar la página o realizar una llamada ajax para consultar la ubicación.

+0

Sí, ambos métodos son posibles. Lo investigaré. –

+0

maxmind funcionó muy bien para mí! Gracias. hostip es inexacto de 5 a 10 millas, por lo que probablemente no pueda ser utilizado por nadie que necesite un radio razonable de precisión. – Omeed

2

geolocalización con javascript funcionará con navegadores compatibles con HTML 5, por lo que deja de IE completamente.

Su alternativa es utilizar la dirección IP para determinar la latitud/longitud aproximada.

Utilizando este método alternativo y suponiendo que encuentre un proveedor con una asignación de latitud/longitud a IP precisa y completa, solo obtendrá el lat/long del ISP (o el punto más cercano donde el ISP se conecta al Internet).

Espero que esto restablezca sus expectativas (sobre la precisión de la ubicación)