場所の更新を初めて開始したとき、値は常に 0 になるとは限りません。場合によってはそうですが、0 をわずかに超える値が得られることもあります。2 などの値が得られます。粗いので、ストップを押してもう一度開始すると、小さな値が得られ、0 になるまでそれを続けます。私の目的の距離フィルターは 250 メートルですが、これより下の開始時に値を取得できません! なぜこれが起こっているのか、どうすればこれに対処できますか. 以下は、これを屋内で開始する場合に特に問題です (これは GPS の初期確立の問題であると考えられます)。開始前にユーザーが屋外にいることを確認するための簡単なアラートビューでこれに対処できますが、これは屋外で時々発生するため、この問題を解決したいと考えています。また、0 から開始してすぐに運転を開始すると、不正確な値が得られます。
解決策についての私の推測: 位置情報の更新を開始する前に、どのようにして GPS 接続が安定しているかを確認する必要があります。
CLLocationManager クラス リファレンスには、上記のソリューションに役立つものは何も表示されません。
0 から始まらない場合の開始と停止の例を次に示します。
Trigger Start - > Location = 1.1 km
Trigger Stop
Trigger Start - > Location = .98 km
Trigger Stop
Trigger Start - > Location = .55 km
Trigger Stop
Trigger Start - > Location = .02 km
Trigger Stop
Trigger Start - > Location = 0 km (finally where it should start from)
これが私のコードです:
@interface DriveLog (){
CLLocationDistance totalDistanceBetween;
NSString *tripString;
Settings *settingsVC;
CGFloat km;
}
- (void)viewDidLoad{
totalDistanceBetween = 0;
locationManager = [[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate = self;
locationManager.distanceFilter = 250;
startLocation = nil;
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (IBAction)start:(id)sender {
[locationManager startUpdatingLocation];
}
- (IBAction)stop:(id)sender {
totalDistanceBetween = 0;
startLocation = nil;
[locationManager stopUpdatingLocation];
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if (startLocation == nil){
totalDistanceBetween = 0;
self.startLocation = newLocation;
}
CLLocationDistance distanceBetween = [newLocation distanceFromLocation:startLocation ];
self.startLocation = newLocation;
totalDistanceBetween += distanceBetween;
if(kmOrMile == 0){
km = totalDistanceBetween * 0.001;
}else{
km = totalDistanceBetween * 0.000621371192237334;
}
tripString = [[NSString alloc]
initWithFormat:@"%.02f%@",
km, kmOrMileString];
distance.text = tripString;
}