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

25

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

3个回答

33

您需要使用MoveToRegion方法,并传入您感兴趣的位置。

您可以在PCL项目中使用Xamarin的Geolocator插件来获取位置:

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


2
“locator”是什么?这篇文章从未解释过。 - Bassie
2
@Bassie,这是变量定位器 = CrossGeolocator.Current; - andrei
喜欢这个控件,但我遇到了一个问题,在iPhone上无法看到/获取蓝点的位置...有什么想法吗?我不在意它,但客户希望在用户所在位置显示蓝点...我可以很好地移动到区域并获取我的位置,将地图居中到我的位置,只是看不到任何蓝点,就像在地图中一样... - Tim Maxey
@TimMaxey,你应该在地图实例上将“IsShowingUser”设置为“true”。 - anitteb
现在我们可以使用Xamarin.Forms Essentials,其中包含地理位置和其他功能 https://github.com/xamarin/Essentials/blob/master/Samples/Samples/ViewModel/GeolocationViewModel.cs - Tony

8

将地图居中显示在您的位置:

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/ 这是一篇介绍如何在Xamarin.Forms中使用地图的教程。在此教程中,您将学习如何在iOS和Android设备上显示地图,并在地图上添加标记和自定义信息窗口。您还将了解如何与地图交互以及如何使用地理编码器将地理位置转换为地址。

0
这不是缩放到用户位置的常见用例吗?
是的,确实如此。对于 iOS,只需使用 MKMapView 的 ShowUserLocation 属性即可。
来自 Apple 文档:
将该属性设置为 YES 会导致地图视图使用 Core Location 框架查找当前位置并尝试在地图上显示它。
来源: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;

不要忘记取消注册此事件。仅在常规初始化行为中使用它。用户应该可以自由地在地图上滚动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接