道路热力图制作小结
原文发布时间:2015-04-13 09:58:34
作者:星空
接到制作热力图的这个任务时,我还对热力图知之甚少。于是有很长一段时间,我都处在查找文献和看文献的状态中。但是,在查找的文献中,涉及道路热力图的文章很少。我不得不寻求其他的方式来解决这个问题。经过一段时间的摸索,得到一些结果,现在把它贴出来,也是希望能够和大家分享。废话不多说,马上给出下面的热力图制作方法。
方法很简单,就是构建三角网,生成等高线,利用等高线的间隔划分区域,然后进行颜色渲染。
首先,我们来看看制作此热力图的一些需求:
? 客观反映道路的真实情况——显示结果与实际情况吻合
? 反映某个区域内的整体道路情况——显示某个区域内的交通状况,而不仅仅局限于某条道路
? 热力图充分地圆滑——尽量减少尖锐的拐角
? 采用渐变色对颜色进行渲染——主要用红黄绿三色来标注
现有的数据库有下面的形式:
对于一个城市的道路系统来说,我们可以认为道路线是连续的,如果我们将道路上的车流看做是连续的话,一个很自然的想法是利用Delaunay三角剖分来反映道路的拥堵情况。当我们直接带入道路线并且用TINGenerator
直接进行三角剖分,我们得到了非常糟糕的结果(以部分道路线为例):
分析上图,我们可以看到这里存在几个问题:
? 三角剖分中存在狭长的三角形——狭长的三角形会导致生成的等高线过分远离道路线,并且形成尖角,得到的效果不佳(图2)
? 道路线穿过三角网——这会导致穿过三角网的道路信息的丢失,插值偏离原有的道路值(图3)
为了解决这个问题,我们放弃非规则三角网(TIN),采用规则三角网进行估计和插值。
主要的制作内容分三部分完成:
一、构建规则三角网如下图(图4):
模板实现:
这里,我们对整个道路边界(_xmin, _xmax, _ymin, _ymax)作了一个缓冲,目的是防止边界点不存在邻点,导致无法输出完整的闭合等高线。
二、构建好三角网以后,就是对三角网点进行插值估计。我们将每个估计值作为三角网点的z坐标值。未估计的点默认为0。这里给出了两种方式:
? 给离道路最近的三角点赋值
我们对于每条道路寻找离它最近的点,并且将道路上的相关属性值作为z坐标赋给这些点。
? 给道路附近一定范围内的三角点赋值
在一定的距离权重下,对一定的搜索范围内的点作估值。每个点的影响区域为这个搜索范围内的圆形区域。
其他的插值方案可以根据具体的需要来设计。
三、生成带有高程的等高线,渲染渐变颜色。我们需要一个缓慢的过渡来标示道路的拥堵情况,最直观的想法是根据等高线的数值大小来决定拥堵情况:
这里作了三部分部分工作:一是光滑等高线,二是生成面,三是根据生成的面决定渲染颜色。这里,我们用RGB色设置“fme_color”和“fme_fill_color”,得到渐变色。
然后,用ImageRasterizer进行栅格化,如下图:
最后生成栅格图片(给出下面的一个效果图):
将上面的三个部分整合起来,生成转换器:
HotSpot转换器实现功能:接收输入的道路线或者点,输出等高线、规则三角剖分网、三角形、规则三角网表面,三角顶点。
参数:
Analysis Attribute:待分析属性,也就是,对点进行插值的属性。
Triangular Point Type:选择剖分三角网的类型——一是保留所有的剖分三角网点,二是保留道路附近的部分网点。
Algorithm:估值算法,有SinglePoint和MultiPoint两种,参考热力图制作的第二部分。
Side Length:三角网的边长值。
Search Range:搜索范围。插值点搜索此范围内的道路线进行插值。
Contour Interval:等高线间隔。
Colorizer转换器实现功能:接收输入的等高线,输出经过渐变色渲染后的面。
参数:
Red:红色区域的分割线,大于Red值的等高线将会被舍弃。
Yellow:红色与绿色区域的分割线。
Green:绿色区域的分割线,小于Green值的等高线将会被舍弃。
Elevation:等高线的高程属性。
以上就是我这段时间以来所作的工作,鉴于上面的方法是对三角剖分点进行估值,所以跟实际的情况是有一部分误差的。我们可以通过减小网格边长来提高插值精度,只是,这会造成时间和存储空间的浪费;若是网格取得太大,插值点远离道路,得到的结果会与实际情况有较大偏差。如果我们只是需要对整体有一个大致的了解,它算是一个不错的解决方案。
进一步的研究:
为解决上述问题,我们可以将三角剖分与比例尺缩放结合起来,得到在不同比例尺下的不同热力图。可以尝试下面的方法:
一、固定三角网点的边长。这里可以选择自己认为合适的边长。
二、改变道路图的比例大小,计算每个点的估计值。
三、每改变一次比例尺,每个点的值都刷新一次。
这种方式解决了在查看某个区域内的道路状况时,既能减少网格点的生成,又能保证一定的精度。
若对文章有疑问,可发送邮件至[email protected]提问或讨论。