65.9K
CodeProject 正在变化。 阅读更多。
Home

GHeat .NET

starIconstarIconstarIconstarIconstarIcon

5.00/5 (15投票s)

2010年6月21日

CPOL

3分钟阅读

viewsIcon

240550

downloadIcon

5828

gheat 已移植到 C#。

SampleWebPage.PNG - Click to enlarge image

引言

这是一个快速且免费的热图工具。

背景

我需要一个灵活且可扩展的热图应用程序。快速的 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 应用程序中。

GHeat_Net/TilesStiched.png

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.csPointLatLng.cs
© . All rights reserved.