アプリケーションを新しく起動するか、または長時間経過してから再開すると、MKMapViewのuserLocationの概念は間違っていて、海の真中に私を示します。これは、残念ながらGPSチップの機能です....起動時または再開時にMKMapViewのユーザーの場所が間違っています
答えて
を
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
アプリやブランドの新しいスタートの長い履歴書の後に行われます
私は、次のコードを使用しています。それは常にオンではないので、データは通常、最初の数瞬間は間違っています。最善の策は、おそらく、NSUserDefaultsのアプリケーションで記録された最後の位置を保存し、次にライブデータに切り替える前に精度を待つか、精度が必要な場所になるまでMkMapViewを非表示にすることですその時点で表示してください(その間に読み込み画面を表示することができます)
精度が正しいことを確認するにはどうすればよいですか?それが正しいまで私はストールすることができますが、どうすればそれを確認できますか? –
call - (void)CLLocationManagerのstartUpdatingLocationを呼び出し、次にlocationManager:didUpdateToLocation:fromLocation:をデリゲートにオーバーライドします。最後の既知の位置を保存している場合は、ユーザーが最後の位置から妥当な距離を離れているかどうかを判断し、地図を表示することができます –
実際の場所からどのくらい離れていますか?アプリケーションがちょうど開始または長い時間の期間から再開するとき、ユーザーの場所は一般的に間違っています。アプリケーションが実行されるにつれて、それはますます正確になります。 CLLocationManagerのユーザ位置の精度を取得する方法がありますが、そこにどのような値が入っているかを見てください。
アプリケーションのロードを待つ必要がありますか?睡眠のように? –
Jeremy Masselが書いたように、アプリの最初の不良位置を並べ替える必要があります。偉大なブログは、数ヶ月前に投稿が見つかりました: - それは例えば(デフォルトポジションを持っている良いことだ - アプリケーションは都市についてです
まず:私のアプリで
http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/
は、私はこれらのメソッドを使用しました - 都市全体を表示するために拡大)
第2 - 既にマップを使用している場合 - 自分の座標を保存し、それらの(スパン(ズーム)レベルを表示することができます)利用可能な他のデータがない場合。
三 - データの場合:
1)データベースがすでに座標た場合 - 第1の地図の開口部には、(アプリケーションが閉じられたとき) - 地図上のすべてのピンを表示するように/でズームアウト。まだマップ内だけを更新(新しい場所に到着したか何かを変え
2))、二つの可能性があります。
2.1)ユーザーは任意の場所にズームインしていない場合 - 地図。ズームインしてすべての場所を表示します。 。
2.2)は、ユーザがズームインしている場合 - 位置が更新されるが、勿論アウトdoesntのズーム
をマッピング - 次に、いくつかのフィルタボタンは、例えば、(もある:検索、ユーザの場所、およびいくつかのより多くの -
これは予想された動作です.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れるには余りにも古くない場所(それは古い場所かではありません天気を確認するCLLocation
でtimestamp
プロパティがあります)
NB表示されないようにします:あなたがはCLLocationManager
インスタンスを作成する必要がありません.MKMapViewは内部的にインスタンスを作成し、このデリゲートセレクタを介して受け取る場所を公開します。
+1あなたはこの質問の海の真ん中で視聴に対処する最初の人です。 –
私はここでやっていることはIS-
- 開始位置の更新 位置更新の
- 、それはあまりにも古いなら、私はそれを更新し、新たなアップデートを受け取るに
- を待って、場所の年齢を確認します
正確な位置情報が必要な場合は、正確さをチェックし、それ以上の時間を待つことはできません。
latとlonが0になっているかどうかを確認してください。この答えは問題をどのように扱うかです。 – AtomRiot
CLLocationManagerを直接使用すると、通常、最初のコールバックでキャッシュされた場所が取得されます。それは通常は良い場所ですが、古いです。その後、Wi-Fi、セルタワー(利用可能な場合)を使用してより良い場所を与える追加のコールバックをすぐに取得します。 <の精度が1000mの場合は、GPSの三角測量を(さらに数秒後に)行います。
これらのどれも海の真ん中にあるほど不正確ではありません。
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
userLocation
またはlocation
がnil
ている間座標アクセスしている:私は、このコード行は、と思われます。 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];
}
}
地図の中の海の問題を修正しました。ありがとうございます! –
- 1. 間違った時刻にwscript.sleepが起こっています
- 2. DataGridView RowEnterは間違った時刻に起動します
- 3. STM32L151 - 時々間違ったアドレスでデバッガが起動します。
- 4. UISplitViewControllerが起動時に間違ったViewControllerを表示する
- 5. [NSEvent mouseLocation]を使った場所が間違っています
- 6. 日時が間違っています。
- 7. マップボックススタイルが間違った場所にロードされています
- 8. iPhoneが時間間隔でユーザーの場所を取得しています
- 9. スライダが間違った場所で起動するのはなぜですか?
- 10. ViewPagerが間違った場所で開始していますか?
- 11. Jythonのロギングに時間が間違っています
- 12. 2タイムスタンプ間の時間差が間違っています(hh:mm:ss)
- 13. 起動から所定の時間にアクティビティを開く方法
- 14. iPhoneのSQLiteタイムスタンプの時間が間違っています
- 15. アクカアクタは時間の経過後に再起動します
- 16. UIPopoverが再配置されますが、間違った場所に
- 17. 再起動時にサービスが最初に開始されます
- 18. エラーバーの場所が間違っています
- 19. DBへの保存場所が間違っています
- 20. 現在の場所が間違っていますか?
- 21. ツールチップが間違った場所に
- 22. 別のユーザーで再起動時にTomcatを起動する
- 23. NSDateFormatter dateFromStringが24時間日付に間違っています
- 24. 間違った場所
- 25. 間違った時間@JsonFormat(1時間)
- 26. 追加時にJavascriptの日が間違っていますか?
- 27. ソース時にCygwinのbashスクリプトが間違っています
- 28. アプリケーションが開いているまで間違った場所になっているGoogleマップアプリケーション
- 29. SpringスケジュールされたCronジョブが間違った時刻に起動する
- 30. 開始時のv3ネットワーク(Tensorflow)のラベルが間違っています
ねえ、この問題の解決策を見つけましたか? lat:0.0、long:0.0の位置がありましたか? – mbogh
私もこの同じ問題にヒットしましたが、それを解決する方法に関する情報はほとんどありません。私は最後の知られている場所を使用する以外のクリーナーの方法がある場合は、好奇心が強いです。 –