高效热力图工具的开发与应用

在数据可视化领域,热力图是一种非常直观且有效的展示数据分布情况的方法。为了满足对灵活且可扩展的热力图应用的需求,开始了对热力图工具的探索。通过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()

核心实现(C#)

内部库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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485