最適化CLLocationManager/CoreLocationデータを取得するポイントがよりiPhone

StackOverflow https://stackoverflow.com/questions/1081219

質問

私は現在使用しCoreLocation+CLLocationManagerを比較するためには、ユーザーの現在位置へN量の場所で行われます。問題は私が取り扱って都市空間の場所にはありながらやっていく必要があるピンポイントの位置をユーザーに対して正確にどの機能を犠牲にせずのでは時間がかかりすぎます。私の計算ぁ正確な問題は、あまりにも長きに収集-10サンプル。私はペーストのマフィ/高精度で各コードします。れば誰でもコメントがあまり速度をアップロードできる。また化とスピードアップを図っている、というものを無駄な私のアプリとしてとして、現在では約3-4分に集まる情報は、期間の受け入れていない私の目標は人口動態.

コードするとどうなるのかわかりません

[self.locationManager setDistanceFilter:kCLDistanceFilterNone];
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (newLocation.horizontalAccuracy > 0.0f &&
        newLocation.horizontalAccuracy < 120.0f) { // roughly an accuracy of 120 meters, we can adjust this.

    [myLocs addObject:newLocation];
}

感謝の他の最適化をさらにお得な価格での速度のことです。

役に立ちましたか?

解決

私はまた、iPhoneにCLLocationManagerの問題の多くを持っていました。 別のアプリ、そして試行錯誤から、これは私が考え出したものです。

1)の例を、以下、locationManagerのためにインスタンスを1つだけシングルトンクラスを使用します:

AppleのLocateMe例

Tweetero: http://tweetero.googlecode.com/svn/trunkする

私はあなたが複数の場所マネージャオブジェクトの彼らは衝突しますが起動し、あなたができることを知らせるGPSロケーションマネージャからのエラーを取得するためならば、あなたは唯一のロケーションマネージャで実行を持つことができ、iPhoneで唯一のGPSチップがあります考えています「トンアップデートます。

2)あなたはlocationManager.desiredAccuracyの更新方法を十分に注意してくださいと    locationManager.distanceFilter

FlipsideViewControllerで、このために、Appleのコードの例を次のとおりです:

[MyCLController sharedInstance].locationManager.desiredAccuracy = accuracyToSet;
[MyCLController sharedInstance].locationManager.distanceFilter = filterToSet;

このアプローチは動作し、エラーが発生しません。あなたがdesiredAccuracyを更新した場合、または    メインデリゲートループ内distanceFilterます:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation  fromLocation:(CLLocation *)oldLocation

コア場所は、おそらくそれが値を更新し、あなたのエラーを与えることができないと文句を言うだろう。    また、唯一のAppleによって提供されdesiredAccuracy、ノー他人の定数を使用し、    副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example;

  

kCLLocationAccuracyBest、kCLLocationAccuracyNearestTenMeters、
  kCLLocationAccuracyHundredMeters、kCLLocationAccuracyKilometer、
  kCLLocationAccuracyThreeKilometers

他の値を使用すると、locationManagerからあなたのエラーを与えるかもしれません。    distanceFilterのためには、任意の値を使用しますが、人々はそれが問題を持って述べている認識することができ、    デフォルトにする主な値は次のとおりです。-1 =ベスト、私は10.0を使用しました、それはOKらしい。

3)この力、TweeteroのようstartUpdatesメソッドを呼び出して、新しい更新を強制するには  それを行うにはlocationManager事だし、それは試してみて、あなたに新しい値を取得する必要があります。

