2010-07-01 54 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问题很有帮助。