2014-07-21 2 views
8

현재 위치 추적 앱을 만들고 있는데 CLLocationManager에서 부정확 한 위치 업데이트가 어려움이 있습니다. 이로 인해 내 앱이 거리를 추적하게되는데 실제로 부정확 한 GPS 수치로 인한 것입니다. 내 응용 프로그램이 켜져 있고 몇 분 내 응용 프로그램은 단지 때문에이 결함의 거리의 가치가 수백 미터를 추적과코어 위치의 정확성

Inaccurate location readings

난 테이블에 내 아이폰을 남길 수 있습니다. 사전에

- (void)initializeTracking { 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    self.locationManager.distanceFilter = 5; 

    [self.locationManager startUpdatingLocation]; 
} 

감사 :

여기 내 초기화 코드입니다! :-)

+0

나는 직면하고 있습니다. 같은 문제가 U 코드를 업데이트하여 문제를 해결할 수 있습니까? – ChenSmile

+1

@Imran'- (void) initializeTracking'을 절대로 변경 한 적이 없습니다. progrmr 및 Max_Power89의 제안에 따라'- (void) locationManaged : didUpdateLocation' 만 변경했습니다. 지금도 똑같은 일을해야한다면, 다시 구현하지 않을 것입니다. 이 문제를 해결하는 코코아 포드가 있습니다. 예를 들면'INTULocationManager'입니다. –

+0

UR 달콤한 답장을 보내 주셔서 감사합니다. 너는 그것을 할 수 있기를 바란다. U가 (무효화) locationManaged : didUpdateLocation에 어떤 변화를 주 었는지 말해 줄 수 있습니까? 내 문제를 쉽게 해결할 수 있습니다. – ChenSmile

답변

14

비슷한 응용 프로그램에서이 문제를 해결 한 방법 중 하나는 거리 변경이 해당 위치 업데이트에서보고 된 수평 정확도보다 다소 낮은 위치 업데이트를 무시하는 것입니다.

previousLocation이 주어진다면 newLocation의 경우 previousLocation에서 거리를 계산하십시오. 그 distance >= (horizontalAccuracy * 0.5) 그때 우리는 그 위치를 사용하고 그 위치는 우리의 새로운 previousLocation가된다. 거리가 적 으면 해당 위치 업데이트를 무시하고 previousLocation을 변경하지 않고 다음 위치 업데이트를 기다립니다.

우리의 목적에 잘 맞으면 그렇게 할 수도 있습니다. 노이즈가 너무 많은 업데이트를 발견하는 경우 0.5 인수를 늘리거나 0.66을 시도하십시오.

방금 ​​수정을 받기 시작한 경우 위치가 변경된 일련의 위치 정보가 표시되는 경우를 대비하고 싶지만 실제로는 정확도가 크게 향상되고 있습니다.

70 미터가 넘는 수평 정확도로 위치 추적 또는 거리 측정을 시작하지 않을 것입니다. 그것들은 GNSS의 품질이 좋지 않은 위치입니다 만, 도시 협곡, 무거운 나무 캐노피 또는 기타 열악한 신호 조건에서 얻을 수있는 모든 것일 수도 있습니다.

+0

감사합니다.이 접근법은 다른 게시물에 설명 된 정확도 기반 필터링과 함께 실제로 잘 작동합니다. :-) –

0

운영 체제와 현재 리셉션에서 제공하는 기능을 개선하기 위해 할 수있는 일은 많지 않습니다. 처음에는 코드에 문제가없는 것 같지 않습니다. iOS 위치 업데이트와 관련해서는 OS와 서비스가 정말로 필요합니다.

당신이 할 수있는 일은주의해야 할 위치를 제어하는 ​​것입니다. 새로운 위치가있는 OS에서 콜백을 받으면 내 didUpdateLocations 함수에 있었습니까? 사전 정의 된 임계 값보다 큰 수평 정확도를 가진 위치를 무시할 수 있습니까? 당신은 더 적은 위치 업데이트로 끝낼 것이지만 당신은 소음이 적을 것입니다.

+1

할 수있는 일이 많습니다. 책상에 앉아있는 동안 거리 계산을 늘리지 않는 다른 Apps를 볼 수도 있습니다. – AlexWien

+0

"거리 계산을 늘리는 것"은 무엇을 의미합니까? 그는 OS에서보다 정확한 위치 업데이트를 얻을 수있는 방법을 찾고 있습니다. 더 나은 솔루션을 자유롭게 공유 할 수 있다면, 알고 싶다면 흥미로울 것입니다. – Mike

+0

