Как получить текущее местоположение или перейти в текущее местоположение в Xamarin.Формы.Карта

поскольку карта уже показывает местоположение пользователя (с IsShowingUser), я просто хочу увеличить это местоположение. Это легко возможно или мне нужно получить местоположение на каждой платформе, так как я не нахожу никакого объекта геолокации. Только геокодер... Не является ли это общим usecase для увеличения позиции пользователей?

3 ответов


нужно позвонить MoveToRegion метод с интересующей вас позицией.

можно использовать плагин Geolocator для 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))

центр карты на вашем месте:

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));

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


не является ли это общим usecase для увеличения до позиции пользователей?

Да, это так. Для iOS просто используйте MKMapView ShowUserLocation собственность.

из документального фильма Apple:

установка для этого свойства значения да приводит к тому, что представление карты использует ядро Location framework, чтобы найти текущее местоположение и попытаться отобразить его на карте.

источник: https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapView_Class/#//apple_ref/occ/instp/MKMapView/showsUserLocation

Итак, как вы можете сделать это в Xamarin? Вам понадобится пользовательский рендерер, который расширяет Xamarin Forms MapRenderer. Получите собственную карту и задайте свойству ShowUserLocation значение true.

вот пример:

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

  nativeMap.ShowsUserLocation = true;
}

и набор nativeMap.SetUserTrackingMode(MKUserTrackingMode.Follow, true); автоматически следовать пользователь.

это может не работать, когда карта инициализирована, так как iOS еще не может получить местоположение пользователя. Поэтому, если вам нужно отобразить текущее местоположение пользователя при появлении карты, просто используйте EventHandler для MKUserLocationEventArgs и с помощью DidUpdateUserLocation событие. Вы можете сделать это так:

private EventHandler<MKUserLocationEventArgs> _didUpdateUserLocationEventHandler;

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

Не забудьте отменить регистрацию этого события. Используйте его только для обычного поведения инициализации. Пользователь должен быть свободен прокручивать карту, как ему нравится.