Objective c 基于对象的纬度和经度,位于当前位置半径内的coredata对象
我想获取距离我的特定位置5公里半径内的所有对象。目前,我有以下几点:Objective c 基于对象的纬度和经度,位于当前位置半径内的coredata对象,objective-c,core-data,nspredicate,latitude-longitude,nsfetchrequest,Objective C,Core Data,Nspredicate,Latitude Longitude,Nsfetchrequest,我想获取距离我的特定位置5公里半径内的所有对象。目前,我有以下几点: _searchDistance = 2.50; AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; float minLat = appDelegate.latitude - (_searchDistance / 69); float maxLat = appDelegate.latitude + (_sea
_searchDistance = 2.50;
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
float minLat = appDelegate.latitude - (_searchDistance / 69);
float maxLat = appDelegate.latitude + (_searchDistance / 69);
float minLon = appDelegate.longitude - _searchDistance / fabs(cos(appDelegate.longitude / 180.0 * M_PI)*69);
float maxLon = appDelegate.longitude + _searchDistance / fabs(cos(appDelegate.longitude / 180.0 * M_PI)*69);
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Relation" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"rel_latitude <= %f AND rel_latitude >= %f AND rel_longitude <= %f AND rel_longitude >= %f", maxLat, minLat, maxLon, minLon];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"rel_name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort,nil]];
NSArray *matches = [context executeFetchRequest:fetchRequest error:nil];
这段代码基于以下内容
但这会在当前位置周围创建一个正方形。这会导致返回错误的值。有人能帮我吗?正如马丁所建议的,继续减少结果
NSMutableArray *filtered = [NSMutableArray array];
for (Relation *object in matches) {
float lonDelta = object.rel_longitude.floatValue -centerLon;
float latDelta = object.rel_latitude.floatValue - centerLat;
if (radius*radius <= lonDelta*lonDelta + latDelta*latDelta) {
[filtered addObject:object];
}
}
请注意,假设地球是一个平面,这通常是一个足够的近似值 你所说的错误值是什么意思当然,你可以用你的谓词得到一个平方。如果实体中仅存储lat/lon,则无法获取给定距离内的对象,因为谓词和排序描述符只能使用持久属性。-正如我在回答前一个问题时试图解释的那样,您要么将距离存储为持久属性,要么在内存中过滤提取的对象,在内存中可以使用任何基于Objective-C的过滤器。@MartinR我确实理解您的答案。但我的问题是我们能把正方形变成圆形吗?他们不存在一些数学公式吗?xmin CLLocation有一个distanceFromLocation:更精确地计算地球上两点距离的方法。对,我忘了那个。