2013-05-15 21 views
14

Ciao Sto scrivendo un'app che mostra le stazioni di biciclette vicino a un indirizzo. Ho l'elenco delle posizioni di latitudine e longitudine di ogni stazione di biciclette da un servizio.Ricerca di posizioni più vicine utilizzando l'API di Google Maps

Posso contrassegnare la mia posizione corrente o qualsiasi indirizzo finora. Come faccio a mostrare tutte le stazioni bici vicino alla mia posizione sulla mappa. Per prima cosa, posso ottenere i luoghi Google più vicini dalla posizione corrente e accedere al database per localizzare la bicicletta e creare indicatori sulla mappa? Qual è l'approccio migliore?

risposta

3

Google potrebbe già avere these risultati, Ma se hai già le coordinate per i luoghi sembra che sia più semplice tracciare i tuoi punti.

+0

Grazie per la risposta. Sembra che ho bisogno di un'altra chiave API per google places. Sto già utilizzando la chiave di Android Maps per accedere a Maps api, questo è un po 'di confusione per me, devo leggere di più. – Geoplex

+0

Sì, hai ragione. Mentre Google può fornirti molti dati utili, se puoi utilizzare altre fonti attendibili (i tuoi dati, altri fornitori, ecc.), Basta usarli! Quindi non ti affidi a Google per gli aggiornamenti dei dati (che possono essere una lotta) e in molti casi non puoi comunque. – MrUpsidown

19

Se possiedi già le coordinate delle stazioni di biciclette e se ti fidi di questi dati, basta usarli per disegnare i tuoi indicatori. Ora devi definire cosa significa "vicino".

Avete diverse soluzioni per questo. O scegli di disegnare i marcatori per tutte le stazioni bici all'interno dei limiti della mappa (ma potrebbero essere molti indicatori da disegnare a seconda del livello di zoom, oppure devi impedire che lo script disegni i marcatori prima che venga raggiunto un determinato livello di zoom) oppure puoi disegnare i marker entro n chilometri intorno a una posizione (può essere la posizione dell'utente, le coordinate del centro della mappa, ecc.).

Per la seconda soluzione, e se si archiviano le vostre stazioni di biciclette in un database MySQL, si potrebbe fare una query del genere:

$sql = "SELECT *, (6371 * acos(cos(radians(" . $db->real_escape_string($lat) . ")) * cos(radians(lat)) * cos(radians(lng) - radians(" . $db->real_escape_string($lng) . ")) + sin(radians(" . $db->real_escape_string($lat) . ")) * sin(radians(lat)))) AS distance FROM your_table_name HAVING distance < 15"; 

$lat e $lng essere il centro coordina

lat e lng essendo i nomi delle colonne MySQL

15 come il raggio (in km) intorno alle coordinate

Questo utilizza la formula di Haversine. Una buona informazione può essere trovata here.

Spero che questo aiuti, ma non sappiamo davvero come hai organizzato i dati nella tua app. Dacci maggiori informazioni se hai bisogno di più aiuto su questo!

+0

Grazie per la query sql. Ho tutte le posizioni delle stazioni di biciclette e la loro latitudine e longitudine, tiro da un servizio e posso memorizzarlo in un tavolo sql. Vado a provare la tua soluzione. Visto da qualche parte che, puoi mettere tutto lat-long in un array e usare la formula di Haversine. Mi piacciono quasi 3000 record e non voglio caricare tutto ciò in un array e cercare quello più vicino. Penso che proverò la tua seconda soluzione e aggiornerò qui su cosa ha funzionato. Saluti. – Geoplex

+0

Se avessi i record 3K, userei questo approccio. Andrebbe bene Ho a che fare con oltre 150.000 di record e funziona perfettamente. Usa AJAX! E avrai una fantastica app! :-) – MrUpsidown

+0

Grazie mille. Mi ha aiutato molto – RY35

5

in caso qualcuno è alla ricerca di una risposta corretta nel 2016.

C'è un utilissimo library creato da Google, La biblioteca geometria ha molti metodo diverso, che potrebbe contribuire a risolvere questo problema:

computeDistanceBetween()

Questo answer spiega esattamente come usarlo.

Questo in genere calcola la distanza tra due oggetti LatLng passati.

Quindi si può semplicemente:

  • Ricevi tutte posizione stazioni di biciclette.
  • Memorizzarli in serie.
  • Trova la posizione corrente dell'utente.
  • In loop la matrice e convertire le posizioni a distanze utilizzando il metodo indicato.
  • Ordina la matrice per ottenere la distanza più piccola.

I risultati della distanza sono espressi in metri.

L'algoritmo precedente non può essere ottimizzato, perché alcuni di noi possono avere una serie di migliaia di coordinate, questo, dove il metodo containsLocation() diventa a portata di mano, come è possibile restringere la regione ricerca specificando un poligono puoi cercare all'interno.

Questo potrebbe non essere il metodo più ottimale per trovare la posizione più vicina, ma credo che farà il lavoro se si dispone di un numero ragionevole di stazioni nel database.

+0

Si dovrebbe anche pensare in termini di prestazioni e chiamate/quota API. Non penso che questa sia una risposta appropriata quando OP ha detto che ha a che fare con poche migliaia di posizioni, specialmente quando puoi fare tutto ciò con un'unica query di database. – MrUpsidown

+0

@MrUpsidown Spero che tu abbia letto bene la risposta prima di commentare :) – ProllyGeek

+0

Quale parte di esso? Entrambi i metodi richiedono una chiamata API per ogni punto. Ho sbagliato? – MrUpsidown

1

Ho lo stesso compito e ho risolto utilizzando la formula . Ecco il mio esempio in PHP

 private function distance($latA, $lngA,$latB, $lngB) { 
      $R = 6371000; 
      $radiansLAT_A = deg2rad($latA); 
      $radiansLAT_B = deg2rad($latB); 
      $variationLAT = deg2rad($latB - $latA); 
      $variationLNG = deg2rad($lngB - $lngA); 

      $a = sin($variationLAT/2) * sin($variationLAT/2) 
       + cos($radiansLAT_A) * cos($radiansLAT_B) * sin($variationLNG/2) * sin($variationLNG/2); 

      $c = 2 * atan2(sqrt($a), sqrt(1-$a)); 

      $d = $R * $c; 

      return $d; 
     } 

E per prova ho usato queste coordinate

  $distance = $this->distance(-12.0972,-77.0267,-13.160616,-74.227440); 

Il risultato dovrebbe essere 325932.546518 in metri. Se u vuole in km basta dividere 325932.546518/1000 = 325.932546518km

La stessa formula potrebbe essere tradotto a JavaScript seguendo la guida haversine

+0

Qual è la funzione di questi dati $ R = 6371000; ? È statico? –

+0

@DimasAdiAndrea $ R è il raggio della terra;) – roll

Problemi correlati