OpenStreetMap больше не отображается с использованием OsmSharp и Mapsui - PullRequest
1 голос
/ 05 февраля 2020

Я все еще довольно новичок в Visual Studio / Xamarin, но у меня был простой пример OpenStreetMap, запущенный некоторое время go для Android, который действительно отображал карту, но, похоже, больше не отображает карту, хотя у меня нет ' Насколько я помню, я поменял код этого образца. Я не уверен, что какое-то обновление Visual Studio / Xamarin или MacOS могло привести к тому, что оно перестало работать.

Я использую Visual Studio для сообщества Ma c 8.4.4 (сборка 91) на macOS Mo java 10.14.6 и следующие пакеты:

  • 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.

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 05 февраля 2020

Версия BruTile, используемая в Mapsui 1.4.8, не отправляла пользовательский агент как часть своего запроса, и в какой-то момент сервер openstreetmap начал блокировать запросы по этой причине.

В качестве обходного пути вы могли бы создайте собственный ITileSource, как описано здесь Matt Schneeberger: https://github.com/Mapsui/Mapsui/issues/668#issuecomment -497947690

...