基于openstreetmap在地图上显示50万个点非常慢

时间:2015-10-09 17:30:33

标签: c# wpf visual-studio openstreetmap heatmap

我想在基于OpenStreetMap(OSM)的地图上为许多给定点(约50万)创建热图。

我正在使用C#VS2013 WPF。 我在以下位置检查了OSM控件库GMAP和热图控件库GHEAT的C#代码:

http://greatmaps.codeplex.com/ http://www.codeproject.com/Articles/88956/GHeat-NET

但是,Gheat.net(建于2010年)建立在GMAP.net v1.4.9.4上,我的GMAP.net是1.7(建于2015年)。

我更改了代码,以便它可以在jpeg图像上显示我的0.5毫欧点作为热图。但是,完成这项工作需要30分钟。

这是我的C#代码:

System.Drawing.Bitmap myCanvasImage = new System.Drawing.Bitmap(12 * 256 - (2 * 256), 15 * 256 - (5 * 256),  System.Drawing.Imaging.PixelFormat.Format32bppArgb)

System.Drawing.Graphics g = Graphics.FromImage(myCanvasImage);

gheat.PointManager myPoints = new gheat.PointManager();

var xrange = Enumerable.Range(2, 12);
var yrange = Enumerable.Range(5, 15);

foreach (int x in xrange)
{
    foreach (int y in yrange)
    {
         System.Drawing.Bitmap tempImage = gheat.GHeat.GetTile(myPoints, "classic", zoom, x, y);
         g.DrawImage(tempImage, new System.Drawing.PointF(x * 256 - (2* 256), y * 256 - (5 * 256)));
    }
}

我的想法:gheat.GHeat.GetTile()花了很长时间才找到给定点的图块。

有没有办法快速绘制积分?

任何帮助都将不胜感激。

我检查了

https://help.openstreetmap.org/questions/16537/heatmap-with-osm

但是,那里的解决方案对我们不起作用。我需要在桌面应用程序的C#WPF Visual Studio 2013上进行热映射。

Leaflet和openlayers是用于web /移动应用程序的javascript库。

http://www.patrick-wied.at/static/heatmapjs/和所有其他人都是javascript lib。

此外,MapSurfer.net需要.NET Framework 4.5和Microsoft Visual C ++ 2012。

OsmSharp用于在地图上进行路由。

1 个答案:

答案 0 :(得分:2)

使用开源或商业解决方案。他们花了数年时间精炼代码,因此速度非常快。

根据我的经验,针对此类问题的纯C#/ WPF解决方案非常优雅,但可怜的慢。以DevExpress为例 - 如果你尝试绘制超过100个点,它就像一桶糖蜜一样运行(没有什么可以反对DevExpress - 他们的大部分库都非常精彩)。

最快,最有效的解决方案是使用GPU,或者使用优化的C ++渲染位图,然后使用DirectX将其推送到屏幕。这种技术更类似于游戏编程,而不是与现成的WPF相关的任何东西。随着计算机随着时间的推移变得越来越快,现成的硬件和标准WPF完全有可能更容易地处理这种大小的数据集。

为了保持这个答案的中立,我不打算给出任何名字,但是如果你进行搜索,你可以将候选名单下来说10名决赛选手,然后逐一审判。