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 中做啥?的主要内容,如果未能解决你的问题,请参考以下文章