2011-02-09 6 views
9

응용 프로그램을 새로 시작하거나 오랜 시간이 지나면 다시 시작하면 MKMapView의 userLocation 개념이 잘못되어 바다 중간에 나를 보여줍니다. 이것은 불행하게도 GPS 칩의 기능입니다 ....시작 또는 재개시 MKMapView의 사용자 위치가 잘못되었습니다

+0

이 문제에 대한 해결책을 찾았습니까? lat : 0.0, long : 0.0에 위치 했습니까? – mbogh

+0

나는이 같은 문제에 대해서도 다뤘지만, 온라인으로 해결 방법에 대한 정보는 거의 없다. 내가 마지막으로 알려진 위치를 사용하는 것보다 깨끗한 방법이 있다면 궁금합니다. –

답변

1

self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate; 
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES]; 

은 응용 프로그램 또는 새로운 시작의 긴 이력서 후 발생합니다

나는 다음과 같은 코드를 사용하고 있습니다. 항상 켜져있는 것은 아니므로 처음 몇 순간에는 데이터가 잘못 될 것입니다. 최선의 방법은 NSUserDefaults에 앱이 기록한 마지막 위치를 저장 한 다음 실시간 데이터로 전환하기 전에 원하는 위치에 정밀도가 올 때까지 기다리거나 정밀도가 원하는 위치에 올 때까지 MkMapView를 숨기는 것입니다. 그런 다음 그 시점에 표시하십시오 (중간에 로딩 화면을 표시 할 수 있음)

+0

정밀도가 정확한지 어떻게 확인합니까? 그것이 올 때까지 나는 실속 할 수있다. 그러나 나는 그것을 어떻게 확인 하느냐? –

+0

call - CLLocationManager에서 startUpdatingLocation을 호출 한 다음 위임자의 locationManager : didUpdateToLocation : fromLocation :을 재정의합니다. 마지막으로 알려진 위치를 저장하는 경우 사용자가 마지막 위치에서 적당한 거리를두고지도를 표시 할 때를 결정할 수 있습니다 –

0

실제 위치에서 얼마나 떨어져 있습니까? 응용 프로그램을 시작하거나 오랜 기간 동안 다시 시작하면 사용자 위치는 항상 처음부터 잘못 표시됩니다. 응용 프로그램이 실행되면 점점 더 정확해질 것입니다. CLLocationManager에서 사용자 위치의 정확성을 얻는 방법이 있습니다. 어떤 값을 얻었는지보십시오.

+0

응용 프로그램을로드하는 동안 기다려야합니까? 수면? –

1

Jeremy Massel이 쓴 것처럼 앱 시작/계속에서 첫 번째 나쁜 위치를 정리해야합니다. 좋은 블로그가 몇 달 전을 게시 발견 : - 그것은 (예를 들어, 기본 위치를하는 것이 좋다 - 응용 프로그램이 도시에 관한

첫째, 내 응용 프로그램에서

http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/

1

나는이 방법을 사용 - 전체 도시를 확대하려면 첫 번째 앱을 엽니 다. 데이터가 다운로드되지 않으면 첫 번째 앱을 엽니 다.

두 번째 - 사용자가 이미지도를 사용한 경우 - 좌표를 저장할 수 있고 (+ span (확대/축소) 수준) 사용할 수있는 다른 데이터가없는 경우. 데이터의 경우 -

셋째 -) 애플리케이션이 종료 된 제지도 개구 (온 - 데이터베이스가 이미 일부 좌표가있는 경우

1) 맵의 모든 핀을 표시 아웃/줌.

2) 여전히지도에서 바로 업데이트 (새 위치 또는 변경 뭔가를) 도착, 두 가지 가능성이 있습니다 :

2.1) 사용자가 어느 위치에 확대되지 않은 경우 -지도. 확대/축소하여 모든 위치를 표시합니다. . 사용자가 확대 한 경우

2.2)는 - 위치를 업데이트하지만,지도 나던 축소

당연히

있습니다 - 다음 몇 가지 필터 예를 들어 버튼 (도 있습니다 : 검색, 사용자 위치, 좀 더이 - 필터링 된 결과를 표시하기 위해 위치를 필터링하고 확대/축소합니다.)

21

