Autore Topic: localizzazione posizioni nel raggio di...  (Letto 1717 volte)

Offline giuseppe500

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
localizzazione posizioni nel raggio di...
« il: 18 Dicembre 2013, 00:49:16 CET »
0
ciao.
Devo fare una cosa del genere:
Caricare in un db delle posizioni(penso longitudine e latitudine , ma sono inesperto) e girando col mio android trovare le posizioni a me vicine nel raggio specificato in metri o km.
L'applicazione deve avere in pratica in un db le posizioni di dei negozi e devo calcolare sapendo la mia posizione quali negozi sono vicini a me nel raggio di un tot di km.
grazie.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:localizzazione posizioni nel raggio di...
« Risposta #1 il: 18 Dicembre 2013, 07:04:38 CET »
0
Trovare le posizioni in un database entro un raggio (cerchio) è abbastanza complesso.
Però quelle entro un rettangolo, che poi è come la schermata, è abbastanza banale. Può andato bene il rettangolo?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline giuseppe500

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
Re:localizzazione posizioni nel raggio di...
« Risposta #2 il: 18 Dicembre 2013, 09:14:23 CET »
0
si, si puo andare bene anche il rettangolo.
come si fa?
grazie.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:localizzazione posizioni nel raggio di...
« Risposta #3 il: 18 Dicembre 2013, 09:26:12 CET »
0
si, si puo andare bene anche il rettangolo.
come si fa?

Beh, supponi di avere una "tabella" di database con longitudine "lon" e latitudine "lat" dei vari punti in colonne distinte. Supponi di essere alle posizioni MYLON e MYLAT.

Quello che devi fare è fare una query di questo genere (scrivo un po' in pseudo-SQL), che ti ritorna tutti i punti interni ad un quadrato di lato 2*DELTA (a tua scelta) centrato nella tua posizione:
Codice: [Seleziona]
SELECT * FROM tabella
WHERE (MYLON<tabella.lon+DELTA) AND (MYLON>tabella.lon-DELTA) AND
             (MYLAT<tabella.lat+DELTA) AND (MYLAT>tabella.lat-DELTA)


NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline giuseppe500

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
Re:localizzazione posizioni nel raggio di...
« Risposta #4 il: 18 Dicembre 2013, 09:29:28 CET »
0
grazie

Offline drucks87

  • Utente junior
  • **
  • Post: 50
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Huawei ideos
  • Play Store ID:
    drucks team
  • Sistema operativo:
    Windows 7
Re:localizzazione posizioni nel raggio di...
« Risposta #5 il: 18 Dicembre 2013, 10:36:46 CET »
0
Codice (XML): [Seleziona]
public function getXXXXX($lat,$lon){
                $pi = 3.1415926535898;  
                $raggio_quadratico_medio = 6372.795477598;  
                $raggio_di_interesse = 4.0; //km  
 
                $result = mysql_query("SELECT ID,NAME,LATITUDINE,LONGITUDINE,
                                                                ($raggio_quadratico_medio*ACOS(
                                                                                        (SIN($pi * $lat / 180)*SIN($pi * LATITUDINE / 180)) +
                                                                                        (COS($pi * $lat / 180)*COS($pi * LATITUDINE / 180) * COS(ABS(($pi * $lon / 180) - ($pi * LONGITUDINE / 180))) )
                                                                                          )
                                                                ) as distanza
                                                                FROM tb_xxxxx
                                                                HAVING distanza<$raggio_di_interesse
                                                                ORDER BY distanza");
                               
                return $result;
        }

ciao

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:localizzazione posizioni nel raggio di...
« Risposta #6 il: 18 Dicembre 2013, 11:21:47 CET »
0
Magari mi sbaglio ed imparo una cosa nuova, ma (che io sappia) questa query non funzionerà mai in un database di un'app, perchè SQLite (che io sappia) non supporta funzioni trigonometriche.

Il codice che hai postato funziona su MySQL, ed a giudicare dai $ e del mysql_query proviene da codice PHP.

Codice (XML): [Seleziona]
public function getXXXXX($lat,$lon){
                $pi = 3.1415926535898;  
                $raggio_quadratico_medio = 6372.795477598;  
                $raggio_di_interesse = 4.0; //km  
 
                $result = mysql_query("SELECT ID,NAME,LATITUDINE,LONGITUDINE,
                                                                ($raggio_quadratico_medio*ACOS(
                                                                                        (SIN($pi * $lat / 180)*SIN($pi * LATITUDINE / 180)) +
                                                                                        (COS($pi * $lat / 180)*COS($pi * LATITUDINE / 180) * COS(ABS(($pi * $lon / 180) - ($pi * LONGITUDINE / 180))) )
                                                                                          )
                                                                ) as distanza
                                                                FROM tb_xxxxx
                                                                HAVING distanza<$raggio_di_interesse
                                                                ORDER BY distanza");
                               
                return $result;
        }

ciao


Se proprio si è pignoli e si vuole un risultato analogo al tuo, ma senza usare le funzioni trigonometriche assenti in SQLite, ci sono due modi, che accenno senza scendere nel dettaglio perchè secondo me lo sforzo non vale il risultato.

1) In fase di inserimento nel database precalcolare le quantità trigonometriche che serviranno (e che non sono calcolabili a run time dal DB), da memorizzare in altrettante colonne del DB, ed impostare la query secondo tale approccio.

2) Versione semplificata del precedente. Derogare leggermente sulla forma circolare accontentandosi di un ottagono, memorizzare nel DB due soli campi addizionali precalcolati (tralascio la teoria sulla geometria) ed usare una query molto semplice.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:localizzazione posizioni nel raggio di...
« Risposta #7 il: 18 Dicembre 2013, 11:36:56 CET »
0
Magari mi sbaglio ed imparo una cosa nuova, ma (che io sappia) questa query non funzionerà mai in un database di un'app, perchè SQLite (che io sappia) non supporta funzioni trigonometriche.

Il codice che hai postato funziona su MySQL, ed a giudicare dai $ e del mysql_query proviene da codice PHP.


Se proprio si è pignoli e si vuole un risultato analogo al tuo, ma senza usare le funzioni trigonometriche assenti in SQLite, ci sono due modi, che accenno senza scendere nel dettaglio perchè secondo me lo sforzo non vale il risultato.

1) In fase di inserimento nel database precalcolare le quantità trigonometriche che serviranno (e che non sono calcolabili a run time dal DB), da memorizzare in altrettante colonne del DB, ed impostare la query secondo tale approccio.

2) Versione semplificata del precedente. Derogare leggermente sulla forma circolare accontentandosi di un ottagono, memorizzare nel DB due soli campi addizionali precalcolati (tralascio la teoria sulla geometria) ed usare una query molto semplice.
LA funzionalita che vuoi fare so chiama identify, oppure buffer.

Inviato dal mio Nexus 7 con Tapatalk 4
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline drucks87

  • Utente junior
  • **
  • Post: 50
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Huawei ideos
  • Play Store ID:
    drucks team
  • Sistema operativo:
    Windows 7
Re:localizzazione posizioni nel raggio di...
« Risposta #8 il: 18 Dicembre 2013, 13:28:45 CET »
0
si, la query è su un db mysql remoto.

Offline giuseppe500

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
Re:localizzazione posizioni nel raggio di...
« Risposta #9 il: 06 Agosto 2016, 10:31:26 CEST »
0
ciao , mi potete spiegare come creare una query con l'ottagono , perchè penso sia piu veloce.
mi serve per scremare dei risultati prima di cercare la distanza piu precisa con google api.
grazie.