2010-07-01 116 views
1

在我的iPhone應用程序,我有一個美國緯度和經度的sqlite表(All weather stations of USA)。什麼是sqlite查詢來檢查給定的緯度和經度是在一組緯度/經度在sqlite?我的意思是我把紐約的緯度/經度設置爲(42.75,73.80),(37,-122),但是我在紐約附近搜索一個經緯度,就像(42.10,73.20)檢查給定的經度和緯度是否在一組緯度和經度在sqlite

如何找到這個(42.10,73.20)是否在紐約附近? SQLite中(Eg.ACOS)

  • 解答mtoepper

自定義功能

//Include this code in your project 
static void ACOSFunc(sqlite3_context *context, int argc, sqlite3_value **argv) 
{ 
    assert(argc == 1); 
    if (sqlite3_value_type(argv[0]) == SQLITE_NULL) { 
     sqlite3_result_null(context); 
     return; 
    } 
    double input = sqlite3_value_double(argv[0]); 
    sqlite3_result_double(context, acos(input) ); 
} 

和創建數據庫連接後添加此。

sqlite3_create_function(db.sqliteHandle, "ACOS", 1, SQLITE_UTF8, NULL, &ACOSFunc, NULL, NULL); 

回答

4

我沒有使用過這之前,但嘗試以下查詢:

SELECT ID,(3959 * ACOS(COS(弧度(37))* COS(弧度(LAT))* COS(弧度(LNG) - 弧度(-122))+ sin(弧度(37))* sin(弧度(lat))))AS距離 距標記距離< 25 ORDER BY距離LIMIT 0,20;

此查詢在SQL中正常工作,所以試試這個..希望它能在SQLite中工作。

乾杯, Pragnesh

+0

謝謝pragnesh。我已經做了 – 2010-07-02 07:35:26

+0

SELECT *,(3959 * ACOS(COS(RADIANS(37))* COS(RADIANS(緯度))* COS(RADIANS(經度) - RADIANS(-122))+ SIN(RADIANS(37)) * SIN(RADIANS(Latitude))))AS距離FROM郵編按距離排序<25 LIMIT 0,20 – 2010-07-02 07:36:08

+1

必須完成函數定義函數,如ACOS,COS,RADIANS,SIN,因爲它們在sqlite中不可用。奇妙的SQLite查詢 – 2010-07-02 07:37:35

0

假設你的表看起來有點像這樣:

stations: 
id  | name  | lat  | lng 
1617760 | Hilo, HI | 19.7303 | -155.0558 

查詢將

SELECT COUNT(*) FROM stations WHERE lat=? AND lng=? 

(其中的參數 「?」)

如果沒有匹配,你會得到一個0,否則一個1(假設你沒有一個點的多個站點))

+0

對不起。我寫我的問題的方式是錯誤的。我編輯過。謝謝你回答我。 – 2010-07-01 12:59:08

+0

@Sijo:啊哈,現在它更有意義:) – Piskvor 2010-07-01 13:17:16

2

出於性能考慮,你可能還想考慮將經/緯對代表圍繞每一個真正的緯度/長點邊框,具有在中心興趣點。

然後,你只是做一個簡單的檢查,看看是否在一個盒子裏的利息經/長。

找到命中後,你可以做一個更復雜的循環計算,看看它是否真的「接近」,而不是近似值。對可以計算出你認爲「接近」的任何粗糙距離。

1

大Pragnesh。它的工作非常好。看起來你對iphone問題很有幫助。