Показать 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) использовать более подходящую технологию.

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