UWP MapControl 大量的 MapIcons
UWP MapControl huge nr of MapIcons
问题是我无法一次看到所有 20.000 个 MapIcon,我想增加更多 MapIcon 的数量。
我的 ViewModel HousesViewModel
中有一个名为 Houses
的 System.Collections.ObjectModel.ObservableCollection<House>
道具
public MainPage()
{
this.InitializeComponent();
HousesVM.Houses.CollectionChanged += Houses_CollectionChangedAsync;
GetInitialPins();
}
我的 GetInitialPins()
有一个指向 add/fill 和 HousesVm.Houses 的 foreach 但这似乎效率低下所以我这样重写了它:
List<House> houses = JsonConvert.DeserializeObject<List<House>>(response);
HousesVM.Houses = new System.Collections.ObjectModel.ObservableCollection<House>(houses);
缺点是这不会触发我添加 MapIcons 的 CollectionChanged
事件。
private async void Houses_CollectionChangedAsync(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Low, async () =>
{
foreach (House item in e.NewItems)
{
MapIcon myPOI = new MapIcon
{
Location = new Geopoint(new BasicGeoposition() { Latitude = item.Latitude, Longitude = item.Longitude }),
NormalizedAnchorPoint = normalizedAnchorPoint,
Title = item.Name,
CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible,
ZIndex = 0
};
await mappie.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
mappie.MapElements.Add(myPOI);
});
}
});
}
我也曾尝试从 MapIcon
中移开,只是将 Ellipse
添加到 mapcontrol 的子项中。那给了我一个内存不足的异常。还尝试绑定 XAML:
<map:MapControl x:Name="mappie"
MapServiceToken="mysecrettoken"
Grid.Row="1">
<map:MapItemsControl ItemsSource="{Binding Houses}">
<map:MapItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock map:MapControl.Location="{Binding Location}" Text="{Binding Code}" map:MapControl.NormalizedAnchorPoint="0.5,0.5" FontSize="20" Margin="5"/>
</DataTemplate>
</map:MapItemsControl.ItemTemplate>
</map:MapItemsControl>
还给出了内存不足的异常...还看到了bing地图的js版本具有cluster/grouping功能。 uwp 中没有。并且还在文档中看到,如果数量很大,我应该考虑构建磁贴服务并参考自定义创建的磁贴......这对我的情况来说似乎有点矫枉过正。
聚类是处理大量点的推荐方法,因为正如您所指出的,您确实无法同时看到所有点。
UWP 地图示例中有一个聚类示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/MapControl
问题是我无法一次看到所有 20.000 个 MapIcon,我想增加更多 MapIcon 的数量。
我的 ViewModel HousesViewModel
Houses
的 System.Collections.ObjectModel.ObservableCollection<House>
道具
public MainPage()
{
this.InitializeComponent();
HousesVM.Houses.CollectionChanged += Houses_CollectionChangedAsync;
GetInitialPins();
}
我的 GetInitialPins()
有一个指向 add/fill 和 HousesVm.Houses 的 foreach 但这似乎效率低下所以我这样重写了它:
List<House> houses = JsonConvert.DeserializeObject<List<House>>(response);
HousesVM.Houses = new System.Collections.ObjectModel.ObservableCollection<House>(houses);
缺点是这不会触发我添加 MapIcons 的 CollectionChanged
事件。
private async void Houses_CollectionChangedAsync(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Low, async () =>
{
foreach (House item in e.NewItems)
{
MapIcon myPOI = new MapIcon
{
Location = new Geopoint(new BasicGeoposition() { Latitude = item.Latitude, Longitude = item.Longitude }),
NormalizedAnchorPoint = normalizedAnchorPoint,
Title = item.Name,
CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible,
ZIndex = 0
};
await mappie.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
mappie.MapElements.Add(myPOI);
});
}
});
}
我也曾尝试从 MapIcon
中移开,只是将 Ellipse
添加到 mapcontrol 的子项中。那给了我一个内存不足的异常。还尝试绑定 XAML:
<map:MapControl x:Name="mappie"
MapServiceToken="mysecrettoken"
Grid.Row="1">
<map:MapItemsControl ItemsSource="{Binding Houses}">
<map:MapItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock map:MapControl.Location="{Binding Location}" Text="{Binding Code}" map:MapControl.NormalizedAnchorPoint="0.5,0.5" FontSize="20" Margin="5"/>
</DataTemplate>
</map:MapItemsControl.ItemTemplate>
</map:MapItemsControl>
还给出了内存不足的异常...还看到了bing地图的js版本具有cluster/grouping功能。 uwp 中没有。并且还在文档中看到,如果数量很大,我应该考虑构建磁贴服务并参考自定义创建的磁贴......这对我的情况来说似乎有点矫枉过正。
聚类是处理大量点的推荐方法,因为正如您所指出的,您确实无法同时看到所有点。 UWP 地图示例中有一个聚类示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/MapControl