Показать 1 миллион локаций с маркерами на карте на основе OpenStreetMap из C# VS2013 WPF
Я хотел бы показать 1 миллион местоположений на карте, основанной на OpenStreetMap.
Я работаю на C# VS2013 и GMAP.NET WPF. Но когда я добавил маркеры для каждого местоположения, карта не может быть отображена, потому что маркер является растровым изображением. И 1 миллион маркеров потребляют слишком много памяти на моем ноутбуке (с 8 Гб памяти).
Код является:
public void add_marker(List<Tuple<double, double>> latLongList, ref GMapControl myMap)
{
System.Windows.Media.Imaging.BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(@"C:\djx_2014_6_3\my_projects\test_gmap_dot_net\GMap_WPF\try1\try_gmap_wpf\try_gmap_wpf\images\map_marker.png", UriKind.Absolute);
bitmapImage.DecodePixelHeight = 5;
bitmapImage.DecodePixelWidth = 5;
bitmapImage.EndInit();
foreach(var v in latLongList)
{
GMap.NET.PointLatLng point = new GMap.NET.PointLatLng(v.Item1, v.Item2);
GMapMarker marker = new GMapMarker(point);
System.Windows.Controls.Image image = new System.Windows.Controls.Image();
image.Source = bitmapImage;
marker.Shape = image;
marker.ZIndex = 5;
myMap.Markers.Add(marker);
}
}
Я не хочу использовать изображение в качестве маркеров, но я не могу узнать, как использовать маркер по умолчанию в openStreetMap.
Любая помощь будет оценена.
1 ответ
WPF не был предназначен для таких вещей. Во-первых, вы создаете растровое изображение для каждого тега, который является пользовательским элементом управления и содержит довольно большие накладные расходы для тестирования обращений к GUI, привязки и т. Д. Во-вторых, WPF выполняет рендеринг с DirectX, что означает, что в какой-то момент все данные имеют быть настроенным с буферами вершин и загруженными в графическую карту. Если вы используете привязку данных или пытаетесь создать отдельные элементы пользовательского интерфейса, то это займет много времени начальной настройки и памяти, как вы уже обнаружили. И если вы попытаетесь нарисовать их самостоятельно (например, создав собственный пользовательский элемент управления и переопределив OnRender), то это может быть еще хуже, поскольку вся эта работа теперь выполняется в каждом кадре (кроме буферизованного содержимого, которое все равно влечет за собой первоначальную настройку, так что ты вернулся на круги своя).
Если бы мне пришлось делать это самостоятельно, я бы начал с организации набора данных с соответствующей 2D-структурой, такой как дерево kd, дерево R* или даже базовое дерево квадов. Это позволит вам в любой момент быстро определить, какие маркеры находятся в усеченной области зрения.
Затем я добавил бы соответствующие привязки к полосам прокрутки и т. Д., Чтобы я мог точно отслеживать, где находится текущее усечённое представление, а затем на каждом кадре я буду обновлять список видимых тегов, основываясь на этом. Пока у вас не появляется более нескольких тысяч объектов одновременно, все будет в порядке, иначе вам придется разбивать обновления по нескольким кадрам с очередью.
Если это не соответствует вашим потребностям, у вас останется только два варианта: 1) самостоятельно сгенерировать необработанные растровые данные или 2) использовать более подходящую технологию.