基于c# VS2013 WPF的OpenStreetMap,在地图上显示100万个带有标记的位置

本文关键字:100万 显示 位置 地图 WPF VS2013 OpenStreetMap 基于 | 更新日期: 2023-09-27 18:16:25

我想在基于OpenStreetMap的地图上显示100万个位置。

我使用c# VS2013和GMAP。净WPF。但是,当我为每个位置添加标记时,地图无法显示,因为标记是位图图像。而且100万个标记占用了我笔记本电脑(8 GB内存)太多的内存。

代码是:

   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中使用默认标记。

任何帮助都会很感激。

基于c# VS2013 WPF的OpenStreetMap,在地图上显示100万个带有标记的位置

WPF不是为这样的事情而设计的。首先,你要为每个标签创建一个位图,这是一个用户控件,对于GUI hit-testing和绑定等来说,它带来了相当大的开销。其次,WPF用DirectX渲染,这意味着在某些时候,所有的数据都必须用顶点缓冲区设置并上传到显卡。如果您使用数据绑定或尝试创建单独的UI元素,那么这将花费大量初始设置时间和内存,正如您已经发现的那样。如果你试图自己绘制它们(例如,通过创建自己的用户控件并重写OnRender),那么它可能会更糟,因为所有的工作现在每帧都要完成(除了缓冲的东西,无论如何仍然会导致初始设置,所以你又回到了起点)。

如果我必须自己做这个,我会从用适当的二维结构组织数据集开始,比如k-d树,R*树,甚至是基本的四叉树。这将允许您在任何给定时刻快速确定哪些标记位于视图截锥体中。

接下来,我将为滚动条等添加适当的绑定,以便我可以准确地监视当前视图截锥的位置,然后每一帧我将基于此更新可见标签列表。只要你一次看到的对象不超过几千个,你就应该没问题,否则你将不得不在多个帧中错开更新。

如果这不能满足你的需要,那么你真的只有两个选择:1)自己手动生成原始位图数据,或者2)使用更合适的技术。