3

私は、ユーザーが 10 メートルの直線に従って一方向に (iPhone を使用して) 歩くことを確認する機能を構築する必要があるアプリを作成しています。ユーザーがターンすると、アラートがポップアップするか、何かが通知されます。

誰でもこれを行う方法を教えてもらえますか

4

2 に答える 2

1

多くの調査の後、私はこの質問に自分で答えています。

 #define kDistanceFilter 5
 #define kRotationFilter 60

 -(void)initInfluenceWalkingTest{
     wasRotation = NO;

     // Init and configure CLLocationManager
     if (!self.locationManager) {
         self.locationManager = [[CLLocationManager alloc] init];
         self.locationManager.delegate = self;

         self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

         self.locationManager.distanceFilter = kDistanceFilter; // update location when user moves 5 meters
         self.locationManager.headingFilter = kRotationFilter; // detect rotation if  user rotates more than 60 degress

         [self.locationManager startUpdatingLocation];
     }

     //Start heading updates (rotation)
     if ([CLLocationManager headingAvailable]) {
         [self.locationManager startUpdatingHeading];
     }

     //Init current location
     if (!self.location) {
         self.location = [[CLLocation alloc] init];
     }
     self.locations = [NSMutableArray array];
 }

 /*
  * Invoked when new locations are available.
  */
 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

     CLLocation *location = (CLLocation*)locations.lastObject;

     //Filter location by time and accuracy
     NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow];
     if (locationAge > 5.0){
         return;
     }

     if (location.horizontalAccuracy < 0)
         return;

     if (location.horizontalAccuracy>kDistanceFilter-1 && self.location.horizontalAccuracy<=kDistanceFilter) {
         [self.locations addObject:location];
     }

     //Retain the object in a property
     self.location = location;

     //we show button when user stop moving
     self.buttonTap.hidden = (self.location.speed>0);
 }

 /*
  * Invoked when a new heading is available
  */
 - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
     if (newHeading.headingAccuracy < 0)
         return;

     //Use the true heading
     CLLocationDirection  direction = ((newHeading.trueHeading > 0) ?
                                  newHeading.trueHeading : newHeading.magneticHeading);

     // Check if rotation was about 60 degrees
     if (self.direction>0 && ABS(self.direction - direction)>kRotationFilter) {
         wasRotation = YES;

     }

     //Retain the object in a property
     self.direction = direction;
 }     
于 2014-02-23T19:41:27.350 に答える
0

位置データを継続的に保存し、ユーザーが回線上を移動するかどうかを毎回確認します。ここでは、最初の、十分に公平な 10 レコードから方向を判断できます。次に、ユーザーがそれからあまり逸脱していないかどうかを確認するだけです。

ここにある方向の計算: http://forrst.com/posts/Direction_between_2_CLLocations-uAo

于 2014-02-09T20:18:08.083 に答える