Query per get record basati su Radius in SQLite?

Ho questa query che funziona bene in MySQL

SELECT ((ACOS(SIN(12.345 * PI() / 180) * SIN(lat * PI() / 180) + COS(12.345 * PI() / 180) * COS(lat * PI() / 180) * COS((67.89 - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 * 1.609344) AS distance, poi.* FROM poi WHERE lang='eng' HAVING distance<='30' 

la distanza è in chilometri, l'input è lat=12.345 e lon=67.89

  • Android 2.2: Regolazione della luminosità dello schermo
  • Widget di visualizzazione dello schermo iniziale di Android non riuscito con EditText
  • Android include layout dynamicmente con la libreria di binding dei dati
  • Filtro per intenti di Android: associare l'applicazione con l'estensione di file
  • come posso incorporare ppt in webview per eseguire su android
  • resources.ap_ non esiste quando compila il mio progetto android
  • Il SQLite è 3 e non riesco a eseguire funzioni personalizzate con esso come su Android. Non ho anche acos () ecc … perché non fa parte del standard SQLite.

    Come sarebbe la query sopra in SQLite?

  • Eliminare tutto dopo una parte di una string
  • Come mostrare il count delle notifiche sull'icona della mia applicazione sulla schermata iniziale in Android
  • Impostazione del livello massimo di zoom nei google maps android api v2
  • Riutilizzare il codice del menu Opzioni
  • admob 6.2.1 exception nullpointer
  • Admob "Le seguenti classi non potrebbero essere istanzate: - com.google.ads.AdView" Versione di Android XML
  • 3 Solutions collect form web for “Query per get record basati su Radius in SQLite?”

    È ansible creare 4 nuove colonne, essendo peccato e cos di lat e lon . Poiché cos(a+b) = cos a cos b - sin a sin b SIN(12.345 * PI() / 180) , e altre apparenze di peccato e cos come SIN(12.345 * PI() / 180) possono essere calcolate nel programma prima di eseguire la query, distanza "si riduce a qualcosa del tipo P * SIN_LAT + Q * COS_LAT + ... che può essere gestito da SQLite3.

    BTW, vedi anche Sqlite su Android: Come creare una function sq dbd dist – da utilizzare nell'app per il calcolo della distanza utilizzando lat, long .

    Ecco una implementazione in Java per la creazione di una query basata su località su un dispositivo Android. L'idea viene da KennyTM (vedere risposta accettata) e implica l'aggiunta di 4 colonne nella tua tabella per memorizzare i valori di sinus e cosine di latitudine e longitudine.

    Ecco il codice che prepara i dati per una tabella "Shop" a tempo di inserimento:

     public static void injectLocationValues(ContentValues values, double latitude, double longitude) { values.put(LocationColumns.LATITUDE, latitude); values.put(LocationColumns.LONGITUDE, longitude); values.put(LocationColumns.COSLAT, Math.cos(MathUtil.deg2rad(latitude))); values.put(LocationColumns.SINLAT, Math.sin(MathUtil.deg2rad(latitude))); values.put(LocationColumns.COSLNG, Math.cos(MathUtil.deg2rad(longitude))); values.put(LocationColumns.SINLNG, Math.sin(MathUtil.deg2rad(longitude))); } public static double deg2rad(double deg) { return (deg * Math.PI / 180.0); } 

    È quindi ansible creare la proiezione utilizzando la seguente function:

     /** * Build query based on distance using spherical law of cosinus * * d = acos(sin(lat1).sin(lat2)+cos(lat1).cos(lat2).cos(long2−long1)).R * where R=6371 and latitudes and longitudes expressed in radians * * In Sqlite we do not have access to acos() sin() and lat() functions. * Knowing that cos(AB) = cos(A).cos(B) + sin(A).sin(B) * We can determine a distance stub as: * d = sin(lat1).sin(lat2)+cos(lat1).cos(lat2).(cos(long2).cos(long1)+sin(long2).sin(long1)) * * First comparison point being fixed, sin(lat1) cos(lat1) sin(long1) and cos(long1) * can be replaced by constants. * * Location aware table must therefore have the following columns to build the equation: * sinlat => sin(radians(lat)) * coslat => cos(radians(lat)) * coslng => cos(radians(lng)) * sinlng => sin(radians(lng)) * * Function will return a real between -1 and 1 which can be used to order the query. * Distance in km is after expressed from R.acos(result) * * @param latitude, latitude of search * @param longitude, longitude of search * @return selection query to compute the distance */ public static String buildDistanceQuery(double latitude, double longitude) { final double coslat = Math.cos(MathUtil.deg2rad(latitude)); final double sinlat = Math.sin(MathUtil.deg2rad(latitude)); final double coslng = Math.cos(MathUtil.deg2rad(longitude)); final double sinlng = Math.sin(MathUtil.deg2rad(longitude)); //@formatter:off return "(" + coslat + "*" + LocationColumns.COSLAT + "*(" + LocationColumns.COSLNG + "*" + coslng + "+" + LocationColumns.SINLNG + "*" + sinlng + ")+" + sinlat + "*" + LocationColumns.SINLAT + ")"; //@formatter:on } 

    Inietta una colonna di risposta con la distanza in cui è necessario applicare la formula seguente per convertire in chilometri:

     public static double convertPartialDistanceToKm(double result) { return Math.acos(result) * 6371; } 

    Se vuoi ordinare la tua richiesta utilizzando la distanza parziale, devi ordinare DESC e non ASC.

    Aveva lo stesso problema durante il lavoro su sqlite3 per ios, dopo aver giocato un po 'con la formula è un modo per farlo senza utilizzare la function dal lato sql (pseudo-codice):

    1. Pre-calcola questo valore per each elemento memorizzato nel database (e li memorizza):

       cos_lat = cos(lat * PI / 180) sin_lat = sin(lat * PI / 180) cos_lng = cos(lng * PI / 180) sin_lng = sin(lng * PI / 180) 
    2. Pre-calcola questo valore all'ora di ricerca (per una data cur_lat, cur_lng)

       CUR_cos_lat = cos(cur_lat * PI / 180) CUR_sin_lat = sin(cur_lat * PI / 180) CUR_cos_lng = cos(cur_lng * PI / 180) CUR_sin_lng = sin(cur_lng * PI / 180) cos_allowed_distance = cos(2.0 / 6371) # This is 2km 
    3. La tua query SQL sarà simile (sostituisci CUR_ * per i valori appena calcolati)

      SELECT * FROM posizione WHERE CUR_sin_lat * sin_lat + CUR_cos_lat * cos_lat * (cos_lng * CUR_cos_lng + sin_lng * CUR_sin_lng)> cos_allowed_distance;

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.