MapsUI, добавляющий булавки карты в Xamarin Forms


Мне нужно добавить кучу булавок на MapsUI элемент управления карты, который использует OpenStreetMap плитка.

Проблема в том, что я не могу найти ничего, что упоминает контакты в их документации, поэтому мой вопрос:

Имеются ли какие-либо булавки, но они имеют разные имена, или я должен сам нарисовать булавки (используя Геометрию и Точки, как в некоторых примерах, которые я нашел), и если да, то как мне сохранить их одинаковый размер при масштабировании карты?

Может быть, кто-то может указать, где я должен искать в их документации, если я слепой и пропустил это.

Спасибо!

4 ответа

Решение

Идея состоит в том, что вы используете свои собственные растровые изображения, чтобы рисовать как "булавки".

Mapsui имеет особенности. Объект имеет геометрию, которая может быть точкой, линией и многоугольником (и некоторыми другими). Особенность нарисована шириной какого-то стиля. Что вам нужно сделать, это создать объекты с точечной геометрией и использовать символьный стиль с растровым изображением в качестве символа. Вам необходимо зарегистрировать свое растровое изображение и использовать bitmapId в символе. Смотрите образец здесь:

https://github.com/Mapsui/Mapsui/blob/master/Samples/Mapsui.Samples.Common/Maps/PointsSample.cs

Ваш вид карты Mapsui Mapsui.UI.Forms.MapView имеет собственность Pins. Вы можете добавить туда булавки. Вы можете получить доступMapView Просмотр из кода программной части *xaml.cs вашего MapView.

Для этого сначала назовите представление карты на странице XAML:

<ContentPage
    xmlns:mapsui="clr-namespace:Mapsui.UI.Forms;assembly=Mapsui.UI.Forms"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="YourProject.Pages.YourMap">
  <ContentPage.Content>
     <mapsui:MapView
        x:Name="selectMapControl"/>
  </ContentPage.Content>
</ContentPage>

Затем перейдите к нему из кода программной части C# этой страницы:

using Mapsui.UI.Forms;

protected override async void OnAppearing()
{
    selectMapControl.Pins.Add(new Pin(new MapView())
    {
       Position = new Position(0, 0),
       Type = PinType.Pin,
       Label = "Zero point",
       Address = "Zero point",
    });
}

Надеюсь, этот простейший пример поможет.

Вы можете использовать Xamarin.Forms.GoogleMaps, поскольку они дают вам возможность добавлять несколько контактов на ваш выбор.

Вот пример кода:

var position = new Position(Latitude, Longitude);

        var pin = new Pin
        {
            Type = PinType.Place,
            Position = position,
            Icon = BitmapDescriptorFactory.FromBundle("pin.png"),
            Label = "custom pin",
            Address = "custom detail info",
        };

        MyMap.Pins.Add(pin);

Следующее работает на версии 3.02. Я не проверял это ни на одной другой версии MapSui. Сначала убедитесь, что ваш растровый рисунок булавки является встроенным ресурсом. Затем вы можете получить идентификатор Bitmap следующим образом:

      var assembly = typeof(YourClass).GetTypeInfo().Assembly;
var image = assembly.GetManifestResourceStream("YourSolution.YourProject.AFolder.image.png");

Если var image возвращает значение null, значит, изображение не найдено и, скорее всего, это не встроенный ресурс, либо вы неправильно указали адрес/имя.

      var ID = BitmapRegistry.Instance.Register(image);

The BitmapRegistryМетод также регистрирует BitMap для MapSui для последующего использования. Я думаю, что если это ваше первое зарегистрированное изображение, оно будет 0.

Затем вы можете создать слой памяти следующим образом:

      MemoryLayer PointLayer = new MemoryLayer
        {
            Name = "Points",
            IsMapInfoLayer=true,
            DataSource = new MemoryProvider(GetListOfPoints()),
            Style = new SymbolStyle { BitmapId = ID, SymbolScale = 0.50, SymbolOffset = new Offset(0, bitmapHeight * 0.5) };
            
        };

The DataSourceможет быть сгенерирован следующим образом (я просто добавляю одну функцию, но вы можете добавить столько, сколько хотите):

      private IEnumerable<IFeature> GetListOfPoints()
    {
        List<IFeature> list = new List<IFeature>();

        var feature = new Feature();
        feature.Geometry = new Point(-226787, 7155483);
        feature["name"] = "MyPoint";

        list.Add(feature);

        IEnumerable<IFeature> points = list as IEnumerable<IFeature>;
        return points;
    }

Затем добавьте новый MemoryLayer на карту следующим образом:

      MapControl.Map?.Layers.Add(PointLayer);
Другие вопросы по тегам