1

アプリに がありMKMapViewます。これは iOS6 です。

-(void)viewDidLoad
{
    .....
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"Update locations is hit");
    NSLog(@"379 the locations count is %d",locations.count);

    CLLocation *obj = [locations lastObject];
    NSLog(@"the lat is %f", obj.coordinate.latitude);
    NSLog(@"the long is %f", obj.coordinate.longitude);
    NSLog(@"the horizontal accuracy is %f",obj.horizontalAccuracy);
    NSLog(@"the vertical accuracty is %f",obj.verticalAccuracy);
    if (obj.coordinate.latitude != 0 && obj.coordinate.longitude != 0)
    {
        CLLocationCoordinate2D currrentCoordinates ;
        currrentCoordinates.latitude = obj.coordinate.latitude;
        currrentCoordinates.longitude = obj.coordinate.longitude;
    }
    ....more computation
    [locationManager stopUpdatingLocation];
}

アプリを初めてロードしたとき、自分の位置が少し遠くに表示されます。時には何マイルも離れています。また、場所をリセットするボタンもあり、クリックするとその地図が正しい場所を示します。これは、場所のリセットボタンのクリックで私が持っているものです:

- (IBAction)btnResetLocationClick:(UIButton *)sender
{
    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager startUpdatingLocation];
}

では、ロード時にアプリが正しい現在の場所を取得するにはどうすればよいですか。アプリがマップに数ミリ秒待機してから更新するように指示する方法はありますか? または他のアイデアはありますか?私にお知らせください。さらに詳しい情報が必要な場合は、お問い合わせください。ありがとう。

4

2 に答える 2

2

あなたができることは次のとおりです。

  • didUpdateLocations位置情報サービスを自動的にオフにしないでください。
  • didUpdateLocationsに十分満足している場合にのみ、位置情報サービスをオフにしてくださいhorizontalAccuracy。と
  • 必要な精度が得られない場合でも、一定の時間が経過したら位置情報サービスをオフにしてください。

したがって、次のdidUpdateLocationsようになります。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    // do whatever you want with the location

    // finally turn off location services if we're close enough
    //
    // I'm using 100m; maybe that's too far for you, but 5m is probably too small
    // as you frequently never get that accurate of a location

    if (location.horizontalAccuracy > 0 && location.horizontalAccuracy < 100)
        [locationManager stopUpdatingLocation];
}

次に、 でviewDidLoad、一定の時間が経過したらオフにします (位置情報サービスを既にオフにしている場合は、設定したステータス変数を確認することをお勧めします)。

-(void)viewDidLoad
{
    .....
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager startUpdatingLocation];

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 60.0 * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [locationManager stopUpdatingLocation];
    });
}

元の答え:

現在地周辺のマップを更新している場所がわかりません。私は次のようなものを見ることを期待しています:

self.mapView.centerCoordinate = location.coordinate;

または好き:

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location.coordinate, 300, 300);
[self.mapView setRegion:region];

また、位置情報サービスをすぐにオフにするのではなく (多くの場合、最初のいくつかの位置情報はそれほど正確ではないため)、しばらくそのままにして、所定の制限内に収まるhorizontalAccuracyまで位置情報を絞り込むことをお勧めします. verticalAccuracyへのいくつかの呼び出しに対するこれらの精度の数値をdidUpdateLocations見れば、私の言いたいことがわかるでしょう。

「負の値は、場所の緯度と経度が無効であることを示します」によると、horizontalAccuracy実装を提案した時点で負になっていると最初は思っていました。問題が何であるかを説明するエラーが表示されることを願っています。現在、負の値を取得していない場合でも、エラーを正しく処理していることを確認するために、このメソッドを実装することをお勧めします。didFailToLocateUserWithErrorhorizontalAccuracyhorizontalAccuracy

于 2013-01-21T21:17:50.297 に答える
0

アプリで iPhone の GPS をより正確にすることはできませんが、続行する前に結果正確であることを確認できます。今は緯度と経度が 0 でないことだけを確認していますが、 の horizo​​ntalAccuracy を確認するとobj、位置情報が十分に良好であることがわかります。stopUpdatingLoationそれが起こるまでしないでください。

于 2013-01-21T21:06:31.847 に答える