그래픽은 그가 그 길에서 여전히 서 있거나 근처의 건물 안의 그의 (사무실) 책상에 앉아있는 것을 보여줍니다. 두 경우 모두 거리 누적이 증가해서는 안되며 그의 질문을 다시 읽으십시오. 그의 목표는 "거리 추적" – AlexWien

1

이것은 항상 위성 위치에 문제가 있습니다. 예상치이며 예상치는 다를 수 있습니다. 새 보고서는 각각 새로운 예상치입니다. 필요한 것은 움직임이 없을 때 값을 무시하는 위치 클램프입니다.

센서를 사용하여 장치가 실제로 움직이는 지 알 수 있습니다. 가속도계 데이터를 살펴 봅니다. 변화가 없다면 GPS가 있다고해도 장치가 움직이지 않습니다. 물론 가속도계 데이터에는 노이즈가 있으므로 필터링해야합니다.

이것은 해결하기 까다로운 문제입니다.

if newLocation.timestamp.timeIntervalSinceNow > -3 && 
     newLocation.horizontalAccuracy > 0 { 

검색 한 마지막 위치를 더 후 3 초 캡처되지해야합니다

4

나는 (SWIFT에서) 위치의 원하는 정확도

let TIMEOUT_INTERVAL = 3.0 
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    let newLocation = locations.last as! CLLocation 
    println("didupdateLastLocation \(newLocation)") 
    //The last location must not be capured more then 3 seconds ago 
    if newLocation.timestamp.timeIntervalSinceNow > -3 && 
     newLocation.horizontalAccuracy > 0 { 
      var distance = CLLocationDistance(DBL_MAX) 
      if let location = self.lastLocation { 
       distance = newLocation.distanceFromLocation(location) 
      } 
      if self.lastLocation == nil || 
       self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy { 
        self.lastLocation = newLocation 
        if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy { 
         //Desired location Found 
         println("LOCATION FOUND") 
         self.stopLocationManager() 
        } 
      } else if distance < 1 { 
       let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp) 
       if timerInterval >= TIMEOUT_INTERVAL { 
        //Force Stop 
        stopLocationManager() 
       } 
      } 
    } 

을 PIN이이 방법을 사용했습니다 이전 위치는 유효한 수평 정확도를 가져야합니다 (1 미만이면 올바른 위치가 아닙니다). 우리 지역의 마지막 위치에있는 경우

if let location = self.lastLocation { 
       distance = newLocation.distanceFromLocation(location) 
      } 

을 :

  var distance = CLLocationDistance(DBL_MAX) 

가 새 위치로 검색 한 마지막 위치에서의 거리를 계산한다

그런 다음 우리는 기본 값으로 거리를 설정하는거야 아직 설정되지 않았거나 새 위치가 수평 정확도가 높으면 실제 위치가 정확하면 새 위치로 로컬 위치를 설정합니다.

if self.lastLocation == nil || 
     self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy { 
      self.lastLocation = newLocation 

다음 단계는 검색된 위치의 정확성이 충분히 좋은지 확인하는 것입니다. 이를 수행하기 위해 location의 horizontalDistance가 desiredAccurancy가 아닌지 검색합니다. 이 경우라면 우리는 우리의 매니저 중지 할 수 있습니다 : 우리가 마지막으로 검색 한 위치와 새로운 위치에서의 거리가 한 (뜻 적은 있는지 확인하는거야 마지막 if으로

if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy { 
         //Desired location Found 
         self.stopLocationManager() 
        } 

를 2 곳이 매우 가깝습니다.) 만약 그렇다면 우리는 검색된 마지막 위치로부터 시간 간격을 얻고 새로운 위치를 검색 할 것입니다. 간격이 3 초 이상인지 확인하십시오. 이 경우 3 초 이내에 위치가 정확하지 않아 위치 서비스가 더 이상 필요하지 않으므로 위치 서비스를 중지 할 수 있습니다.

else if distance < 1 { 
       let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp) 
       if timerInterval >= TIMEOUT_INTERVAL { 
        //Force Stop 
        println("Stop location timeout") 
        stopLocationManager() 
       } 
      } 
+0

U가 객관적인 C에서이 코드를 변환 할 수 있다면 ur point를 얻는 것이 훨씬 쉬울 것입니다 ..thanks – ChenSmile

+1

desiredAccuracy에 대해 kCLLocationAccuracyBest를 사용하고 있으며 -1입니다. 내가 잘못 본 것이 아니라면 horizontalAccuracy <0은 유효하지 않은 값이므로 버려야합니다. 코드의이 줄은 "if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy"입니다. 거의 실행되지 않습니다. – user30646