从位置获取mySQL数据库顺序的位置名称(基于用户位置的接近程度)

时间:2013-11-30 12:44:08

标签: ios objective-c mkmapview mapkit cllocation

我有一个tableViewController,它显示了按名称排序的地方列表! 使用查询

从我的MySQL数据库中检索此列表
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 "];

请帮助我!

3 个答案:

答案 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

最后你可以用它来排序:

1。创建CLLocation类别以计算最接近参考坐标的坐标。

//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

2。为您的Place DAO添加比较方法。

- (NSComparisonResult)compare:(Place *)otherObject {
    return [self.coord compareToLocation:otherObject.coord];
}

3。最后像这样对数组进行排序。

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语句中执行此数学运算。