2009-07-24 8 views
1

iPhone SDKで少し遊んでいて、アプリケーションで現在の速度を見せたいと思っています。本当に正確に、特に走行や自転車のような低速の場合には、非常に多くのアプリがあります。私が見た最高のRunKeeperです。私のCLLocationの速度がどうして不正確なのですか?

しかし、私のアプリケーションでは、速度が絶対に不正確です。低速では常にゼロになり、高速ではいくつかの値が表示されますが、ほとんど更新されず、あまり有用ではありません。

- (void)locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation { 
    if (newLocation.timestamp > oldLocation.timestamp && 
     newLocation.verticalAccuracy > 0.0f &&         // GPS is active 
     newLocation.horizontalAccuracy < 500.0f &&         // GPS is active 
     //newLocation.horizontalAccuracy < kCLLocationAccuracyHundredMeters && // good quality GPS signal 
     //newLocation.speed > 1.0f &&           // enough movment for accurate speed and course measurement 
     oldLocation != nil)              // oldLocation is nil on the first reading 
    { 
     double speed = (newLocation.speed * 3.6); 
     [self updateDisplayWithSpeed:speed]; 
     //double direction = newLocation.course; 
    } 
} 

誰でもそのコードを使用できますか?それとも、私が何が間違っているのか教えてください。

答えて

7

私は以下を試します。

シナリオで必要に応じてdistanceFilterとdesiredAccuracyを設定する必要があることに注意してください。歩行は車での移動と同じではありません。また、GPSから高精度を要求するときは、 GPSによって開始位置として第2のものを使用する。 Appleドキュメントの引用:

使用シナリオに適した値をこのプロパティに割り当てる必要があります。言い換えれば、数キロメートル以内に現在地だけが必要な場合は、精度のためにkCLLocationAccuracyBestを指定しないでください。より正確に位置を決定するには、より多くの時間とより多くのパワーが必要です。 高精度の位置データを要求する場合、位置情報サービスが提供する初期イベントには、要求された正確さがない場合があります。ロケーションサービスは、できるだけ早く初期イベントを配信します。その後、要求された正確さでロケーションを決定し続け、必要に応じて、そのデータが利用可能なときに追加のイベントを配信します。

ここに私の提案があります。

まず、少なくとも1秒の間隔でGPSを使用して位置を更新します。この間隔の下では、速度値は毎秒メートルで測定され、前の説明のために無駄です。有効な更新を1秒未満で高い精度で取得する可能性は低いです。

次に、位置座標に意味のある値のみを使用します。負のhorizo​​ntalAccuracyで値を破棄する必要があります。これは私がいい場所を話すときに言及しているものです。

第3に、自分で距離を計算することができます。getDistanceFrom()を使用して最後の正常な場所と前の正常な場所の間の距離を計算し、次に場所の更新までの経過秒数で除算します。これはメートル/秒であなたに距離を与えるでしょう。私はこれを行い、アップルのスピードと結果を比較しようとします。

+0

あなたが最初の問題を処理するコードの例がありますか?または、これはちょうど前のものとの位置のタイムスタンプをチェックしていますか? –

3

あなたのコードに次の試してください:

speedLabel.text = [NSString stringWithFormat:@"SPEED(Km/Hr): %f", [location speed]*3.6]; 
latitudeLabel.text = [NSString stringWithFormat:@"LATITUDE: %f", location.coordinate.latitude]; 
longitudeLabel.text = [NSString stringWithFormat:@"LONGITUDE: %f", location.coordinate.longitude]; 
CLLocationDistance meters = [location distanceFromLocation:orginalLoc]; 
distanceLabel.text = [NSString stringWithFormat:@"DISTANCE(M): %f", meters]; 
関連する問題