GHeat .NET





5.00/5 (15投票s)
gheat 已移植到 C#。
引言
这是一个快速且免费的热图工具。
背景
我需要一个灵活且可扩展的热图应用程序。快速的 Google 搜索引导我找到了 gheat。 在使用该应用程序时,我发现它速度慢且不够灵活,无法满足我的需求。 无法快速轻松地添加点,并且瓦片生成速度很慢。 所以,我决定尝试移植到 C#,现在我来了。
Using the Code
为简单起见,我已经编写了所有的代码,以便任何人都可以立即上手。
UI (在 VB 中)
我创建了一个会话包装器来存储每个会话的点。它们通过 "SessionHandler.PointManager
" 访问。
Map.aspx 包含将点添加到地图的代码。
Dim pm As gheat.PointManager
pm = SessionHandler.PointManager
If pm.PointCount = 0 Then pm.LoadPointsFromFile("points.txt")
要动态添加点,只需调用 PointManager
类中的 AddPoint
即可。
pm.AddPoint(New GMap.NET.PointLatLng(30.123866, -92.070673))
如果您希望通过 post 添加点,我建议使用一个循环来添加每个点。 以下是一个例子
'Post data would look like x,y|x,y
Dim lineSplit() As String
For Each line As String In Request("Address").Split("|")
lineSplit = line.Split(",")
pm.AddPoint(New GMap.NET.PointLatLng(lineSplit(0), lineSplit(1)))
Next
显示瓦片
Tile.aspx 包含显示瓦片所需的代码。
Dim image As System.Drawing.Bitmap
Dim stream As New System.IO.MemoryStream()
'Make sure nothing else is being sent
Response.Clear()
'Set the content type
Response.ContentType = "image/png"
'Get the tile image
image = gheat.GHeat.GetTile(SessionHandler.PointManager, _
Request("colorScheme"), CInt(Request("zoom")), _
CInt(Request("x")), CInt(Request("y")))
'Must save the image to a stream because png's need a stream that can seek back and forth.
image.Save(DirectCast(stream, System.IO.Stream), System.Drawing.Imaging.ImageFormat.Png)
stream.WriteTo(Response.OutputStream)
'Don't do anything else and send it to the requester
Response.Flush()
核心 (在 C# 中)
在内部,库 Gheat.Net
与 python 版本大约 99% 相同。 它支持相同的配色方案、点、文件结构和点文件。 为了简化和提高效率,组织结构略有不同。 所有瓦片都是根据需要生成的,但所有空瓦片都会被缓存,并且按配色方案、按缩放级别进行缓存。 配色方案和点也进行了其他缓存,因此除非重新启动站点,否则不会获取任何添加。 没有配置文件,但必须指定点和配色方案所在的目录。 这必须在任何其他 GHeat 代码执行之前完成,因此对于 Web 应用程序,必须在 Application_Start
上完成。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
Dim baseDirectory As String = HttpRuntime.AppDomainAppPath
gheat.Settings.BaseDirectory = baseDirectory + "__\etc\"
End Sub
它是如何工作的?(想法)
- 点绘制在瓦片上,点越多,颜色越浓(越深)。
- 基于瓦片上颜色的强度(深浅),范围为 0-255,它被映射到 255 像素高的配色方案。
- 像素逐个映射并根据配色方案进行更改。
- 由于瓦片必须更大才能容纳瓦片边缘上的点,因此会修剪瓦片。
- 瓦片已发送。
- 现在每个人都笑了。 ;)
奖励
在测试时,我创建了一个小型 winform 应用程序,它遍历一堆瓦片并将它们拼接在一起。 这位于 GheatDeskTop
应用程序中。
Dim pm As New gheat.PointManager()
Dim g As Graphics
Dim tempImage As System.Drawing.Bitmap
Dim zoom As Integer = 4
Dim startX As Integer = 2
Dim startY As Integer = 5
Dim maxX As Integer = startX + 10
Dim maxY As Integer = startY + 10
Dim canvasImage As New System.Drawing.Bitmap(maxX * 256 - (startX * 256), _
maxY * 256 - (startY * 256), System.Drawing.Imaging.PixelFormat.Format32bppArgb)
gheat.Settings.BaseDirectory = "..\..\..\gheatWeb\__\etc\"
g = Graphics.FromImage(canvasImage)
pm.LoadPointsFromFile("..\..\..\points.txt")
For x As Integer = startX To maxX
For y As Integer = startY To maxY
tempImage = gheat.GHeat.GetTile(pm, "classic", zoom, x, y)
g.DrawImage(tempImage, New System.Drawing.PointF(x * 256 - _
(startX * 256), y * 256 - (startY * 256)))
Next
Next
PictureBox1.Image = canvasImage
谢谢
感谢原始的 gheat 项目,如果没有源代码,我永远不会想到如何实现它。
通过 混合图像项目 进行图像乘法。
感谢 Great Maps 的墨卡托投影。 我本来想包含源代码,但它非常大,所以我只编译了一个 DLL 并将其包含在项目中。 我稍微修改了源代码以允许加权点。 修改后的文件现在作为单独的下载提供。 也许有一天我会解释它是如何工作的。
历史
- 2010 年 6 月 21 日:首次发布
- 2014 年 9 月 9 日:从 Great Maps 添加了 Points.cs 和 PointLatLng.cs