【问题标题】:OpenStreetMap is not showing anymore using OsmSharp and Mapsui使用 OsmSharp 和 Mapsui 不再显示 OpenStreetMap
【发布时间】:2020-05-21 09:41:03
【问题描述】:

我对 Visual Studio/Xamarin 还是很陌生,但我有一个简单的 OpenStreetMap 示例在不久前为 Android 运行,它确实显示了地图,但似乎不再显示地图,尽管我没有更改代码据我记得,这个样本在一段时间内。我不确定是否某些 Visual Studio/Xamarin 或 MacOS 更新可能导致它不再工作。

我在 macOS Mojava 10.14.6 和以下软件包上使用 Visual Studio for Mac community 8.4.4(内部版本 91):

  • Mapsui 1.4.8
  • OsmSharp 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 水印。

我在这里错过了什么?

【问题讨论】:

    标签: c# xamarin openstreetmap mapsui


    【解决方案1】:

    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

    【讨论】:

    • 另外,我注意到 Mapsui 2.0 正在开发中,但在选择 Nget 包时没有显示在我的 Visual Studio/Xamarin 中。一旦测试版结束,它会在 Nget 中可用吗?
    • 感谢您为我指明了正确的方向!地图现在又可以正常显示了。
    • 是的,这是预发布版本,要在您的 nuget 浏览器中查看它,您必须检查“包含的预发布版本”。
    • OpenStreet 地图没有加载到 MapSui 中是否还有最近的其他原因?大约一周前它工作正常,现在我无法加载映射。尝试创建一个新的干净解决方案并打开地图窗口,您甚至可以平移,但没有加载任何图块。
    • 是的,现在看来 ""BruTile Tile Library" 用户代理已被 openstreetmap 明确阻止。这是 BruTile 问题。github.com/BruTile/BruTile/issues/144 解决方法是提供特定于您的用户代理应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多