startMonitoringFromRegion - 在 didEnterRegion 中做啥?
Posted
技术标签:
【中文标题】startMonitoringFromRegion - 在 didEnterRegion 中做啥?【英文标题】:startMonitoringFromRegion - what to do in didEnterRegion?startMonitoringFromRegion - 在 didEnterRegion 中做什么? 【发布时间】:2011-08-22 13:08:33 【问题描述】:我目前正在实施 startMonitoringFromRegion:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
self.currentLocation = newLocation;
if (![CLLocationManager regionMonitoringAvailable] ||
![CLLocationManager regionMonitoringEnabled])
return;
CLLocationDegrees radius = 5;
if (radius > self.locationManager.maximumRegionMonitoringDistance)
radius = self.locationManager.maximumRegionMonitoringDistance;
CLRegion* region = [[CLRegion alloc] initCircularRegionWithCenter:self.currentLocation.coordinate
radius:radius
identifier:@"Indentifier"];
[self.locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyHundredMeters];
[region release];
当我进入一个新区域时,didEnterRegion 会被调用。 我的问题是,我应该在 didEnterRegion 中做什么?
我有一个包含所有坐标的数组。我是否应该提取 region.center 并将该坐标与我的坐标数组进行比较,看看哪个坐标最接近 region.center?
【问题讨论】:
您的代码看起来不对?您根据当前位置创建一个新区域。每次调用 didUpdateToLocation 时,都会用新位置覆盖该区域。这意味着,您将永远不会退出您创建的区域,因为该区域会随着您移动, 【参考方案1】:我注意到 CLRegion 有一个很棒的方法,叫做 containsCoordinate。
因此,与其在 didEnterRegion 中循环遍历我所有的麦当劳数组坐标并检查它们与 region.center 的距离是否小于 x 公里,我现在可以使用 containsCoordinate。
for (Restaurant *restaurant in arrRestaurants)
CLLocation *restaurantLocation = [[CLLocation alloc] initWithLatitude:[resturant.latitude doubleValue] longitude:[restraurant.longitude doubleValue]];
if ([region containsCoordinate: restaurantLocation.coordinate])
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"McDonads found in the region!" message:[NSString stringWithFormat:@"%@", restaurant.town] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
[alert release];
现在,我还没有尝试过,但对我来说这似乎是合乎逻辑的。
【讨论】:
这种方法在触发 didEnterRegion 时会检索到准确的位置吗?【参考方案2】:您需要为您的 CLLocationManager 实现 -didEnterRegion
和 -didExitRegion
方法。您将根据进入/退出该区域所需发生的情况来执行您的代码。
我已根据您的评论编辑了我的答案。如果你需要计算你和你的点之间的距离,你可以这样做。
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
您可以从 region.center 创建您的位置点。
【讨论】:
我的坐标数组代表麦当劳餐厅。因此,当您输入一个区域时,我想提醒用户他刚刚输入了一个有 x 家麦当劳餐厅的区域。我是否应该将 region.center(我从 didEnterRegion 获得)与代表麦当劳餐厅的坐标数组进行比较,然后计算距离以查看该地区是否有餐厅? 你知道你所在的地区有多大吗?我知道您可以创建多大的区域有大小限制。如果不是太多,我不会担心。 我的问题是围绕 didEnterRegion 的逻辑。从您应该如何使用 didEnterRegion 来实现我的目的,我的最后一条评论是否正确?比较 region.center 和我的麦当劳数组中的坐标之间的距离?你喜欢这样吗?以上是关于startMonitoringFromRegion - 在 didEnterRegion 中做啥?的主要内容,如果未能解决你的问题,请参考以下文章