3

デバイスを動かさずに撮影したこのスクリーンショット ジョギングやサイクリング時にユーザーが自分のルートを追跡するアプリケーションを持っているので、完璧な場所が必要なので、ユーザーのルートは完璧になります。

ただ、これには1つ問題があり、

locManager = [[CLLocationManager alloc] init];
[locManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[locManager setDelegate:self];
[locManager startUpdatingLocation];

ビューでDidLoad。この didUpdateToLocation メソッドを使用すると、デバイスを少し動かさずにマップ上で非常に奇妙なルートを描くときに複数回呼び出されます。

間違ったことをしている、または何かを見逃している場合、なぜこれが起こるのか理解できません。

ありがとう.......

4

8 に答える 8

15

locationManager.distanceFilter = 500; を使用します。(またはそう) // 複数の呼び出しが発生するのを防ぐためのメーター。場所の更新を開始する前に、これを呼び出すことを忘れないでください

于 2014-02-12T09:00:28.443 に答える
2

ロケーションマネージャーの距離フィルターを設定できます。これが役立つことを願っています

 locationManager=[[CLLocationManager alloc] init];
 locationManager.delegate=self;
 locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
 locationManager.distanceFilter=10.0;

 [locationManager startUpdatingLocation];
于 2013-05-06T13:35:25.933 に答える
2

位置情報サービスを初めて開始すると、通常、移動しているかどうかに関係なく、複数の位置情報の更新が表示されます。入ってくる位置を調べると、 「ウォームアップ」している間、静止に達するまでhorizontalAccuracy、一連の位置がますます正確に (つまり、値がどんどん小さくなって) 表示されることがわかります。horizontalAccuracy

horizontalAccuracy特定の値を下回るまで、これらの初期位置を無視できます。または、起動時に、(a) 新しい場所と古い場所の間の距離が古い場所の距離よりも小さい場合、horizontalAccuracyおよび (b)horizontalAccuracy新しい場所の距離がそれよりも短い場合は、以前の場所を無視することができます。前の場所の。


たとえば、CLLocationオブジェクトの配列と、最後に描画されたパスへの参照を維持しているとします。

@property (nonatomic, strong) NSMutableArray *locations;
@property (nonatomic, weak) id<MKOverlay> pathOverlay;

さらに、場所の更新ルーチンが場所の配列に追加し、パスを再描画する必要があることを示していると仮定しましょう。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"%s", __FUNCTION__);

    CLLocation* location = [locations lastObject];

    [self.locations addObject:location];

    [self addPathToMapView:self.mapView];
}

したがってaddPathToMapView、最後の位置よりも精度が低く、それらの間の距離が最新の位置の精度よりも小さい場合、最後の位置から 2 番目の位置を削除できます。

- (void)addPathToMapView:(MKMapView *)mapView
{
    NSInteger count = [self.locations count];

    // let's see if we should remove the penultimate location

    if (count > 2)
    {
        CLLocation *lastLocation = [self.locations lastObject];
        CLLocation *previousLocation = self.locations[count - 2];

        // if the very last location is more accurate than the previous one
        // and if distance between the two of them is less than the accuracy,
        // then remove that `previousLocation` (and update our count, appropriately)

        if (lastLocation.horizontalAccuracy < previousLocation.horizontalAccuracy &&
            [lastLocation distanceFromLocation:previousLocation] < lastLocation.horizontalAccuracy)
        {
            [self.locations removeObjectAtIndex:(count - 2)];
            count--;
        }
    }

    // now let's build our array of coordinates for our MKPolyline

    CLLocationCoordinate2D coordinates[count];
    NSInteger numberOfCoordinates = 0;

    for (CLLocation *location in self.locations)
    {
        coordinates[numberOfCoordinates++] = location.coordinate;
    }

    // if there is a path to add to our map, do so

    MKPolyline *polyLine = nil;

    if (numberOfCoordinates > 1)
    {
        polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfCoordinates];
        [mapView addOverlay:polyLine];
    }

    // if there was a previous path drawn, remove it

    if (self.pathOverlay)
        [mapView removeOverlay:self.pathOverlay];

    // save the current path

    self.pathOverlay = polyLine;
}

要するに、次の場所よりも精度が低い場所を取り除くだけです。必要に応じて、剪定プロセスをさらに積極的に行うこともできますが、そこにはトレードオフがありますが、うまくいけば、これはアイデアを示しています。

于 2013-05-06T12:26:32.887 に答える
0

これが必要だと思います。startMonitoringForRegion:desiredAccuracy

例については、次のgithubリンクを参照してください。

于 2013-05-06T12:20:05.883 に答える
0

locationManager.startUpdatingLocation() は継続的に位置をフェッチし、didUpdateLocations メソッドを数回呼び出します。locationManager.startUpdatingLocation() を呼び出す前に、locationManager.distanceFilter 値の値を設定するだけです。

200を設定すると正常に動作します

    locationManager.distanceFilter = 200
    locationManager.startUpdatingLocation()
于 2017-05-19T11:21:29.970 に答える