【问题标题】:very slow of showing half a million points on a map based on openstreetmap在基于openstreetmap的地图上显示一百万个点非常慢
【发布时间】:2015-10-11 19:50:18
【问题描述】:

我想在基于 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 用于在地图上进行路由。

【问题讨论】:

    标签: c# wpf visual-studio openstreetmap heatmap


    【解决方案1】:

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

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

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

    为了让这个答案保持中立,我不会给出任何名字,但如果你进行搜索,你可能会得到入围名单,说出 10 名决赛选手,然后逐一试用。

    【讨论】:

    • 我对渲染位图非常陌生。而且,我必须使用 C#。我不确定 C++ 和 DirectX 是否可以成为解决方案。另外,我只需要一张图片来显示热图,所以它不像游戏那么花哨。我只需要一种简单有效的方法将 50 万个点显示为热图,然后将热图添加为 OpenStreetMap 上的叠加层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多