Настройте MapIcon в MapControl UWP

Я занимаюсь разработкой приложения для UWP. Моя цель состояла в том, чтобы оптимизировать рендеринг точек на карте bing. Я начал с кластеризации пользовательских маркеров с помощью операции map.children.add(). После кластерной группы пинов, я добавляю контакт с сгенерированным объектом зависимости в xaml. Каждая позиция изменения на карте обновляет все пины, которые отображаются в данный момент. Работает очень медленно. Поэтому я попытался использовать MapElement.Add(). Работает нормально, но я не могу добавить общий код ( xaml) Code (_native map is MapControl):

 var mapIcon = new MapIcon();
    mapIcon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Images/icon.png"));
    mapIcon.Location = new Geopoint(snPosition);
    mapIcon.Title = "Some label".ToString();
    _nativemap.MapElements.Add(mapIcon);

Есть ли способ настроить метку mapIcon (положение, цвет и т. Д.) Или создать поток из файла xaml, чтобы показать его как фактическое изображение mapIcon??

1 ответ

Решение

Добавить mapicon с изображением в виде потока (генерируется xaml) на карте

Я не знаю, как вы генерируете поток изображений с помощью xaml, я предполагаю, что у вас есть элемент управления или что-то еще, и вы используете RenderTargetBitmap для генерации источника изображения, который заполняется комбинированным содержимым визуального дерева XAML. Затем вы можете использовать BitmapEncoder для создания InMemoryRandomAccessStream,

Чтобы продемонстрировать, как использовать BitmapEncoderЯ беру сценарий 1 официального образца MapControl, например, здесь:

Создать SymbolIcon для MapIcon и создать Button класть MapIcon на карте:

<Grid x:Name="imgContainer" Margin="0,5" Width="20" Height="25">
    <SymbolIcon Symbol="AddFriend" Foreground="Red" />
</Grid>
<Button Content="Place MapIcon" Click="Button_Click" />

Код позади:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    //render symbolicon to bmp
    RenderTargetBitmap renderbmp = new RenderTargetBitmap();
    await renderbmp.RenderAsync(imgContainer);

    using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
    {
        //create a bitmap encoder
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
        //write pixels into this encoder
        var pixels = await renderbmp.GetPixelsAsync();
        var reader = DataReader.FromBuffer(pixels);
        byte[] bytes = new byte[reader.UnconsumedBufferLength];
        reader.ReadBytes(bytes);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight,
            (uint)renderbmp.PixelWidth, (uint)renderbmp.PixelHeight, 0, 0, bytes);
        await encoder.FlushAsync();
        mapIconStreamReference = RandomAccessStreamReference.CreateFromStream(stream);

        //create mapIcon
        var mapIcon = new MapIcon();
        mapIcon.Image = mapIconStreamReference;
        mapIcon.Location = new Geopoint(myMap.Center.Position);
        mapIcon.Title = "Some label".ToString();
        myMap.MapElements.Add(mapIcon);
    }
}

Рендеринг изображения этой демонстрации:

Другие вопросы по тегам