예상되는 동작입니다. 사용자 위치가 GPS를 사용하여 iPhone에서 항상 추적되는 것은 아닙니다 (배터리를 많이 소모 할 수 있음).따라서지도가 표시되자 마자 MKMapView 인스턴스는 알고있는 마지막 '최상의'사용자 위치를 표시 한 다음 추적을 활성화하여 정확도를 향상시킵니다 (이 과정은 매끄러운 과정이므로 걱정할 필요가 없습니다).

MKMapViewDelegate 프로토콜을 구현하면 MKMapView이지도에서 사용자 위치를 업데이트 할 때를 모니터링 할 수 있습니다. 그냥 구현 :

내 예에서 위의 코드는 현재지도보기에 표시되는 위치의 정확도를 확인하고 그에 따라 반응

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation  { 
    CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy; 
    if (accuracy ......) { 
    } 
} 

(사과 문서 here에서 더 많은 정보를). 처음에는 바다의 중간에 사용자 위치를 보여주는 정말 당신을 귀찮게하면 당신은 충분히 신선/정확한 위치를 얻을 때까지

[편집]
, 당신은 당신이 사용자의 위치를 ​​숨길 수 있습니다.
충분한 위 치를 얻을 때까지 (이전 위임 콜백 덕분에) 처음에 의 showsUserLocation 속성을 NO으로 설정 한 다음 YES으로 설정하십시오. 당신을 이렇게함으로써
, 당신은 미리 보여줍니다 할 정확하거나 너무 나이가 아닌 위치를 표시 피할 수

NB (이 오래된 위치 또는 말든 CLLocation에서 timestamp 속성을 확인할 수있다) : 당신은 옆에 CLLocationManager 인스턴스를 만들어야하는 경우 MKMapView는 내부적으로 인스턴스를 만들고이 대리자 선택기를 통해받은 위치를 게시합니다.

+2

+1이 질문의 바다 부분 중간에 시청자를 가장 먼저 언급 한 사람입니다. –

1

내가 여기서 할 것은 - 이것도

  1. 시작 위치 업데이트

  2. 위치 업데이트에
  3. , 너무 오래된 있다면, 나는 그것을 업데이트 새 업데이트를 수신에
  4. 기다린 위치의 나이를 확인 지도에

매우 정확한 위치가 필요하면 정확도뿐만 아니라 대기 시간을 허용 할 수없는 시간 초과와 덜 정확한 수정을 사용하십시오.

+0

위도와 경도가 0인지 확인하고이 대답을 통해 문제를 처리하는 방법입니다 – AtomRiot

4

CLLocationManager를 직접 사용하는 경우 일반적으로 첫 번째 콜백에 캐시 된 위치가 표시됩니다. 오래되었지만 일반적으로 좋은 위치입니다. 그런 다음 Wi-Fi, 셀 타워 (사용 가능한 경우)를 사용하여 더 나은 위치를 제공하는 추가 콜백을 신속하게 얻습니다. < 1000m 정확도를 요청한 경우 (몇 초 후에) GPS 삼각 측량을 얻을 수 있습니다.

바다 가운데에있을만큼 정확하지 않은 것은 없습니다.

self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate; 

userLocation 또는 locationnil 동안 좌표에 액세스 : 나는 코드의이 줄 것으로 생각한다. userLocation 또는 location이 nil이면 0 좌표를 반환합니다. lat = 0, lon = 0의 위치는 아프리카 연안의 대서양에 있습니다.당신은, 그것에서 좌표를 얻기 전에 전무 있지 않은지 확인하기 위해 location의 검사를 추가 할 수 있습니다 예 : 당신은 또한 유효한 위치가있을 때 알 수 있도록 MKMapViewDelegatemapView:didUpdateUserLocation:에 콜백을 대기 할 것

if (self.mapView.userLocation.location) { 
    self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate; 
    [mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];   
} 

유효한. didUpdateUserLocation:을 구현하면 유효하지 않은 위치를 나타내는 horizontalAccuracy <이있는 위치는 삭제해야합니다.

-(void)mapView:(MKMapView*)mapView didUpdateUserLocation:(MKUserLocation*)userLocation 
{ 
    if (userLocation.location.horizontalAccuracy > 0) { 
     [mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];   
    } 
} 
+0

지도에서 중동 문제를 해결했습니다. 감사합니다. –

관련 문제