私は、ユーザーが 10 メートルの直線に従って一方向に (iPhone を使用して) 歩くことを確認する機能を構築する必要があるアプリを作成しています。ユーザーがターンすると、アラートがポップアップするか、何かが通知されます。
誰でもこれを行う方法を教えてもらえますか
私は、ユーザーが 10 メートルの直線に従って一方向に (iPhone を使用して) 歩くことを確認する機能を構築する必要があるアプリを作成しています。ユーザーがターンすると、アラートがポップアップするか、何かが通知されます。
誰でもこれを行う方法を教えてもらえますか
多くの調査の後、私はこの質問に自分で答えています。
#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;
}
位置データを継続的に保存し、ユーザーが回線上を移動するかどうかを毎回確認します。ここでは、最初の、十分に公平な 10 レコードから方向を判断できます。次に、ユーザーがそれからあまり逸脱していないかどうかを確認するだけです。
ここにある方向の計算: http://forrst.com/posts/Direction_between_2_CLLocations-uAo