2012-08-08 33 views
5

In molti siti ho visto stampare la mia città corrente in cui sono (ad esempio "Hello to Berlin."). Come lo fanno? Che cosa è necessario per questo? Immagino che la parte principale sia qui javascript, ma di cosa ho bisogno per implementare qualcosa di simile alla mia app? (o c'è qualche gemma per Rails?)Come ottenere la geolocalizzazione dell'utente?

Inoltre, vorrei chiedere ancora una cosa - Sono interessante nella lista degli stati (di solito nella casella di selezione), dove l'utente seleziona il suo stato (diciamo la Germania), in base al valore dello stato sono in un'altra selezione visualizzate tutte le regioni in Germania e dopo aver scelto una regione vengono visualizzate le rispettive città nella regione selezionata.

È possibile ottenere ovunque questo enorme database di stati/città/regioni? Sarebbe interessante avere qualcosa di simile nella nostra app, ma non so, dove quegli elenchi ottengono ...

risposta

3

è necessario un browser che supporti le API di geolocalizzazione per ottenere la posizione di l'utente (tuttavia, è necessario il consenso dell'utente (un esempio here) per farlo (la maggior parte dei browser più recenti supporta tale funzionalità, inclusi IE9 + e la maggior parte dei browser mobili, incluso Windows Phone 7.5+).

tutto ciò che si ha a fare è quindi utilizzare JavaScript per ottenere la posizione:

if (window.navigator.geolocation) { 
    var failure, success; 
    success = function(position) { 
     console.log(position); 
    }; 
    failure = function(message) { 
     alert('Cannot retrieve location!'); 
    }; 
    navigator.geolocation.getCurrentPosition(success, failure, { 
     maximumAge: Infinity, 
     timeout: 5000 
    }); 
} 

L'oggetto position terrà latitudine e longitudine della posizione dell'utente (ma questo può essere molto imprecisa in zone meno densamente popolate su browser desktop, in quanto non hanno un dispositivo GPS integrato). Per spiegare meglio: qui a Lipsia otteniamo una precisione di circa 300 metri su un computer desktop - ottengo una precisione di circa 30 metri con il dispositivo GPS del mio cellulare.

È quindi possibile andare avanti e utilizzare le coordinate con lo Google Maps API (vedere here for reverse geocoding) per cercare la posizione dell'utente. C'è un few gems for Rails, se vuoi. Non ho mai sentito il bisogno di usarli, ma a qualcuno sembrano piacere.

Come per un elenco di paesi/città, abbiamo utilizzato i dati ottenibili da Geonames una volta in un progetto, ma prima dovevamo convertirlo per le nostre esigenze.

0

I fornitori di servizi Internet acquistano grandi blocchi di indirizzi IP, quindi quello che probabilmente vedrete è un backtrace del tuo IP a un ISP conosciuto. Hanno un database con gli ISP e la loro posizione nel mondo, in modo che possano provare a vedere da dove vieni. Potresti provare a utilizzare un sito come http://www.ipaddresslocation.org/ per fare il tuo lavoro. Se ti guardi intorno, è inevitabile che ci sia un sito che ti consente di inserire un indirizzo IP e ottenere una posizione, quindi basta inviare una richiesta POST a quel sito con l'IP del visitatore e raschiare la posizione dalla risposta.

In alternativa, è possibile provare a cercare un database ISP con posizione e quali blocchi dell'intervallo IP sono stati allocati. Probabilmente potresti trovarne uno per soldi, ma uno gratuito potrebbe essere più difficile da trovare. In alternativa, controlla questo database gratuito http://www.maxmind.com/app/geolite

1

Ho trovato che lo getCurrentPosition() è spesso inaccurato perché non spende molto tempo ad attendere il GPS per acquisire una buona precisione.Ho scritto un piccolo pezzo di JavaScript che simula lo getCurrentPosition() ma in realtà utilizza la posizione di osservazione e monitora i risultati che ritornano fino a quando non sono più precisi.

Ecco come appare:

navigator.geolocation.getAccurateCurrentPosition(onSuccess, onError, {desiredAccuracy:20, maxWait:15000}); 

Codice è qui - https://github.com/gwilson/getAccurateCurrentPosition

1

sintassi Correc sarebbe:

navigator.geolocation.getCurrentPosition(successCallBack, failureCallBack); 

Usa:

navigator.geolocation.getCurrentPosition(
     function(position){ 
      var latitude = position.coords.latitude; 
      var longitude = position.coords.longitude; 
      console.log("Latitude : "+latitude+" Longitude : "+longitude); 
     }, 
     function(){ 
      alert("Geo Location not supported"); 
     } 
    );   
0

Sono stato u canta geoip.maxmind.com da un po 'e funziona al 100%. Si può accedere tramite richieste HTTP.

0

Se si preferisce utilizzare ES6 e promette qui è un'altra versione

function getPositionPromised() { 
    function successCb(cb) { 
    return position => cb(position); 
    } 

    function errorCb(cb) { 
    return() => cb('Could not retrieve geolocation'); 
    } 

    return new Promise((resolve, reject) => { 
    if (window.navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(successCb(resolve), errorCb(reject)); 
    } else { 
     return reject('No geolocation support'); 
    } 
    }) 
} 

e si può usare in questo modo:

getPositionPromised() 
    .then(position => {/*do something with position*/}) 
    .catch(() => {/*something went wrong*/}) 
Problemi correlati