2

電話を一定の距離(ユーザーをベッドから追い出すため)に動かした後にのみシャットオフするアラームを作成しています。アラームが鳴った後の移動距離を見つけて、この距離を取り、最小距離が移動した場合にアラーム音を止める方法で使用する必要があります。何か案は?私は場所を更新するために以下を使用しています。これをアラームの無効化に組み込む方法について何か考えはありますか?

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation     *)newLocation fromLocation:(CLLocation *)oldLocation
{
if(!newLocation) {
    NSLog(@"No movement");
}

if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) &&
    (oldLocation.coordinate.longitude != newLocation.coordinate.longitude))
{



    CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:oldLocation.coordinate.latitude longitude:oldLocation.coordinate.longitude];
    CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
    CLLocationDistance distance = [loc2 distanceFromLocation:loc1];
    if (distance>=4) {
        NSLog(@"Very good!");
    }

}

NSLog(@"Location:%@", newLocation);
}


-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"Could not find location: %@", error);
}
4

1 に答える 1

7

いくつかの考え:

  1. あなたは考慮していませんhorizontalAccuracy。まず、これがいずれかの座標で負の場合、比較を行うことはできません。また、どちらも負でない場合でも、ユーザーが特定の距離を移動したかどうかを本当に判断したい場合は、おそらく水平方向の精度を元に戻したいと思うでしょう。

    緯度と経度だけでなく、 も見てくださいhorizontalAccuracy

  2. 位置情報サービスをオンにすると、一連の座標全体が頻繁に入力され、水平精度がどんどん良くなるにつれて座標が跳ね返る可能性があることを考慮していません. このゆっくりとした三角測量を、ベッドから出たと見なすために必要な動きと見なさないようにする必要があります。

  3. 実際のシナリオで、実際のデバイスで実験を行ってください。シミュレーターを使用することは、間違いなく良いテストではありません。また、コンピューターに接続されたデバイスを使用することもありません (誰かが就寝前に移動したという現実世界のシナリオで GPS を確認したいため)。

  4. 場所のイベントをデータベース (または他の形式) に記録し、おそらくテーブルビューにログを表示する単純なアプリから始めることをお勧めします。これにより、常にコンピューターに戻って結果を確認する必要がなくなります。そのアプリを起動し、歩き回って、取得した位置イベントを確認します。これにより、実際のデバイスを使用する際に目にするパターンを理解するのに役立ちます。

  5. このアプリがアプリ ストア向けである場合は、さまざまな環境、さまざまなデバイス、さまざまなシナリオ (GPS の位置が悪い、Wi-Fi がある、Wi-Fi がないなど) で多くのさまざまな人々を巻き込む必要があることに注意してください。実際のデバイスで実際の G​​PS 体験を行う場合でも、他の人は異なる GPS 結果を経験する可能性があることを理解する必要があります。

  6. iPhone の GPS が、一般化されたソリューションとしてこの種のアプリに対して十分に正確であるかどうかについて、いくつかの留保を認めなければなりません。また、ユーザーがスリープ状態に入る前に iPhone を接続するように警告して、GPS が正常に機能しないようにすることをお勧めします。バッテリーを消耗させないでください。また、ユーザーが起動していることを示した後に位置情報サービスをオンにするなどのトリックを実行することもできます。また、アラームの数分前まで位置情報サービスをオンにしたくない場合もあります。これにより、アラームが鳴ったときに GPS が可能な限り正確であることが保証されますが、アラームが鳴らなくてもスリープ中にバッテリーが消耗することはありません。たまたまプラグを差し込んで充電しています。


アップデート:

おそらく自分で距離を計算するよりも簡単です。位置情報サービスの距離フィルターを使用します (つまり、位置がxメートル変化した場合にのみイベントを生成します)。例えば:

- (void)startLocationManager
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = 5.0; // detect when I move 5 meters
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];
}

そうするとき、完全に静止した状態で、位置情報サービスをオンにするとすぐに、移動を開始する前に大量のイベントが発生します。GPS がウォームアップし、ますます正確になっていることがわかります。

緯度経度水平精度
 ---------------- ------------------ ---------------- --
 39.9482837548282 (82.4963494095571) 65
 39.9482817585030 (82.4964543834170) 10
 39.9482392622539 (82.4964914314290) 5
 39.9481753502422 (82.4964918505242) 5
 39.9481269028419 (82.4964797805836) 5

それが完全に下がるのを待ち(私の場合は15〜20秒かかりました)、最後に到達した場所からの距離を見て、直線で歩き始​​めました.

緯度経度水平精度距離
 ---------------- ------------------ ---------------- -- --------
 39.9481722908476 (82.4964962091138) 5 5.3
 39.9482206544289 (82.4965029146363) 5 10.4
 39.9482627315828 (82.4965282279839) 5 15.4
 39.9483157471204 (82.4965248752227) 5 21.2

私はそれを測定していませんが、これらの距離はあまり適切ではないと告白しなければなりませんが、おそらく私が設定した 5 メートルの許容範囲内distanceFilterです.

とにかく、これらすべての証拠として、正しいプロセスはおそらく

  • 位置情報サービスをオンにしdistanceFilterて、アプリに適切に設定します。

  • 場所が落ち着くのを待ちます。

  • このプロセスがまったく機能するために、 horizo​​ntalAccuracy が妥当であることを確認してください。と

  • distanceFilterを超えたと判断した GPS に基づいて、新しい位置通知を待ちます。

これは決して完璧ではありません (たとえば、「5 メートル」が開始される前に 6 ~ 10 メートル歩く必要がありdistanceFilterました。おそらく GPS が数秒遅れているhorizontalAccuracyことと . ."

(ちなみに、私は上記のログで座標を変更したので、このオハイオ州のトウモロコシ畑で私を探す必要はありませんが、見られるパターンの種類についてのアイデアが得られます。)

于 2013-02-25T02:53:55.790 に答える