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 '';
}
}
Gracias por el enlace. Algunas recomendaciones pueden ser útiles allí, pero están muy enfocadas en dispositivos móviles. –
¿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