如何获取当前位置或移动到 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.
那么如何在 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;
不要忘记注销此活动。仅将其用于通常的初始化行为。用户应该可以随心所欲地在地图上自由滚动。
由于地图已经显示了用户位置(使用 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.
那么如何在 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;
不要忘记注销此活动。仅将其用于通常的初始化行为。用户应该可以随心所欲地在地图上自由滚动。