xamarin.forms - MapsUI 始终在 LatLng 0,0 处显示“自己的位置”标记
问题描述
我遇到 MapsUI 2.0.3 的问题,即我自己位置的标记始终位于非洲西部的 0,0 处。单击焦点在自己的位置按钮显然也会将我移到那里。
我确实为清单添加了粗略和精细的位置权限,并获得了访问位置的权限,但“你在这里”始终为 0,0。
然后我下载了 MapsUI 存储库,并尝试了这些示例,这些示例大多显示相同的行为。当地图加载时,它显示在 0,0 的位置。如果我稍微拖动地图,标记会慢慢移动到我的正确位置。如果我(在样本中)重新加载相同的样本或另一个样本,即使我拖动地图,标记也会停留在 0,0。总之,我可以通过与地图交互来“修复”0,0 标记,但只能进行一次。
我的设备确实启用了 gps 位置,并且使用应用程序的其他位置工作正常。这包括其他自制的 Xamarin 表单应用程序,因此这仅是 MapsUI 的问题。
样本和自己的代码都失败了,这有点令人困惑。这会为任何人敲响警钟吗?至少可以说似乎有点奇怪。
请注意,这在具有设置位置的 xamagin/android 设备模拟器上也会失败。只是提到这是一个“有趣”的额外细节,map longpress 事件永远不会在我的设备上触发,但在模拟器上确实有效。我看到其他人,很久以前,抱怨同样的问题,一个开发人员评论它在 2.0 中得到修复,而我在 2.3 中看到它。总而言之,MapsUI 似乎是一个非常丰富的系统,我很想使用它,但它有奇怪的小错误和糟糕的支持。
用于添加地图视图的 xml
<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);
}
效果:
推荐阅读
- c++ - 检查类是否在方法中实例化
- nginx - redis2_query & proxy_pass 一起
- java - 我如何从谷歌日历 API 获取原始 ics(谷歌日历)文件
- c# - 使用 gRPC 共享非常大的文件
- javascript - 通过添加基于javascript中匹配键的键值来创建数组对象
- java - Thymeleaf: th:each for two table rows?
- spring - Criteria Builder 查询字符串列表
- node.js - 在本地 3000 主机上运行 node.js 问题。它以前在我的 mac 上运行,现在它没有
- mysql - /usr/sbin/mysql 代码=退出状态 203/执行错误
- vba - 打开预约时自定义预约表格不同