如何获取当前位置或移动到 Xamarin.Forms.Map 中的当前位置

How to get current location or move to current location in Xamarin.Forms.Map

由于地图已经显示了用户位置(使用 IsShowingUser),我只想缩放到该位置。这是否很容易实现,或者我是否需要在每个平台上获取位置,因为我没有找到任何 GeoLocation 对象。只有地理编码器... 这不是缩放到用户位置的常见用例吗?

您需要用您感兴趣的职位调用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)));

更新:Xamarin Forms 现在默认包含 Xamarin.Essentials: Geolocation

将地图居中放置在您所在的位置:

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/

Is this not a common usecase to zoom to users position?

是的,是的。 iOS 只需使用 MKMapView ShowUserLocation 属性.

来自 Apple 纪录片:

Setting this property to YES causes the map view to use the Core Location framework to find the current location and try to display it on the map.

来源: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 还无法获取用户位置。因此,如果您需要在地图出现时显示当前用户位置,只需为 MKUserLocationEventArgs 使用 EventHandler 并使用 DidUpdateUserLocation 事件。你可以这样做:

private EventHandler<MKUserLocationEventArgs> _didUpdateUserLocationEventHandler;

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

不要忘记注销此活动。仅将其用于通常的初始化行为。用户应该可以随心所欲地在地图上自由滚动。