web-dev-qa-db-ja.com

Xamarin.Forms.Mapで現在の場所を取得または現在の場所に移動する方法

マップには既にユーザーの場所が表示されているため(IsShowingUserを使用)、この場所にズームしたいだけです。 GeoLocationオブジェクトが見つからないため、これは簡単に可能ですか、またはすべてのプラットフォームで位置を取得する必要がありますか。 GeoCoderのみ...これは、ユーザーの位置にズームする一般的なユースケースではありませんか?

15
Matt

興味のある位置でMoveToRegionメソッドを呼び出す必要があります。

Geolocator Plugin for Xamarin を使用して、PCLプロジェクトの場所を取得できます。

var locator = CrossGeolocator.Current;
var position = await locator.GetPositionAsync(10000);
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position. Longitude), 
                                             Distance.FromMiles(1))
21
Giorgi

地図をあなたの場所の中心に置きます:

var position = await locator.GetPositionAsync(5000);
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position.Longitude), Distance.FromMiles(1))

現在の位置で地図をズームします。

var zoomLevel = 9; // between 1 and 18
var latlongdegrees = 360 / (Math.Pow(2, zoomLevel));
map.MoveToRegion(new MapSpan (map.VisibleRegion.Center, latlongdegrees, latlongdegrees));

参照: https://developer.xamarin.com/guides/xamarin-forms/working-with/maps/

6
SushiHangover

これは、ユーザーの位置にズームする一般的なユースケースではありませんか?

はい、そうです。 iOSの場合は、MKMapView ShowUserLocationプロパティを使用します。

From Appleドキュメンタリー:

このプロパティをYESに設定すると、マップビューはCore Locationフレームワークを使用して現在の場所を見つけ、地図上に表示しようとします。

ソース: https://developer.Apple.com/library/ios/documentation/MapKit/Reference/MKMapView_Class/#//Apple_ref/occ/instp/MKMapView/showsUserLocation

それでは、Xamarinでどのようにできますか? Xamarin FormsMapRendererを拡張するカスタムレンダラーが必要です。ネイティブマップを取得し、ShowUserLocationプロパティをtrueに設定します。

以下に例を示します。

_private void MoveToCurrentPosition()
{
  var nativeMap = Control as MKMapView;
  if (nativeMap == null)
    return;

  nativeMap.ShowsUserLocation = true;
}
_

また、nativeMap.SetUserTrackingMode(MKUserTrackingMode.Follow, true);を設定して、ユーザーを自動的にフォローします。

IOSはまだユーザーの位置を取得できなかったため、これはマップが初期化されたときに機能しない場合があります。したがって、マップが表示されたときに現在のユーザーの場所を表示する必要がある場合は、MKUserLocationEventArgsにEventHandlerを使用し、DidUpdateUserLocationイベントを使用します。次のようにできます:

_private EventHandler<MKUserLocationEventArgs> _didUpdateUserLocationEventHandler;

// In OnElementChanged:
_didUpdateUserLocationEventHandler = (_, __) =>
{
    MoveToCurrentPosition();
    nativeMap.DidUpdateUserLocation -= _didUpdateUserLocationEventHandler;
};
nativeMap.DidUpdateUserLocation += _didUpdateUserLocationEventHandler;
_

このイベントの登録を忘れないでください。通常の初期化動作にのみ使用します。ユーザーは好きなように地図を自由にスクロールできるはずです。

0
jfmg