2012-02-14 16 views
0

Stackoverフローで利用可能な解決策はたくさんありますが、基本的な質問には触れていません。 - 2500以上の緯度/経度データを持っています - それらをsqliteから取得する - ユーザーの入力に基づいて最も近い場所をクエリします。 最適なソリューションをお探しSQLiteからロケーションデータを格納して取得する

注:私は Finding the closest point to a given point

を経ていこれGeohashingは、すべて私のこの特定の問題

答えて

1

Geohashingは緯度のエンコーディングであるにGeohashingを使用することができますどのようにして、このような経度のペアは何ですか他のeaxhに近い点には、共通の接頭辞を持つジオハッシュがあります。しかし、これは惑星上のすべての座標、すなわち近所の点のために耳たぶが大きく変化する領域では機能しません。ハッシングアルゴリズムに応じて、赤道に近い領域はそのような領域であってもよい。 詳細はこちらをご覧ください。http://en.wikipedia.org/wiki/Geohash

500箇所私は0.1度のインターバル内の点を検索することにより、特定の参照点(ユーザの位置)に最も近い位置を非常に高速に見つけることができました。ここでクエリのコードは次のとおり

/** 
* Query the airfields table for airfields near the given position. 
* @param dbCon DB connection 
* @param ref_lat latitude 
* @param ref_lon longitude 
* @return Answer the airfield nearest to the given position as array 
*   of objects: id, designator, latitude, longitude. 
*   Answer <code>null</code> if their is no airfield near the 
*   given position plus or minus 0.1 degrees. 
*/ 
private Object[] rangeQuery(final SQLiteDatabase dbCon, final double ref_lat, final double ref_lon) { 
    if(DEBUG) 
     Log.d(TAG, "rangeQuery lat=" + ref_lat + ", lon=" + ref_lon); 
    final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
    qb.setTables(AirfieldsTable.TABLE_NAME); 
    final String[] whereArgs = new String[] { 
      Double.toString(ref_lat - 0.1d), Double.toString(ref_lat + 0.1d), 
      Double.toString(ref_lon - 0.1d), Double.toString(ref_lon + 0.1d) 
    }; 
    final Cursor crsr = qb.query(dbCon, allFields(), AirfieldsTable.RANGE_CLAUSE, whereArgs, null, null, null); 
    final Object[] val = this.scanForNearest(crsr, ref_lat, ref_lon); 
    crsr.close(); 
    if(DEBUG) 
     Log.d(TAG, "scanForNearest returned " + val); 
    return val; 
} 

選択される2つ以上の行がある場合、私は(scanForNearest()が行うものthats)直接残りの点を比較します。ロガー(ロギングアプリケーション)が着陸を検出した後、空港を見つけるのに十分速い。

+1

ありがとうStefanは、一般的な解決策と同じように0.1度です。私の必要性は、所在地の5つの最も近い場所です。私が尋ねようとしているのは実際には1です。sqliteで場所データを保存するのは良い方法です。与えられた点に最も近い5つの位置の質問。私は魂のpythogorous定理+エッジ要因で試したが、それは非常に2500のエントリのデータベースの中の5つの場所を照会するのが遅い – Shri

関連する問題