2009-07-20 28 views
6

Tôi có một chương trình với một người quản lý vị trí thiết lập như thế này:CoreLocation Độ chính xác khủng hoảng

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

tôi cần sự chính xác để trong vòng mười mét, tuy nhiên, phải mất một vài cuộc gọi của phương pháp didUpdateToLocation đại biểu để tìm ra vị trí ở độ chính xác đó. Làm thế nào tôi sẽ đi về trì hoãn cuộc gọi của phương pháp này hoặc chỉ cho biết khi nào chính xác mong muốn đạt được để tiến hành chương trình.

Ngay bây giờ, nó cố gắng tiến hành trả lại vị trí đầu tiên. Ngay cả bản cập nhật vị trí thứ hai cũng không chính xác như mong đợi.

Cảm ơn trước!

Trả lời

7

Vì mỗi cuộc gọi đại biểu bao gồm một con số chính xác, chỉ cần trở về từ phương pháp cho đến khi đạt được độ chính xác mong muốn của bạn (cảnh báo: điều đó có thể không bao giờ xảy ra).

Bạn không thể đơn giản nhảy đến kết quả mười mét - có lý do tại sao nó được gọi là độ chính xác "mong muốn" và không chính xác bắt buộc. Bạn phải dành thời gian để tính toán các vị trí chính xác hơn.

+0

Vì lý do nào đó, khi tôi kiểm tra thuộc tính này ([newLocation horizontalAccuracy]), Trình quản lý vị trí chỉ cập nhật hai lần và vị trí mới là giống nhau cả hai lần. Bạn có biết lý do nào cho việc này không? –

+0

Đó là kết quả tốt nhất mà nó có thể tìm thấy sau đó. Bạn không phải lúc nào cũng sẽ nhận được kết quả trong vòng mười mét - ngay cả khi bạn có GPS trong iPhone đôi khi ở trong nhà, nó phải dùng đến hình tam giác tháp di động. –

2

Một chiến lược là để bắt đầu một giờ trong một thời gian đủ dài để có được một sửa chữa (mà cũng sẽ được chấp nhận cho người sử dụng)

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

Khởi động quản lý vị trí cung cấp thông tin cập nhật. Khi bộ đếm thời gian hết hạn (hoặc bạn nhận được độ chính xác chấp nhận được), hãy ngừng cập nhật và sử dụng vị trí đó.

Đây có lẽ là điều tốt nhất bạn sẽ nhận được. Bạn có thể muốn cung cấp cho người dùng tùy chọn để thử lại vị trí nếu vị trí đó vẫn chưa đủ chính xác.

4

Gần đây tôi đã giải quyết vấn đề này và phát hiện ra, bởi khéo léo đọc tài liệu tại lâu cuối cùng, đó CoreLocation chạy trong một thread riêng biệt, vì vậy bạn có thể bắt đầu nó lên và sau đó lấy các sự kiện vì nó cập nhật. Đó là trong tài liệu theo phiếu tự đánh giá "Getting the User's Location". Vì vậy, đây là nơi mà bạn bắt đầu cập nhật:

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

Nếu bạn thực hiện các đại biểu "tự", nó sẽ gửi các sự kiện đến cùng lớp mà phương pháp bắt đầu được xác định, như vậy thì bạn chỉ cần thêm dòng sau vào lấy sự kiện:

- (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]; 
    } 
} 

Bằng cách này, nó sẽ tiếp tục nhận sự kiện rồi tắt bộ thu GPS để tiết kiệm năng lượng. Tất nhiên nó cần một thời gian ra và một số cách để lưu trữ và chấp nhận vị trí với độ chính xác ngang tốt nhất nếu nó lần ra, nhưng tôi đã không tìm ra cách để làm điều đó được nêu ra.

Các vấn đề liên quan