我想在基于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用于在地图上进行路由。
答案 0 :(得分:2)
使用开源或商业解决方案。他们花了数年时间精炼代码,因此速度非常快。
根据我的经验,针对此类问题的纯C#/ WPF解决方案非常优雅,但可怜的慢。以DevExpress为例 - 如果你尝试绘制超过100个点,它就像一桶糖蜜一样运行(没有什么可以反对DevExpress - 他们的大部分库都非常精彩)。
最快,最有效的解决方案是使用GPU,或者使用优化的C ++渲染位图,然后使用DirectX将其推送到屏幕。这种技术更类似于游戏编程,而不是与现成的WPF相关的任何东西。随着计算机随着时间的推移变得越来越快,现成的硬件和标准WPF完全有可能更容易地处理这种大小的数据集。
为了保持这个答案的中立,我不打算给出任何名字,但是如果你进行搜索,你可以将候选名单下来说10名决赛选手,然后逐一审判。