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

时间:2016-04-14 17:54:19

标签: c# xamarin maps xamarin.forms

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

3 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:5)

将地图置于您所在位置的中心位置:

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/

答案 2 :(得分: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;

不要忘记取消注册此活动。仅用于通常的初始化行为。用户可以随意在地图上滚动。