6

次のようにロケーションマネージャーを設定したプログラムがあります。

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

10 メートル以内の精度が必要ですが、その精度で位置を見つけるには、didUpdateToLocation デリゲート メソッドを数回呼び出す必要があります。このメソッドの呼び出しを遅らせる方法、またはプログラムを続行するために必要な精度が達成されたことを示す方法はありますか。

現在、返された最初の場所で続行を試みます。2 回目の位置情報の更新でさえ、期待したほど正確ではありません。

前もって感謝します!

4

3 に答える 3

7

各デリゲート呼び出しには精度の数値が含まれているため、目的の精度に達するまでメソッドから戻るだけです (警告: 絶対に起こらない可能性があります)。

単純に 10 メートルの結果にジャンプすることはできません。これが必須の精度ではなく「望ましい」精度と呼ばれるのには理由があります。より正確な位置を計算するには、時間を与える必要があります。

于 2009-07-20T03:35:03.573 に答える
4

私は最近、この問題に取り組み、ついにドキュメントを巧みに読んで、CoreLocation が別のスレッドで実行されることを発見しました。そのため、CoreLocation を起動して、更新時にイベントを取得できます。これは、 「ユーザーの場所を取得する」というルーブリックの下のドキュメントにあります。ここから更新を開始します。

- (void)startStandardUpdates
{
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = none;
    [locationManager startUpdatingLocation];
}

デリゲートを「自己」にすると、開始メソッドが定義されている同じクラスにイベントが送信されるため、イベントを取得するには次を追加するだけです。

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
    fromLocation:(CLLocation *)oldLocation
{
    if (newLocation.horizontalAccuracy < 30.0)
    {
        NSLog(@"latitude %+.6f, longitude %+.6f\n",
                newLocation.coordinate.latitude,
                newLocation.coordinate.longitude);
        [manager stopUpdatingLocation];
    }
}

このようにして、イベントを受信し続け、GPS 受信機をオフにしてエネルギーを節約します。もちろん、タイムアウトと、タイムアウトした場合に最高の水平精度で位置を保存して受け入れる何らかの方法が必要ですが、その方法はまだわかりません.

于 2011-04-12T05:34:47.103 に答える
2

1 つの戦略は、修正を得るのに十分な時間タイマーを開始することです (これはユーザーにも受け入れられます)。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

更新を配信するロケーション マネージャーを開始します。タイマーの有効期限が切れたら (または許容できる精度が得られたら)、更新を停止してその場所を使用します。

それはおそらくあなたが得ようとしている最高のものです。それでも十分に正確でない場合に、場所を再試行するオプションをユーザーに提供することができます。

于 2009-08-11T22:00:30.953 に答える