在数据可视化领域,热力图是一种非常直观且有效的展示数据分布情况的方法。为了满足对灵活且可扩展的热力图应用的需求,开始了对热力图工具的探索。通过Google搜索,找到了一个名为gheat的工具,但在使用过程中发现它的速度不够快,且不够灵活,无法满足需求。因此,决定将其移植到C#语言,并在这个过程中取得了一些成果。
为了简化使用过程,已经编写了所有必要的代码,以便用户可以立即开始使用。在VB.NET中,创建了一个会话包装器来存储每个会话的点,这些点可以通过"SessionHandler.PointManager"访问。"Map.aspx"页面包含了将点添加到地图的代码。以下是如何在VB.NET中添加点的示例:
Dim pm As gheat.PointManager
pm = SessionHandler.PointManager
If pm.PointCount = 0 Then
pm.LoadPointsFromFile("points.txt")
End If
pm.AddPoint(New GMap.NET.PointLatLng(30.123866, -92.070673))
如果需要通过POST请求动态添加点,可以使用一个循环来添加每个点。以下是一个示例:
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"页面包含了显示瓦片的必要代码。以下是VB.NET中的示例:
Dim image As System.Drawing.Bitmap
Dim stream As New System.IO.MemoryStream()
Response.Clear()
Response.ContentType = "image/png"
image = gheat.GHeat.GetTile(SessionHandler.PointManager, Request("colorScheme"), CInt(Request("zoom")), CInt(Request("x")), CInt(Request("y")))
image.Save(DirectCast(stream, System.IO.Stream), System.Drawing.Imaging.ImageFormat.Png)
stream.WriteTo(Response.OutputStream)
Response.Flush()
内部库Gheat.Net与Python版本几乎完全相同,支持相同的颜色方案、点、文件结构和点文件。为了提高效率,组织方式略有不同。所有瓦片都是按需生成的,但所有空瓦片都会根据颜色方案和缩放级别进行缓存。其他缓存是为了颜色方案和点,因此除非重启网站,否则任何添加都不会被拾取。没有配置文件,但必须指定点和颜色方案的目录。这必须在执行任何其他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中。以下是VB.NET中的示例:
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