Настройте 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);
}
}