我有一个tableViewController
,它显示了按名称排序的地方列表!
使用查询
SELECT Name FROM Places ORDER BY Name.
但我的goal is to sort them by location according to userLocation
。
因此,数据库中的任何位置都有“纬度”和“经度”字段。 How do I order them by latitude and longitude based on the userLocation?
SELECT Name FROM Places ORDER BY ???.
显然,每个地方的纬度和经度都已插入到数据库中。我将用户位置作为字符串中的参数(我已经保存在plist中):
[NSString stringWithFormat: @ "SELECT Name FROM ORDER BY Places% @,% @", _myLatitude, _myLongitude "];
请帮助我!
答案 0 :(得分:1)
首先,我建议你使用DTO。像这样:
@interface Place : NSObject
@property(nonatomic, strong) NSString * name;
@property(nonatomic, strong) CLLocationCoordinate2D * coord;
@end
然后使用DAO获取NSArray
中像Anna Karenina建议的所有地方。
@interface PlaceDAO : NSObject
- (NSArray *) places;
- (id) sharedInstance;
@end
最后你可以用它来排序:
//CLLocation+DistanceComparison.h
static CLLocation * referenceLocation;
@interface CLLocation (DistanceComparison)
- (NSComparisonResult) compareToLocation:(CLLocation *)other;
@end
//CLLocation+DistanceComparison.m
@implementation CLLocation (DistanceComparison)
- (NSComparisonResult) compareToLocation:(CLLocation *)other {
CLLocationDistance thisDistance = [self distanceFromLocation:referenceLocation];
CLLocationDistance thatDistance = [other distanceFromLocation:referenceLocation];
if (thisDistance < thatDistance) { return NSOrderedAscending; }
if (thisDistance > thatDistance) { return NSOrderedDescending; }
return NSOrderedSame;
}
@end
- (NSComparisonResult)compare:(Place *)otherObject { return [self.coord compareToLocation:otherObject.coord]; }
NSArray * places = [[PlacesDAO sharedInstance] places]; referenceLocation = userLocation; NSArray * mySortedPlaces = [places sortedArrayUsingSelector:@selector(compare:)]; referenceLocation = nil;
不要忘记添加包含类别。
答案 1 :(得分:0)
由于您已经拥有场所的纬度和经度,因此请将用户位置(lat&amp; lng)发送到您创建的存储过程。计算距离并尝试按距离排序。
有关距离公式,请参阅this文章。
答案 2 :(得分:0)
理想情况下,您希望将其保留在SQL中以提高速度。你想要点之间的欧几里德距离,这基本上是Bharadwaj所连接的 - 使用斜边来计算距离(距离是每个平方和求和的x和y增量的平方根)。这比从MySQL实例加载所有数据并使用CLLocation
比较要快得多。
欧几里德距离并不完全准确 - 它指的是平面上的距离,而不是球体表面上的距离,但它可能足以满足您的需要。
您应该能够在SQL语句中执行此数学运算。