MapsUI 始终在 LatLng 0,0 处显示 "own location" 标记

MapsUI always shows "own location" marker at LatLng 0,0

我的 MapsUI 2.0.3 有问题,我自己的位置标记始终位于非洲西部 0,0。单击“关注自己的位置”按钮显然也会让我移动到那里。

我确实添加了粗略和精细的位置权限以显示并确实获得了访问位置的权限,但“你在这里”始终是 0,0。

然后我下载了 MapsUI 存储库,并尝试了示例,它们大多表现出相同的行为。加载地图时,它显示位置为 0,0。如果我稍微拖动地图,标记就会慢慢移动到我的正确位置。如果我(在示例中)重新加载相同的示例或另一个示例,即使我拖动地图,标记仍然停留在 0,0。总之,我可以通过与地图交互来“修复”0,0 标记,但只有一次。

我的设备确实启用了 gps 定位,并且使用应用程序的其他定位工作正常。这包括其他自制的 Xamarin 表单应用程序,因此这只是 MapsUI 的问题。

样本和自己的代码都失败了,这让人有点困惑。 这会为任何人敲响警钟吗?至少可以说有点奇怪。

请注意,这在具有设置位置的 xamagin/android 设备模拟器上也会失败。只是提到这是一个“有趣”的额外细节,地图长按事件永远不会在我的设备上触发,但可以在模拟器上运行。很久以前我看到其他人抱怨同样的问题,一个开发人员评论它在 2.0 中被修复,而我在 2.3 中看到它。总而言之,MapsUI 似乎是一个非常丰富的系统,我很想使用它,但它有奇怪的小错误和糟糕的支持。

添加地图视图xaml

<StackLayout>
  <mapsui:MapView x:Name="mapView" IsMyLocationButtonVisible="True" />
</StackLayout>

和 C# 设置

void start()
{
  var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
  if(status==PermissionStatus.Denied) return;  
  
var map = new Mapsui.Map
  {
    Transformation = new MinimalTransformation(),CRS = "EPSG:3857"};
    
    var tileSource = new HttpTileSource(new GlobalSphericalMercator(),
      "https://tile.thunderforest.com/landscape/{z}/{x}/{y}.png? 
      apikey=xxxxxxxxx",new[] { "a", "b", "c" }, name: "OpenStreetMap");
    
    var tileLayer = new TileLayer(tileSource) { Name = "Carto Light" };
    map.Layers.Add(tileLayer);
    mapView.Map = map;
}

虽然不知道为什么 MyLocationButton 不起作用,但是有一个 解决方法 可以使当前位置显示在 MapsUI.

MyLocationLayer里面有一个UpdateMyLocation方法,那么我们就可以使用这个方法来编程显示当前位置。

此外,您可以使用 Geolocation 获取当前位置。

代码如下:

protected override async void OnAppearing()
{
    base.OnAppearing();
  
    var location = await Geolocation.GetLastKnownLocationAsync();

    if (location != null)
    {
        Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
    }

    mapView.MyLocationLayer.UpdateMyLocation(new Position(location.Latitude, location.Longitude), true);
}

效果: