我对Visual Studio/Xamarin仍然相当陌生,但是不久前我为Android运行了一个简单的OpenStreetMap示例,该示例确实显示了地图,但似乎不再显示地图,尽管据我所知,我已经有一段时间没有更改此示例的代码了。我不确定某些Visual Studio/Xamarin或MacOS更新是否可能导致它不再工作。
我在macOS Mojava 10.14.6和以下软件包上使用Visual Studio for Mac社区8.4.4(build 91(:
- 马水 1.4.8
- 奥斯姆夏普 6.2.0
- Xamarin.Android.Support.Core.Utils 28.0.0.1
- Xamarin.Android.Support.CustomTabs 28.0.0.1
- Xamarin.Android.Support.Design 28.0.0.1
- Xamarin.Essentials 1.2.0
我的MainActivity.cs
文件包含以下代码:
using System;
using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Support.Design.Widget;
using Android.Support.V7.App;
using Android.Views;
using Android.Widget;
using Mapsui;
using Mapsui.Geometries;
using Mapsui.Projection;
using Mapsui.Styles;
using Mapsui.Utilities;
using Mapsui.UI.Android;
using Mapsui.Widgets.ScaleBar;
using Mapsui.Widgets.Zoom;
using Xamarin.Essentials;
namespace mvp_android
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.Main);
var mapControl = FindViewById<MapControl>(Resource.Id.mapcontrol);
var map = new Mapsui.Map();
map.Layers.Add(OpenStreetMap.CreateTileLayer());
map.Widgets.Add(
new ZoomInOutWidget(map) {
HorizontalAlignment = Mapsui.Widgets.HorizontalAlignment.Left,
VerticalAlignment = Mapsui.Widgets.VerticalAlignment.Top,
Orientation = Mapsui.Widgets.Zoom.Orientation.Horizontal,
}
);
var centerOfLondonOntario = new Point(-81.2497, 42.9837);
map.NavigateTo(SphericalMercator.FromLonLat(centerOfLondonOntario.X, centerOfLondonOntario.Y));
map.NavigateTo(map.Resolutions[9]);
mapControl.Map = map;
}
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
return true;
}
public override bool OnOptionsItemSelected(IMenuItem item)
{
int id = item.ItemId;
if (id == Resource.Id.action_settings)
{
return true;
}
return base.OnOptionsItemSelected(item);
}
private void FabOnClick(object sender, EventArgs eventArgs)
{
View view = (View)sender;
Snackbar.Make(view, "Replace with your own action", Snackbar.LengthLong)
.SetAction("Action", (Android.Views.View.IOnClickListener)null).Show();
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
我的Main.xml
包含以下代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Mapsui.UI.Android.MapControl
android:id="@+id/mapcontrol"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
最初,此示例使用放大/缩小按钮显示以安大略省伦敦位置为中心的 OpenStreetMap 地图,但现在它只显示地图应该在的位置的白色,仍然显示放大/缩小按钮,并且确实显示 (c(OpenStreetMap 水印。
我在这里错过了什么?
更新 2021-03-23:自上周以来,"BruTile Tile Library"用户代理被 OpenStreetMap 阻止。这是BruTile的KnownTileSource.Create的默认值。此方法具有要传入您自己的用户代理的参数。解决方法是提供特定于应用的字符串。
Mapsui 1.4.8中使用的BruTile版本没有将用户代理作为其请求的一部分发送,并且在某些时候,openstreetmap服务器出于这个原因开始阻止请求。
作为一种解决方法,您可以创建一个自定义的ITileSource,如Matt Schneeberger在这里描述的那样: https://github.com/Mapsui/Mapsui/issues/668#issuecomment-497947690