Objective c 基于对象的纬度和经度,位于当前位置半径内的coredata对象

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

我想获取距离我的特定位置5公里半径内的所有对象。目前,我有以下几点:

_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:更精确地计算地球上两点距离的方法。对,我忘了那个。