4)コア位置デリゲートルーチンから正確な最新情報を取得するトリッキーです。    あなたのアプリケーションが最初に初期化するとき、あなたはこのように、千メートル以上の精度でオフにすることができ    一つの試みは、それをするつもりはありません。初期化は通常、あなたを取得した後、3回試行    良好である47またはそうメートル以内に。それぞれの連続する試みが起こっていることに注意してください    あなたの精度を向上させるために長く、時間がかかるために、これはすぐに高価取得します。    これは、あなたが何をする必要があるかです。    それは最近のものである場合にのみ、新しい値を取り、    新しい場所は、わずかに良い精度を持っている場合は、新しい場所を取るOR    新しい場所は、精度を持っている場合は、<50メートルは、新しい場所を取るOR    試みの数が3又は5と精度<150メートルを超えている場合はAND    そうこれを取る場所は、変更されたこの新しい場所であり、デバイスが移動します    それは精度だ場合でも、値が悪化しています。    ここでこれを行うには、私の場所のコードは次のとおりです。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation  *)newLocation  fromLocation:(CLLocation *)oldLocation
{
    locationDenied = NO;

    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"UseLocations"])
    {
        [self stopAllUpdates];
        return;
    }

    NSDate* eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = abs([eventDate timeIntervalSinceNow]);
    attempts++;

    if((newLocation.coordinate.latitude != oldLocation.coordinate.latitude) && (newLocation.coordinate.longitude != oldLocation.coordinate.longitude))
        locationChanged = YES;
        else
            locationChanged = NO;

    #ifdef __i386__
            //Do this for the simulator since location always returns Cupertino
            if (howRecent < 5.0)
    #else
                // Here's the theory of operation
                // If the value is recent AND
                // If the new location has slightly better accuracy take the new location OR
                // If the new location has an accuracy < 50 meters take the new location OR
                // If the attempts is maxed (3 -5) AND the accuracy < 150 AND the location has changed, then this must be a new location and the device moved
                // so take this new value even though it's accuracy might be worse
                if ((howRecent < 5.0) && ( (newLocation.horizontalAccuracy < (oldLocation.horizontalAccuracy - 10.0)) || (newLocation.horizontalAccuracy < 50.0)
                                          || ((attempts >= attempt) && (newLocation.horizontalAccuracy <= 150.0) && locationChanged)))
    #endif
                {
                    attempts = 0;
                    latitude = newLocation.coordinate.latitude;
                    longitude = newLocation.coordinate.longitude;
                    [currentLocation release];
                    currentLocation = [newLocation retain];
                    goodLocation = YES;

                    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateLocationNotification" object: nil];

                    if (oldLocation != nil) {
                        distanceMoved = [newLocation getDistanceFrom:oldLocation];
                        currentSpeed = newLocation.speed;
                        distanceTimeDelta = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp];
                    }
                }
    // Send the update to our delegate
    [self.delegate newLocationUpdate:currentLocation];
}

あなたはiPhone 3GSが更新を見出し取得している場合は非常に簡単で、ここでは上記と同じモジュール内のコードは次のとおりです。

//This is the Heading or Compass values
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
    if (newHeading.headingAccuracy > 0)
    {
        [newHeading retain];
        // headingType = YES for True North or NO for Magnetic North
        if(headingType) {
            currentHeading = newHeading.trueHeading;
        } else {
            currentHeading = newHeading.magneticHeading;
        }

        goodHeading = YES;
        [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateHeadingNotification" object: nil];

    }
}

これは人々を役に立てば幸い!

他のヒント

didUpdateToLocationのみ更新ユーザが場所を移動させます。私はあなたが気づいた確信しているように、これは、散発的なことができます。 CCLocationManagerは、定期的な更新を送信し、代わりにユーザーが移動したときに更新を送信し、またはそれの精度が向上しません。私は静止していると私は、アプリを起動すると、私は通常約3アップデートを取得しないし、その後しばらくは何も。 Googleマップは、精度が増加するとポイント対リングを示す、ものの同様の並べ替えを行います。私はあなたが必要な精度(<120.0f)に達し、その後、自分の行動や計算を実行するまで待機していることをお勧めしたい。

あなたはアップデートが送信される「通常」GPS、に慣れているし、それはそれは精度だリファインし続ける場合は、

、私はiPhoneがこれを行うために設計されていないんです。

また、あなたはMapKitのAPIを使用して、ユーザーにその場所で地図を表示し、彼らは場所が十分に正確であると感じたら、「受け入れる」する可能性があります。私はピンポイントを取得し、時には注意し、その後、30秒後にそれは多分50メートル近い私が実際にしていますどこに私を移動します。

書いたGITレポすので、ご利用 https://github.com/xelvenone/M6GPSLocationManager

  • あった場合は、その精度はよりacceptableAccuracyしを行いま
  • の視点を取り入れた取組を更新occuracyお待ち申し上げておりmaximumWaitTimeForBetterResultを一である場合はそのようなことはないでにベストワン
  • した場合は常に降の更新を超えるmaximumAttemptsまthベストワン(おそらくいん)
  • ないのであれば取得その他の更新に30秒までのそれぞれについて、"これまではありませんのでしょうその他の更新)

コード

- (void)scopeToCurrentLocationWithAcceptableAccuracy:(CLLocationAccuracy)acceptableAccuracy
              maximumWaitTimeForBetterResult:(NSTimeInterval)maximumWaitTimeForBetterResult
                             maximumAttempts:(NSInteger)maximumAttempts
                                onCompletion:(M6GPSLocationManagerCompletion)completion;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top