Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在基于openstreetmap的地图上显示50万个点的速度非常慢_C#_Wpf_Visual Studio_Openstreetmap_Heatmap - Fatal编程技术网

C# 在基于openstreetmap的地图上显示50万个点的速度非常慢

C# 在基于openstreetmap的地图上显示50万个点的速度非常慢,c#,wpf,visual-studio,openstreetmap,heatmap,C#,Wpf,Visual Studio,Openstreetmap,Heatmap,我想在基于OpenStreetMap(OSM)的地图上为许多给定点(大约50万)创建一个热图 我正在研究C#VS2013 WPF。 我已经在以下位置检查了OSM控制库GMAP和热图控制库GHEAT的C#代码: 但是,Gheat.net(建于2010年)是基于GMAP.net v1.4.9.4构建的,而我的GMAP.net是1.7(建于2015年) 我已经更改了代码,这样它就可以在jpeg图像上以热图的形式显示我的0.5百万分。但是,完成这项工作需要30分钟 这是我的C#代码: 我的想法是:g

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

我正在研究C#VS2013 WPF。 我已经在以下位置检查了OSM控制库GMAP和热图控制库GHEAT的C#代码:

但是,Gheat.net(建于2010年)是基于GMAP.net v1.4.9.4构建的,而我的GMAP.net是1.7(建于2015年)

我已经更改了代码,这样它就可以在jpeg图像上以热图的形式显示我的0.5百万分。但是,完成这项工作需要30分钟

这是我的C#代码:

我的想法是:gheat.gheat.GetTile()花了很长时间才找到给定点的瓷砖

有什么方法可以快速得分吗

任何帮助都将不胜感激

我已经查过了

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

传单和openlayers是用于web/移动应用程序的javascript库

其他的都是javascript库

MapSurfer.net还需要.NET框架4.5和微软Visual C++ 2012。


OsmSharp用于在地图上布线

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

根据我的经验,针对这类问题的纯C#/WPF解决方案非常优雅,但速度却慢得可怜。以DevExpress为例,如果你试图绘制超过100个点的图形,它就像一桶糖浆一样运行(与DevExpress无关——它们的大多数库都非常出色)

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


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

我对渲染位图非常陌生。而且,我必须使用C。我不能肯定C++和DirectX可以是解决方案。此外,我只需要一个图像来显示热图,这样就不会像游戏那样花哨了。我只需要一个简单而有效的方式来显示0.5百万点作为热图,然后添加热图作为OpenStreetMap的覆盖。
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)));
    }
}