基于Spark的地图相交区域面积计算方法及系统
技术领域
本发明涉及地图信息技术领域,特别涉及一种基于Spark计算引擎的地图相交区域面积计算方法、系统及计算机设备。
背景技术
在土地资源规划等应用中,经常涉及大量的地图相交区域计算,比如给定两张不同类别的地图:林地地图和建筑地图,在计算违规建筑占地面积时,我们往往需要比对两地图并提取出相交区域进行。因此对这一问题的研究具有重要的理论意义和应用价值。同时,区域通常在地图上是以多边形的形式存在,因此该类问题可以转化成海量多边形相交面积的计算问题。一直以来,任意多边形相交面积的高效计算都是地理信息系统(GIS,Geographic Information System)中研究的重点。
多边形相交面积的计算离不开多边形相交集的判定,这是计算相交面积的前提。近年来,针对多边形位置关系的判定已有较多的研究成果。比如处理凸多边形的经典算法有Shamos和O’Rourke算法;支持任意多边形裁剪的经典算法有weiler算法和Vatti算法。相比求解多边形每条边相交情况的暴力算法,上述算法在计算效率上有所提高,但算法复杂度较高,不适用于大数据(海量地图信息)场景下的多边形面积计算。
Spark是专为大规模数据处理而设计的快速通用的计算引擎。它是一种基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合,需要反复操作的次数越多,所需读取的数据量越大,受益越大。由于栅格化后的地图数据反复操作次数多,因此Spark能适用于处理地图大数据的场景。
将地图进行栅格化处理后可以更方便的存储和索引数据,并且在一定程度上降低了多边形相交算法的复杂度。但传统的地图栅格化处理后计算相交面积的方法,在大数据环境下存在计算速度慢,效率不高的问题。其主要原因在于找出互为相交的区域需要遍历所有区域,极大地增加了时间开销。
发明内容
本发明为解决上述问题,提出了基于Spark的地图相交区域面积计算方法、系统及计算机设备。本发明通过建立空间索引,来快速且准确的找出地图区域中相交的区域,有效减少数据量并提高查询速度。
根据本发明的一个方面,提供一种基于Spark的地图相交区域面积计算方法,包括:
步骤1,根据经纬度和网格个数,将地图划分成网格形式;
步骤2,读取地图数据,包括多边形区域的ID和多边形区域的顶点序列,根据网格编号规则确定多边形区域包含的第一类单元网格的编号,或根据多边形区域提取出最小外接矩形,利用四分树算法确定多边形区域属于的第二类单元网格的编码;将第一类单元网格的编号或第二类单元网格的编码进行分块后存入Spark的分布式文件系统中;
步骤3,根据Spark的分布式文件系统中存储的第一类单元网格的编号或第二类单元网格的编码,确定包含相同第一类单元网格编号的多边形区域,或属于相同第二类单元网格编码的多边形区域,为可能存在相交的多边形区域;
步骤4,判断可能存在相交的多边形区域的相交关系,计算对应的相交区域的面积。
根据本发明的另一方面,提供一种基于Spark的地图相交区域面积计算系统,包括:
地图网格化模块,用于根据经纬度和网格个数将地图划分成网格形式;
单元网格编号码确定模块,用于读取地图数据,包括多边形区域的ID和多边形区域的顶点序列,根据网格编号规则确定多边形区域包含的第一类单元网格的编号,或根据多边形区域提取出最小外接矩形,利用四分树算法确定多边形区域属于的第二类单元网格的编码;
Spark的分布式文件存储模块,用于将第一类单元网格的编号或第二类单元网格的编码分块后,进行存储;
快速相交多边形区域确定模块,用于根据Spark的分布式文件系统中存储的第一类单元网格的编号或第二类单元网格的编码,确定包含相同第一类单元网格编号的多边形区域,或属于相同第二类单元网格编码的多边形区域,为可能存在相交的多边形区域;
相交区域面积计算模块,用于判断可能存在相交的多边形区域的相交关系,计算对应的相交区域的面积。
根据本发明的另一个方面,提供一种计算机设备,包括存储器,处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上所述的基于Spark的地图相交区域面积计算方法。
本发明的有益效果在于,提出了一种基于空间索引的地图相交区域面积计算方法、系统及计算机设备,在给定多个地图后,本发明可以快速的检索所有地图内相交区域的位置信息,从而快速计算相交区域面积大小。
附图说明
图1是本发明实施例提供的一种基于Spark的地图相交区域面积计算方法流程图;
图2是本发明实施例中计算多边形包含的网格编号方法示意图;
图3是本发明实施例提供的另一种基于Spark的地图相交区域面积计算方法流程图;
图4是本发明实施例中多边形编码规则中的最小四分网格示意图;
图5是本发明实施例中利用多边形编码规则确定相交的方法示意图;
图6是本发明实施例提供的一种基于Spark的地图相交区域面积计算系统结构图;
图7是本发明实施例提供的一种计算机设备的结构示意图。
具体实施方式
下面本发明具体的实施方式进行阐述,来进一步说明本发明的出发点以及相应的技术方案。
图1是本发明实施例提供的一种基于Spark计算引擎的地图相交区域面积计算方法流程图,所述方法包括以下步骤:
步骤101,根据经纬度和网格个数将地图划分成网格形式;
对于地图给定最大经度xmax、最大纬度ymax、最小经度xmin、最小纬度ymin和每个网格的边长sideLength,建立网格索引,生成网格并为每个网格进行编号,方便后续快速定位多边形位置和ID,所述边长sideLength可根据实际应用需求和精度要求进行设置。
步骤102,读取地图数据,包括多边形区域的ID和多边形区域的顶点序列,根据网格编号规则确定多边形区域包含的第一类单元网格的编号;将第一类单元网格的编号进行分块后存入Spark的分布式文件系统中;
优选的,根据网格编号规则确定多边形区域包含的第一类单元网格的编号,包括:
根据多边形的顶点序列计算出多边形的第一类单元网格的编号,所述第一类单元网格的编号包括顶点网格编号、边经过的网格编号和完全包含的网格编号;首先计算顶点网格编号,对于坐标为(xi,yi)的顶点i,计算顶点i的网络编号为:
其中xmin为地图的最小经度,ymin为地图的最小维度,sideLength为网格的边长;
再计算多边形的边经过的网格编号,依顶点序列顺序两两遍历所有顶点坐标,计算两坐标(xi,yi)和(xi+1,yi+1)的斜截式方程y=kx+b,计算两顶点X轴的变化范围「xi,xi+1」,取整后带入斜截式方程中计算得到纵轴值y,若y<yi,则两坐标的连接直线经过了顶点xi左方的网格,若y≥yi,则直线经过xi上方的网格;
最后计算多边形完全包含的网格编号,计算顶点序列的最小外接矩形(如图2中深灰色和浅灰色组成的区域),去掉最小外接矩形最外层的网格,得到一个更小的矩形区域(如图2中的浅灰色组成区域),将更小的矩形区域中的网格编号减去出现过的顶点网格编号和出现过的边网格编号后,得到完全包含的网格编号(如图2中的2-3网格)。
如图2所示,该白色实线围成的多边形其顶点网格编号包括(1-3,2-1,3-3,3-4),边经过的网格编号包括(2-4,3-2,2-2,1-2),完全包含的网格编号为2-3。
将第一类单元网格的编号进行分块后存入Spark的分布式文件系统中,是为了方便后续操作的重复读取,可以提高确定多个地图中多边形相交的速度。
步骤103,根据Spark的分布式文件系统中存储的第一类单元网格的编号,确定包含相同第一类单元网格编号的多边形区域,为可能存在相交的多边形区域。比如另一多边形与图2中的多边形包含相同的网格2-3,则可判断两个多边形存在相交情况。
步骤104,判断可能存在相交的多边形区域的相交关系,计算对应的相交区域的面积。
优选的,对于可能存在相交的两个多边形A和B,其顶点集合分别为A’和B’,遍历顶点集合B’,利用射线法判断各个顶点是否在多边形A中,若B存在任意一个顶点在A内,则A与B相交,若B所有顶点均在A内,则A包含B;
若A包含B,则计算被包含的多边形B的面积为相交区域的面积,若A与B相交,则提取出两多边形相交的顶点序列Z,根据顶点序列Z计算相交区域的面积。
图3是本发明提供的另一种基于Spark的地图相交区域面积计算方法,包括以下步骤:
步骤301,根据经纬度和网格个数,将地图划分成网格形式;
对于地图给定最大经度xmax、最大纬度ymax、最小经度xmin、最小纬度ymin和每个网格的边长sideLength,建立网格索引,生成网格并为每个网格进行编号,方便后续快速定位多边形位置和ID,所述边长sideLength可根据实际应用需求和精度要求进行设置。
步骤302,读取地图数据,包括多边形区域的ID和多边形区域的顶点序列,根据多边形区域提取出最小外接矩形,利用四分树算法确定多边形区域属于的第二类单元网格的编码;将第二类单元网格的编码,进行分块后存入Spark的分布式文件系统中;
优选的,根据多边形区域提取出最小外接矩形,利用四分树算法确定多边形区域属于的第二类单元网格的编码,包括:
根据多边形区域提取出最小外接矩形,遍历多边形的顶点集合,提取出最大和最小的经纬度信息作为最小外接矩形的4个顶点,最小外接矩形的最小经度为Lonmin,最大经度为Lonmax,最小纬度为Latmin,最大纬度为Latmax,计算所述4个顶点在整个地图中所处网格的坐标,整形处理后转换成二进制形式,所述4个顶点的坐标为:
最大纬度Grid_y
max:
其中x
min为地图的最小经度,x
max为地图的最大经度,y
min为地图的最小维度,y
max为地图的最大维度;
遍历二进制码的长度L,提取最小外接矩形的左下角顶点(Grid_xmin,Grid_ymin)对应长度的值XminLYminL,提取右上角顶点(Grid_xmax,Grid_ymax)对应长度的值XmaxLYmaxL,若两个顶点的长度的值相等表示该外接多边形4个顶点在一个网格内,且该网格已是其最小单位网格,若不相等,则重复上述步骤往上找,直至找到最小单元网格;对最小单元网格进行编码,得到多边形区域属于的第二类单元网格的编码。
举例说明,假设左下角顶点坐标为(5,4),二进制化后的左下角顶点为(0101,0100),二进制码的长度L为4,从第1位到第4位遍历,将对应位进行提取并结合得到XminLYminL,表示为(00,11,00,10),再将二进制转换为十进制可得到左下角顶点编码为1412;右上角顶点坐标可同理求得,假设右上角顶点坐标为(7,4),提取XmaxLYmaxL为(00,11,10,10),编码为1422。由于编码第三位不等,因此该最小外接矩形的最小单元网格应是14XX,最终该外接矩形编码为1400。
具体编码规则如图4和图5所示。图4是一个最小的四分网格,根据X轴和Y轴坐标我们可以为每一个网格编码(编码范围为1-4)。图5是一个编码实例,浅灰色三角形外接矩形只占一个网格因此其编码为21;灰色圆形区域最小外接矩形存在跨网格的情况,因此向上寻找最小四分网格即左上角虚线构成的这个大正方形,编码为20,其中0表示该多边形跨网格;正中黑色五边形由于跨网格,编码为00,这一情况在实际数据中很少见。
步骤303,根据Spark的分布式文件系统中保存的第二类单元网格的编码,确定属于相同第二类单元网格编码的多边形区域,为可能存在相交的多边形区域;
具体匹配规则举例说明如下:假设现有编码21的多边形,那么编码为21和20的多边形都有可能与其相交。
步骤304,判断可能存在相交的多边形区域的相交关系,计算对应的相交区域的面积。
优选的,对于可能存在相交的两个多边形A和B,其顶点集合分别为A’和B’,遍历顶点集合B’,利用射线法判断各个顶点是否在多边形A中,若B存在任意一个顶点在A内,则A与B相交,若B所有顶点均在A内,则A包含B;
若A包含B,则计算被包含的多边形B的面积为相交区域的面积,若A与B相交,则提取出两多边形相交的顶点序列Z,根据顶点序列Z计算相交区域的面积。
图6是本发明实施例提供的一种基于Spark的地图相交区域面积计算系统,所述系统包括以下模块:
地图网格化模块601,用于根据经纬度和网格个数,将地图划分成网格形式;
对于地图给定最大经度xmax、最大纬度ymax、最小经度xmin、最小纬度ymin和每个网格的边长sideLength,建立网格索引,生成网格并为每个网格进行编号,方便后续快速定位多边形位置和ID,所述边长sideLength可根据实际应用需求和精度要求进行设置。
单元网格编号码确定模块602,用于读取地图数据,包括多边形区域的ID和多边形区域的顶点序列,根据网格编号规则确定多边形区域包含的第一类单元网格的编号,或根据多边形区域提取出最小外接矩形,利用四分树算法确定多边形区域属于的第二类单元网格的编码;
Spark的分布式文件存储模块603,用于将第一类单元网格的编号或第二类单元网格的编码分块后,进行存储;
快速相交多边形区域确定模块604,用于根据Spark的分布式文件系统中存储的第一类单元网格的编号或第二类单元网格的编码,确定包含相同第一类单元网格编号的多边形区域,或属于相同第二类单元网格编码的多边形区域,为可能存在相交的多边形区域;
相交区域面积计算模块605,用于判断可能存在相交的多边形区域的相交关系,计算对应的相交区域的面积。
优选的,单元网格编号码602,确定模块根据网格编号规则确定多边形区域包含的第一类单元网格的编号,包括:
根据多边形的顶点序列计算出多边形的第一类单元网格的编号,所述第一类单元网格的编号包括顶点网格编号、边经过的网格编号和完全包含的网格编号;首先计算顶点网格编号,对于坐标为(xi,yi)的顶点i,计算顶点i的网络编号为:
其中xmin为地图的最小经度,ymin为地图的最小维度,sideLength为网格的边长;
再计算多边形的边经过的网格编号,依顶点序列顺序两两遍历所有顶点坐标,计算两坐标(xi,yi)和(xi+1,yi+1)的斜截式方程y=kx+b,计算两顶点X轴的变化范围「xi,xi+1」,取整后带入斜截式方程中计算得到纵轴值y,若y<yi,则两坐标的连接直线经过了顶点xi左方的网格,若y≥yi,则直线经过xi上方的网格;
最后计算多边形完全包含的网格编号,计算顶点序列的最小外接矩形,去掉最小外接矩形最外层的网格,得到一个更小的矩形区域,将更小的矩形区域中的网格编号减去出现过的顶点网格编号和边网格编号后,得到完全包含的网格编号。
优选的,单元网格编号码确定模块602,根据多边形区域提取出最小外接矩形,利用四分树算法确定多边形区域属于的第二类单元网格的编码,包括:
根据多边形区域提取出最小外接矩形,遍历多边形的顶点集合,提取出最大和最小的经纬度信息作为最小外接矩形的4个顶点,最小外接矩形的最小经度为Lonmin,最大经度为Lonmax,最小纬度为Latmin,最大纬度为Latmax,计算所述4个顶点在整个地图中所处网格的坐标,整形处理后转换成二进制形式,所述4个顶点的坐标为:
最大经度Grid_xmax:
最大纬度Grid_ymax:
其中xmin为地图的最小经度,xmax为地图的最大经度,ymin为地图的最小维度,ymax为地图的最大维度;
遍历二进制码的长度L,提取最小外接矩形的左下角顶点(Grid_xmin,Grid_ymin)对应长度的值XminLYminL,提取右上角顶点(Grid_xmax,Grid_ymax)对应长度的值XmaxLYmaxL,若两个顶点的长度的值相等表示该外接多边形4个顶点在一个网格内,且该网格已是其最小单位网格,若不相等,则重复上述步骤往上找,直至找到最小单元网格;对最小单元网格进行编码,得到多边形区域属于的第二类单元网格的编码。
优选的,相交区域面积计算模块605,判断可能存在相交的多边形区域的相交关系,计算对应的相交区域的面积,包括:
对于可能存在相交的两个多边形A和B,其顶点集合分别为A’和B’,遍历顶点集合B’,利用射线法判断各个顶点是否在多边形A中,若B存在任意一个顶点在A内,则A与B相交,若B所有顶点均在A内,则A包含B;
若A包含B,则计算被包含的多边形B的面积为相交区域的面积,若A与B相交,则提取出两多边形相交的顶点序列Z,根据顶点序列Z计算相交区域的面积。
图7是本发明实施例提供的一种计算机设备的结构示意图。如图7所示,该计算机设备包括通过系统总线720连接的处理器710、非易失性存储介质730、内存储器750及网络接口740。其中,计算机设备的非易失性存储介质730存储有操作系统731及计算机可执行指令732,该计算机可执行指令732用于实现本发明实施例中提供的Spark的地图相交区域面积计算方法。该处理器710用于提供计算和控制能力,支撑整个计算机设备的运行。计算机设备中的内存储器750为非易失性存储介质730中的操作系统731及计算机可执行指令732的运行提供环境,网络接口740用于与其它的计算机设备进行网络通信。该计算机设备可以是手机、平板电脑、PC(personal computer)等终端,也可以是服务器等。本领域技术人员可以理解,图7中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体地计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
以上的所述乃是本发明的具体实施例及所运用的技术原理,若依本发明的构想所作的改变,其所产生的功能作用仍未超出说明书及附图所涵盖的精神时,仍应属本发明的保护范围。