c# - 基于 openstreetmap 在 map 上显示 50 万个点的速度非常慢

标签 c# wpf visual-studio openstreetmap heatmap

我想在基于 OpenStreetMap (OSM) 的 map 上为许多给定点(大约 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() 花了很长时间来查找给定点的图 block 。

有没有一些方法可以快速绘制点?

如有任何帮助,我们将不胜感激。

我已经查过了

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 库的。

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

OsmSharp 用于在 map 上进行路线选择。

最佳答案

采用开源或商业解决方案。他们花了数年时间改进代码,因此速度超快。

根据我的经验,针对此类问题的纯 C#/WPF 解决方案非常优雅,但速度却慢得可怜。以 DevExpress 为例 - 如果您尝试绘制超过 100 个点的图表,它就会像一桶糖蜜一样运行(与 DevExpress 没有任何区别 - 他们的大部分库都非常出色)。

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

为了保持这个答案的中立,我不会透露任何名字,但如果你进行搜索,你可能会得到 10 名入围者的候选名单,然后一一试用。

关于c# - 基于 openstreetmap 在 map 上显示 50 万个点的速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33044050/

相关文章:

c# - 以编程方式设置滚动条的宽度

WPF ContentControl 宽度会增加,但在包裹在 ScrollViewer 中时不会缩小

C# - 网站 - SQL Select 语句

c# - 何时使用 DebuggerDisplayAttribute

c++ - 未声明的变量在 Visual C++ 中未标记为错误

c# - 如何为 Windows Phone 应用程序禁用异步 HTTPWebRequest 的缓存?

c# - 我需要什么来进一步限定 DataContext 以进行绑定(bind)?

c# - 数据网格中的主键始终为零

c# - 如何在 C# 中访问不强制转换的多态方法

c# - 重构方法的最佳实践