2011-02-09 4 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 - (void)CLLocationManagerのstartUpdatingLocationを呼び出し、次にlocationManager:didUpdateToLocation:fromLocation:をデリゲートにオーバーライドします。最後の既知の位置を保存している場合は、ユーザーが最後の位置から妥当な距離を離れているかどうかを判断し、地図を表示することができます –

0

実際の場所からどのくらい離れていますか?アプリケーションがちょうど開始または長い時間の期間から再開するとき、ユーザーの場所は一般的に間違っています。アプリケーションが実行されるにつれて、それはますます正確になります。 CLLocationManagerのユーザ位置の精度を取得する方法がありますが、そこにどのような値が入っているかを見てください。

+0

アプリケーションのロードを待つ必要がありますか?睡眠のように? –

1

Jeremy Masselが書いたように、アプリの最初の不良位置を並べ替える必要があります。偉大なブログは、数ヶ月前に投稿が見つかりました: - それは例えば(デフォルトポジションを持っている良いことだ - アプリケーションは都市についてです

まず:私のアプリで

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

1

は、私はこれらのメソッドを使用しました - 都市全体を表示するために拡大)

第2 - 既にマップを使用している場合 - 自分の座標を保存し、それらの(スパン(ズーム)レベルを表示することができます)利用可能な他のデータがない場合。

三 - データの場合:

1)データベースがすでに座標た場合 - 第1の地図の開口部には、(アプリケーションが閉じられたとき) - 地図上のすべてのピンを表示するように/でズームアウト。まだマップ内だけを更新(新しい場所に到着したか何かを変え

2))、二つの可能性があります。

2.1)ユーザーは任意の場所にズームインしていない場合 - 地図。ズームインしてすべての場所を表示します。 。

2.2)は、ユーザがズームインしている場合 - 位置が更新されるが、勿論アウトdoesntのズーム

をマッピング - 次に、いくつかのフィルタボタンは、例えば、(もある:検索、ユーザの場所、およびいくつかのより多くの -

21

これは予想された動作です.Googleを使用してユーザーの場所がiPhoneで常に追跡されるわけではありません(電池が多量に消費されます)。だから地図が表示されるとすぐに、MKMapViewインスタンスは、知っている最後の「最良の」ユーザ位置を表示し、追跡を有効にすることで精度を向上させます(これはシームレスなプロセスなので気にする必要はありません)。

MKMapViewDelegateプロトコルを実装すると、MKMapViewがマップ上のユーザーの場所をいつ更新するかを監視できます。ただ、実装:

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

(リンゴのドキュメントhereから詳細情報)

を私の例では、上記のコードは、現在のMapViewで表示されている位置の精度をチェックし、それに応じて反応します。

[編集]
海の真ん中にユーザーの場所を表示すると、最初は本当に気になりますが、ユーザーが正確な場所になるまでユーザーの場所を隠すことができます。
正確に十分な場所(以前のデリゲートコールバックのおかげで)を得てからそれをYESに設定するまで、最初にのshowsUserLocationプロパティをNOに設定します。
あなたを行うことで、あなたは正確またはdiplayedれるには余りにも古くない場所(それは古い場所かではありません天気を確認するCLLocationtimestampプロパティがあります)

NB表示されないようにします:あなたがCLLocationManagerインスタンスを作成する必要がありません.MKMapViewは内部的にインスタンスを作成し、このデリゲートセレクタを介して受け取る場所を公開します。

+2

+1あなたはこの質問の海の真ん中で視聴に対処する最初の人です。 –

1

私はここでやっていることはIS-

  1. 開始位置の更新

  2. 位置更新の
  3. 、それはあまりにも古いなら、私はそれを更新し、新たなアップデートを受け取るに
  4. を待って、場所の年齢を確認します

正確な位置情報が必要な場合は、正確さをチェックし、それ以上の時間を待つことはできません。

+0

latとlonが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の位置は、アフリカの沖合である大西洋にあります。あなたは、それは、それから座標取得する前にnilでないことを確認する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 <という0の場所は破棄する必要があります。

-(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

地図の中の海の問題を修正しました。ありがとうございます! –

関連する問題