【问题标题】:How to get current location or move to current location in Xamarin.Forms.Map如何在 Xamarin.Forms.Map 中获取当前位置或移动到当前位置
【发布时间】:2016-08-06 10:40:04
【问题描述】:

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

【问题讨论】:

    标签: c# xamarin maps xamarin.forms


    【解决方案1】:

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

    【讨论】:

    • 什么是locator?这在文章中从未解释过
    • @Bassie 这是 var locator = CrossGeolocator.Current;
    • 喜欢这个控件,我只是在看到/让蓝点出现在 iphone 上时遇到问题......有什么想法吗?我不在乎,但是客户希望蓝点显示用户在哪里...我可以很好地移动到区域并获取我的位置,将地图居中到我的位置,只是看不到任何蓝点,例如地图...
    • @TimMaxey 你应该在你的地图实例上将IsShowingUser 设置为true
    • 现在我们可以使用 Xamarin.Forms Essentials,它包含地理定位和其他功能 github.com/xamarin/Essentials/blob/master/Samples/Samples/…
    【解决方案2】:

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

    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/

    【讨论】:

      【解决方案3】:

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

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

      来自苹果纪录片:

      将此属性设置为 YES 会导致地图视图使用核心位置框架来查找当前位置并尝试将其显示在地图上。

      来源: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;
      

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

      【讨论】:

        猜你喜欢
        • 2016-03-06
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多