2012-05-24 44 views
10

Tôi đang sử dụng Location Services trong một số ứng dụng của mình. Tôi có một phương pháp mà tôi sử dụng trong phương pháp locationManager:didUpdateToLocation:fromLocation: của mình để lọc ra các vị trí xấu, không chính xác hoặc quá xa. Và để giảm thiểu gps "jitter". Dưới đây là những gì tôi sử dụng:Dịch vụ vị trí trên iOS Phương pháp lọc ra các vị trí không hợp lệ/không chính xác

/** 
* Check if we have a valid location 
* 
* @version $Revision: 0.1 
*/ 
+ (BOOL)isValidLocation:(CLLocation *)newLocation withOldLocation:(CLLocation *)oldLocation { 

    // Filter out nil locations 
    if (!newLocation) return NO; 

    // Filter out points by invalid accuracy 
    if (newLocation.horizontalAccuracy < 0) return NO; 
    if (newLocation.horizontalAccuracy > 66) return NO; 

    // Filter out points by invalid accuracy 
    #if !TARGET_IPHONE_SIMULATOR 
    if (newLocation.verticalAccuracy < 0) return NO; 
    #endif 

    // Filter out points that are out of order 
    NSTimeInterval secondsSinceLastPoint = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp]; 
    if (secondsSinceLastPoint < 0) return NO; 

    // Make sure the update is new not cached 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5.0) return NO; 

    // Check to see if old and new are the same 
    if ((oldLocation.coordinate.latitude == newLocation.coordinate.latitude) && (oldLocation.coordinate.longitude == newLocation.coordinate.longitude)) 
     return NO; 

    return YES; 

}//end 

Có ai có bất kỳ cải tiến nào về phương pháp này để làm cho nó chính xác hơn không? Có phải quá cao của horizontalAccuracy và sẽ nhận được nhiều vị trí không hợp lệ? Tôi có nên hạ thấp điều này?

Có cách nào để có được đi xe của "jitter" mà gps trên iPhone cho?

+0

Tôi bắt đầu làm việc trên một cái gì đó tương tự. Tôi đang suy nghĩ về việc thực hiện một bộ lọc Kalman, nhưng tôi không chắc chắn nếu điều này sẽ được hơn giết. Tôi quan tâm để xem câu trả lời của mọi người về câu hỏi này. – scord

+0

Vâng, tôi cũng nhìn vào một bộ lọc Kalman, nhưng toán học cho điều đó thật điên rồ. –

Trả lời

6

Ngoài những có một tôi càng sử dụng:

if(self.lastKnownLocation) 
{ 
    CLLocationDistance dist = [newLocation distanceFromLocation:self.lastKnownLocation]; 

    if(dist > newLocation.horizontalAccuracy) 
    { 
      //..... 
    } 
} 

đâu self.lastKnownLocation thực sự là địa điểm hợp lệ cuối cùng tôi có và đó là một:

@property(nonatomic, copy) CLLocation *lastKnownLocation; 
+0

Điều này trông giống như một bổ sung tốt. Những gì bạn sử dụng cho một horizontalAccuracy chấp nhận được? –

+0

0 đến 60 .. Tôi đang thực hiện theo dõi đi bộ và cho đến nay tôi có kết quả tốt với cái này và những cái mà bạn đã đăng. – graver

+0

Bạn đã gặp sự cố chỉ chấp nhận các vị trí <60? Tôi đang có báo cáo từ người dùng rằng ứng dụng của tôi không bao giờ tìm thấy vị trí của họ vì độ chính xác ngang của họ dường như chưa bao giờ dưới 60. Tôi có nên xóa toàn bộ séc này không? –

5
-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
if (!newLocation) 
    { 
     NSLog(@"Filter out points by invalid accuracy"); 
     return; 
    } 

    // Filter out points by invalid accuracy 
    if (newLocation.horizontalAccuracy < 0) 
    { 
     return; 
    } 
    if(oldLocation.coordinate.latitude>90 && oldLocation.coordinate.latitude<-90 && oldLocation.coordinate.longitude>180 && oldLocation.coordinate.longitude<-180) 
    { 
     NSLog(@"old"); 
     return; 
    } 
    if(newLocation.coordinate.latitude>90 || newLocation.coordinate.latitude<-90 || newLocation.coordinate.longitude>180 || newLocation.coordinate.longitude<-180) 
    { 
     NSLog(@"new"); 
     return; 
    } 

    /////// 
    NSDate *eventDate=newLocation.timestamp; 
    NSTimeInterval eventinterval=[eventDate timeIntervalSinceNow]; 


    if (abs(eventinterval)<30.0) 
    {   
     if (newLocation.horizontalAccuracy>=0 && newLocation.horizontalAccuracy<20) 
     { 
      **//finally you are getting right updated value here....** 
     }   
    }   
} 
0

Bạn có thể kiểm này

https://medium.com/@mizutori/make-it-even-better-than-nike-how-to-filter-locations-tracking-highly-accurate-location-in-774be045f8d6

.210

Ý tưởng chính là để filer dữ liệu trong phương pháp didUpdateLocation:

Phương pháp lọc chỉ là như thế này:

func filterAndAddLocation(_ location: CLLocation) -> Bool{ 
    let age = -location.timestamp.timeIntervalSinceNow 

    if age > 10{ 
     return false 
    } 

    if location.horizontalAccuracy < 0{ 
     return false 
    } 

    if location.horizontalAccuracy > 100{ 
     return false 
    } 

    locationDataArray.append(location) 

    return true 

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