gpt4 book ai didi

ios - Objective-C : Filtering based on location

转载 作者:行者123 更新时间:2023-11-29 11:02:05 26 4
gpt4 key购买 nike

我的问题是基于CLLocationManager 和一定半径内的过滤位置。

我有什么:

  1. 用户的位置(从 CLLocationManager 中检索),
  2. 数组中的 say 商店列表,每个商店都有其经纬度坐标。

我的要求是我需要过滤掉用户给定位置 100 公里半径范围内的商店。

此外,如果 100 公里半径内有超过 25 家商店,则逻辑需要转换为过滤掉离我的位置最近的 25 家商店。

解决此问题的最佳方法是什么?

最佳答案

最好的选择是使用许多数据库的内置功能来为您进行过滤和排序。

基本实现非常明显:只需对商店进行排序并获得位于定义区域内的前 25 家。

如果您可能有数千家商店,这是我可能会如何编写的优化版本:

NSArray *stores = ...;
CLLocation *myLocation = ...;

NSMutableArray *nearestStores = [NSMutableArray array];
CLRegion *nearest100kmRegion = [CLRegion initCircularRegionWithCenter:[myLocation coordinate]
radius:100000
identifier:@"someIdentifier"];

// We will need to enumerate all stores to ensure that there are no more
// than 25 objects within the defined region.
//
// Since there may be thousands of objects and many of them can be
// out of the defined region, we should perform concurrent enumeration
// for performance reasons.
dispatch_semaphore s = dispatch_semaphore_create(1);
[stores enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id store, NSUInteger idx, BOOL *stop)
{
if ([nearest100kmRegion containsCoordinate:[[store location] coordinate]])
{
dispatch_semaphore_wait(s, DISPATCH_FOREVER);
[nearestStores addObject:store];
dispatch_semaphore_signal(s);
}
}];
dispatch_release(s);

if ([nearestStores count] > 25)
{
[nearestStores sortWithOptions:NSSortConcurrent
usingComparator:^(id store1, id store2)
{
return [myLocation distanceFromLocation:[store1 location]] - [myLocation distanceFromLocation:[store2 location]];
}];
}

return [nearestStores subarrayWithRange:NSMakeRange(0, MAX([nearestStores count], 25))];

关于ios - Objective-C : Filtering based on location,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15425431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com