关于大数据下OD线的小思考
OD线(Origin-Destination Line),是指连接“起点”(origin)和“终点”(destination)的线,通常用于在地图上直观表示某两个地理位置之间的联系,如车辆的行驶轨迹、飞机的航线和人口的迁徙等。结合着炫酷的可视化效果,大家可能对这样的OD线印象深刻:
如这种:
还有这种:
当然,这只是JPG图片,更多炫酷动态OD线请点击极海博文《玩转OD线》
/wan-zhuan-odxian/ ,但是今天要探讨的重点不是OD线的“炫酷”,而是最近在OD线的实践中的一点小思考,如潜藏在大数据下OD线中的“陷阱”,那么线要素中到底是如何隐藏“陷阱”的呢?请跟随下文一起探其究竟。
场景设定:
基于单个人的职、住位置数据,在地图上画出OD线。
“理想”与“现实”
别人家的OD线:
我的OD线:
为什么会有这么大差别呢?
“混沌”与“秩序”
“混沌”的剖析:
小数据量的、简单的“多对一”或者“一对多”映射的OD线是容易被理解和被可视化的,而大数据量的“多对多”映射则会出现错综复杂的线条,纵横交织的线条会在多次重叠下变成一片混沌,并且这样的混沌还容易引起头脑里思维的混沌。因此,我们需要寻找一个清晰的思路,让众多的OD线在纷杂中井然有序,有条不紊。
“秩序”的建立:
多对多映射,并且涉及空间运算,缜密准确地将每一个过程都想清楚是有一定难度的,因此可以先通过画图将复杂的问题简单化,假设小张、小李、小王的“职”、“住”位置连线如下(每条线代表一个人,线段的端点即为职、住的实际位置):
遇到这种情况,我们常常会做这样的处理,将“起点在相同版块里”和“终点在相同板块里”的线条合并,分别以各版块的质心作为起点和终点并计数得到一条线上的人数,即由“点到点”变为“面到面”,得到如下效果:
以这种思路来解决问题,无疑是很简便且正确的,但是也隐藏着“陷阱”,一不小心就会得到“假的OD线”。
“假象”与“真相”
假象:OD线的隐藏
OD线的隐藏会出现两种情况:
OD线“立”起来
上面的两张图是理想的一般情况,而特殊情况也是存在的,比如说这种:
小王住在A地并且就在A地上班,即O和D在同一板块内,起点和终点分别找到版块质心以后,画出的OD线就会“立”起来,变成一个横截面,因为在获取位置的时候并没有区分是不是在本地版块里居住且上班。并且通过实践来看,在本地上班通勤的人数是很多的,而这一部分人数还是在地图上几乎无法可视化出来的,比如将线条按人数多少进行分级渲染,很可能人数多的那一段线条很少,或者根本“没人”,如下图:
人数较多的分段只有将OD线粗度调大之后才能在地图上看到“点”。
针对这种情况,如果O和D都在本地的人不是我们研究的重点,那么就应该过滤掉,以免影响到后面的数据可视化效果。
OD线“叠”起来
举个例子来说,OD线“叠”起来是指A到B的线(线段AB)与B到A(线段BA)的线重合,如下图:
小王与小刘的O和D正好相反,在分别找到质心并连线之后就会完全重合,并且不管是通过sql语句还是用gis软件生成的初始的线都只是一条线段,无法表示出方向性。更重要的是,因为线段AB与线段BA的地理字段完全相同,假如这时候以“线段AB”的地理字段来统计A地到B地或B地到A地的人数的时候就会犯下错误——将去往相反方向的两条线段上的人数加和汇总到一条线上,得到“假的OD线”。
真相:OD线是向量
向量是指具有大小和方向的量,通过以上的分析不难得出OD线其实是一种向量,它具有方向性。即使是“立”起来的OD线也分“头”“尾”,有“向外”和“向内”两个方向。因此,在gis软件和数据库中做关系表的运算过程中要记得带上OD线的O和D字段,用向量的思想去理解OD线,比如统计人数的时候应该将O和D都相同的线段上的人数加和汇总(即sum(people_number)
group by OD,O,D),这样才能安全绕过OD线的“陷阱”,减少犯错误的机会。
最后,上一张北京某一天的人口职住迁徙OD—热力图: