2010-05-28 59 views
3

我有一个sqlite数据库与长和lat的商店,我想找出最近的5个商店。使用SQLITE的Long Lat coord之间的距离

所以下面的代码工作正常。

if(sqlite3_prepare_v2(db, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 


    while (sqlite3_step(compiledStatement) == SQLITE_ROW) { 

     NSString *branchStr = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
     NSNumber *fLat = [NSNumber numberWithFloat:(float)sqlite3_column_double(compiledStatement, 1)]; 
     NSNumber *fLong = [NSNumber numberWithFloat:(float)sqlite3_column_double(compiledStatement, 2)]; 

     NSLog(@"Address %@, Lat = %@, Long = %@", branchStr, fLat, fLong); 
     CLLocation *location1 = [[CLLocation alloc] initWithLatitude:currentLocation.coordinate.latitude longitude:currentLocation.coordinate.longitude]; 
     CLLocation *location2 = [[CLLocation alloc] initWithLatitude:[fLat floatValue] longitude:[fLong floatValue]]; 

     NSLog(@"Distance i meters: %f", [location1 getDistanceFrom:location2]); 
     [location1 release]; 
     [location2 release]; 
    }  
} 

我知道我从哪里到每个商店的距离。我的问题是。

  1. 是更好地把距离放回源码行,我也行,当我踏上直通数据库。我怎么做?我使用UPDATE语句吗?有人有一段代码可以帮助我吗?

  2. 我可以将sqlite读入数组,然后对数组进行排序。你是否推荐使用上述方法?这是否更有效率?

最后,如果有人有更好的方法获得最近的5家店铺,喜欢听它。

回答

5

在SQL中查找附近位置的最快方法是在SQL查询中使用Haversine公式。做一个谷歌搜索sqlite和Haversine,你会发现一个实现。

这里有一个我以前用过:

http://www.thismuchiknow.co.uk/?p=71

+0

nevan,我喜欢你的答案。我已经成功地使用数组实现了这个解决方案,但是我将来肯定会使用你的建议。 – munchine 2010-06-02 02:44:08

+0

AAA答案! 我已经使用以下查询来检索距离结果以及: “SELECT Hotel。*,distance(Hotel.Latitude,Hotel.Longitude,123.45,123.45)AS距离酒店ORDER BY距离” – 2011-12-14 05:30:25

0

你必须通过每一个元素只有一次这样的复杂性是相当不错的运行。 您需要一种固定大小的Deque-container,一种链接列表或固定大小的数组,固定大小为5,您希望从每个点获取的商店数量。总是添加与Deque最小距离的商店。穿过你的db后,你的deque中有最近的5个商店。

+0

Hi Oopz ,还有不到100家商店,所以我决定对整个阵列进行排序,并将地图上的所有针脚都放下。这很快。然后,我通过电话突出显示最近的商店。使用这种方法,如果用户缩小或平移,他们将看到所有商店。 – munchine 2010-06-02 02:45:16