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

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

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

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

 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/

这不是缩放到用户位置的常用用例吗?

是的。 对于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 _didUpdateUserLocationEventHandler; // In OnElementChanged: _didUpdateUserLocationEventHandler = (_, __) => { MoveToCurrentPosition(); nativeMap.DidUpdateUserLocation -= _didUpdateUserLocationEventHandler; }; nativeMap.DidUpdateUserLocation += _didUpdateUserLocationEventHandler; 

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