Autore Topic: Ordinare CursorAdapter in base alla distanza di due punti  (Letto 970 volte)

Offline gianpix

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Ordinare CursorAdapter in base alla distanza di due punti
« il: 16 Maggio 2013, 17:03:13 CEST »
0
Salve ragazzi, sto scrivendo un app che selezionata una città fa una query sul database e restituisce in una lista di PDI, fin qui tutto bene il problema mi si pone quando voglio che la visualizzazione sia ordinata rispetto alla distanza dalla posizione corrente GPS a quella del POI.

I dati sono salvati su un db sqlite locale, ho scritto una classe:

 public class CustomDateCursorAdapter extends CursorAdapter {
}

Per popolare un adapter mediante un Cursor (che ovviamente contiene il risultato della query)

              

Codice (Java): [Seleziona]
        CustomDateCursorAdapter adapter = new CustomDateCursorAdapter(
        MainActivity.this, cursor2);
        getListView().setAdapter(adapter);
               

Ora vorrei che i risultati dell'adapter fosser ordinati secondo la distanza....io come campo nel db ovviamente ho solo lat e long

Grazie in anticipo

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #1 il: 20 Maggio 2013, 11:33:33 CEST »
0
io butterei in un array il risultato di una sottrazione della long o latitudine a secondo della piu bassa tra quella del punto e la tua:
mia posizione (15,15)
punto 1(20,20)
punto 2(30,20)
punto 3(30,30)

punto 1 lat =20-15
punto 1 long =20-15
array distanza[0][0]= pos1
array distanza[0][1] =5
punto 2 lat =30-15
punto 2 long =20-15
array distanza[1][0]= pos2
array distanza[1][1] =5
punto 3 lat =30-15
punto 3 long =30-15
array distanza[2][0]= pos3
array distanza[2][1] =15

quindi in array avrai {{5,pos1},{5,pos2},{15,pos3}}
ora basta che ordini l'array in base hai risultati e dovrebbe essere fatto

Post unito: 20 Maggio 2013, 11:34:37 CEST
dimenticavo trasforma tutti i risultati in positivo

Offline gianpix

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #2 il: 21 Maggio 2013, 10:09:55 CEST »
0
La mia prima soluzione è stata riversare il cursore in un arraylist che poi dovrei ordinare con i compare ma non mi sembrava efficente visto che comuque l'operazione non è delle più leggere o comunque non è una cosa ottimizzata....una soluzione pulita secondo me sarebbe stata anche utilizzare una store procedure all'interno del sqlite che calcolasse la distanza ma a quanto ho letto la funzione richiama delle librerie C che non funzionano correttamente

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #3 il: 21 Maggio 2013, 11:07:43 CEST »
0
Io sono riuscito a fare una cosa del genere (ovvero fare una knn query) implementando quando descritto in questo post: http://stackoverflow.com/a/9536914/321354

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #4 il: 21 Maggio 2013, 11:30:25 CEST »
0
buttata li, e se tu facessi piu chiamate al db dando come condizione la latitudine  e longitudine tipo:
tue coordinate 15 , 15
for(int i=0;i<30;i++){
   lat=15+i;
   long=15+i;
   chiamata con where alla latitudine o longitudine
   butti in array
}

teoricamente dovrebbe uscirti gia ordinato con una massima distanza di 30 per coordinata

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #5 il: 21 Maggio 2013, 11:52:59 CEST »
0
buttata li, e se tu facessi piu chiamate al db dando come condizione la latitudine  e longitudine tipo:
tue coordinate 15 , 15
for(int i=0;i<30;i++){
   lat=15+i;
   long=15+i;
   chiamata con where alla latitudine o longitudine
   butti in array
}

teoricamente dovrebbe uscirti gia ordinato con una massima distanza di 30 per coordinata


Potresti spiegare la teoria dietro questa idea?

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #6 il: 21 Maggio 2013, 12:02:16 CEST »
0
in teoria al posto di estrarre tutto il db dai il lavoro a sql di scegliere per te ciò che ti serve e dovrebbe già dartelo ordinato e dovresti manipolare solo più i dati nel range che ti serve.
In teoria e molto più leggero cosi.
una cosa che ho notato ora, bisogna dare 4 condizioni di where perché andando a raggio latitudine e longitudine sono sia positivi che negativi.
P.s. : non voglio dire che cosi e la cosa migliore la mia era solo un idea che avrei provato se serviva a me

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #7 il: 21 Maggio 2013, 12:09:20 CEST »
0
Scusate ma cosa vi preoccupa esattamente del sort di java?

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:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #8 il: 21 Maggio 2013, 12:33:52 CEST »
0
in teoria al posto di estrarre tutto il db dai il lavoro a sql di scegliere per te ciò che ti serve e dovrebbe già dartelo ordinato e dovresti manipolare solo più i dati nel range che ti serve.
In teoria e molto più leggero cosi.
una cosa che ho notato ora, bisogna dare 4 condizioni di where perché andando a raggio latitudine e longitudine sono sia positivi che negativi.
P.s. : non voglio dire che cosi e la cosa migliore la mia era solo un idea che avrei provato se serviva a me

Forse la semplificazione che volevi proporre (ma che non è correttamente implementata daldal codice che hai postato, se è quello che ho capito) è sostituire la query basata sulla definizione standard di distanza (quella della geometria euclidea) usata nella soluzione postata da Ricky, con una query che restituisca i punti interni ad un quadrato centrato sulla tua posizione, quindi eventualmente ordinarli direttamente in java.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #9 il: 21 Maggio 2013, 13:21:59 CEST »
0
Si in pratica si, in effetti e sufficiente dare al where i due limiti ottenuti dalla sottrazione e la somma della distanza che si vuole avere e dare l'ordinamento di un dato,il problema che i dati a confronto sono due e per quello che avevo pensato ad un for per poter ciclare delle chiamate al db senza dover riordinare ulteriormente dopo i dati ottenuti

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #10 il: 21 Maggio 2013, 14:17:15 CEST »
0
Scusate ma cosa vi preoccupa esattamente del sort di java?

Molto probabilmente il fatto che tu devi prima di tutto caricare tutti i record del db in un ArrayList e poi ordinarlo.
Metti caso tu debba tirare fuori i 10 punti più vicini all'utente e hai 1000 record nel db, devi tirarli fuori tutti e 1000, ordinarli e successivamente prendere i primi 10.

Offline gianpix

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Ordinare CursorAdapter in base alla distanza di due punti
« Risposta #11 il: 21 Maggio 2013, 14:31:30 CEST »
0
Si in pratica si, in effetti e sufficiente dare al where i due limiti ottenuti dalla sottrazione e la somma della distanza che si vuole avere e dare l'ordinamento di un dato,il problema che i dati a confronto sono due e per quello che avevo pensato ad un for per poter ciclare delle chiamate al db senza dover riordinare ulteriormente dopo i dati ottenuti

Bhè ritorneremo al punto che il codice non sarebbe ottimizzato visto che le esecuzioni di query è un operazione abbastanza onerosa.....qundi fare tante query non è utile a sto punto veramente sarebbe meglio prendere tutto il course ottenuto e inserirlo in un arraylist (durante la fase di inserimento calcolare col location la distanza) e poi applicare un compare per ordinare l'array...

Con questa tecnica già mi funziona perfettamente, ma ero alla ricerca di qualcosa di ancora più ottimale