对于空间数据的分布式处理,只需要在spark中将空间数据的特征要素对象从各种输入源转化为弹性分布式数据集(FeatureRDD)后,就可以针对该FeatureRDD进行各种空间及属性的分布式分析操作了。SuperMap iObjects for Spark提供了多种针对静态FeatureRDD进行的分析操作,包括聚合统计分析、密度分析、缓冲区分析、热点分析、轨迹重建、要素连接等。下面以几种常用的接口使用进行说明。
1 聚合分析
聚合分析,即将源特征要素数据集的空间及属性信息,收集并汇总统计到与其发生空间关系的另一组特征要素或规则格网中。根据聚合类型的不同使用了FeatureRDD中两个名为summarize的重载接口。
1.1特征要素聚合
特征要素聚合即将源要素数据集聚合到另一组与其发生指定空间关系的特征要素中,并统计聚合后的属性。例如将点数据集分别聚合到多个多边形中来统计每个多边形中点的个数,或将面数据集聚合到多条线上来统计每条线经过的所有面的总面积。
语法:
def summarize(summaryRDD: FeatureRDD, attributesStat: Array[FieldStatistics], relation: GeometricRelation): FeatureRDD
参数说明:
summaryRDD : 聚合要素数据集,源要素数据集将按此数据集规定的要素类型和范围来汇总统计。
attributesStat : 属性统计参数,其中FieldStatistics的属性由原数据集字段名、统计类型和结果统计字段名组成。
relation : 空间关系类型,包括是否包含是否相交等。
返回值说明:
返回聚合结果数据集,其中的要素几何对象是summaryRDD中几何对象的子集,属性字段为attributesStat中指定的统计结果字段。
示例:
val fieldStatistics = Array(FieldStatistics("", StatisticsMode.RecordCount, "RecordCount"), FieldStatistics("FieldName", StatisticsMode.Average, "AverageField"))
val summarizedRDD = pointFeatureRDD.summarize(polygonRDD, fieldStatistics, Operator.RelContain)
StatisticsMode支持的字段统计类型如下:
名称 | 描述 |
---|---|
RecordCount | 记录数 |
Sum | 求和 |
Max | 最大值 |
Min | 最小值 |
Average | 平均值 |
StdDeviation | 标准差 |
Variance | 方差 |
1.2 格网聚合
格网聚合即将源要素数据集聚合到规则格网并统计每个格子中要素集合的属性值,规则格网包括方格网和蜂窝网。例如将点数据集聚合到蜂窝格网中来统计每个格子中点的个数。
语法:
def summarize(mesh: Mesh, attributesStat: Array[FieldStatistics], extensionRadius: Option[Double]): FeatureRDD
参数说明:
mesh : 聚合格网对象,包括方格网和蜂窝格网两种,需要分别指定长宽或半径以及原点来构造。源要素数据集将按此格网对象中规定的格网形状和大小来进行汇总统计。
attributesStat : 属性统计参数,其中FieldStatistics的属性由原数据集字段名、统计类型和结果统计字段名组成。有关统计类型即StatisticsMode的详细信息参考上节。
extensionRadius : 可选参数扩展半径,即每个格子额外向外扩展的距离。
返回值说明:
返回聚合结果数据集,其中的要素几何对象是格子面的集合,没有被聚合到的格子不会加入到结果数据集中,结果数据集中的属性字段为attributesStat中指定的统计结果字段。
示例:
Val mesh = Mesh.Hexagon(10, Point2D())
val fieldStatistics = Array(FieldStatistics("", StatisticsMode.RecordCount, "RecordCount"), FieldStatistics("FieldName", StatisticsMode.Sum, "SumField"))
val summarizedRDD = pointFeatureRDD.summarize(mesh, fieldStatistics, None)
2 密度分析
密度分析,用于计算大批量点要素在规则格网中的密度分布,在某种意义上来说,相当于在网格平面上将点对象的测量值散开来,将每个点对象的测量量分布到指定的半径范围中,并计算平面上每个格子内的密度值。根据分布方式的不同,分为核密度分析和均匀密度分析。iObjects for Spark提供了DensityAnalyst类型来支持密度分析功能。
语法:
def apply(pointFeatureRDD: FeatureRDD,
fieldNames: Array[String],
mesh: Mesh,
radius: Double,
methodType: DensityMethodType,
rcBounds: Rectangle
): FeatureRDD
参数说明:
pointFeatureRDD : 需要进行密度分析的点数据集。
fieldNames : 需要进行密度分析的测量值字段名称数组。每个待计算字段都将产生一个结果密度字段,字段名为输入字段名+“_Density”。按点个数统计的密度值始终都会被计算,即每个点都按值为1处理,其结果存储在名为“RecordCount_Density”的字段中。若不设置该参数或该参数设为null或isEmpty,仍然会计算按点个数统计的密度值。
mesh : 结果网格类型,包括方格网和蜂窝格网两种,需要分别指定长宽或半径以及原点来构造。
radius : 用于计算密度的查找半径。
methodType : 计算密度的方法类型,分为Uniform平均密度和Kernel核函数密度。
rcBounds : 密度分析的计算范围,用于过滤输入的点数据。
返回值说明:
返回结果密度数据集,其中的要素几何对象是格子面的集合,属性字段即每个格子对应各个测量值字段的密度值。
示例:
Val mesh = Mesh.Grid(5, Point2D())
val rcBounds = Rectangle(-74.05,40.9,-73.75,40.6)
val densityRDD = DensityAnalyst(pointFeatureRDD, “”, mesh, 50, DensityMethodType.Kernel, rcBounds)
3 缓冲区分析
缓冲区分析是围绕空间对象,使用与空间对象的距离值(称为缓冲半径)作为半径,生成该对象的缓冲区域的过程,其中缓冲半径可以是固定数值也可以是空间对象各自的属性值。缓冲区也可以理解为空间对象的影响或服务范围。
iObject for Spark产品中的缓冲区分析与传统组件产品相比,可支持更大数据量的特征对象数据,其中对象和对象之间的分析计算是分布式并行的,但是不支持缓冲区合并。
语法:
def buffer(distance: Double, unit: DistanceUnit, bufferEndType: BufferEnd): FeatureRDD
参数说明:
distance : 缓冲区半径。
unit : 缓冲区半径的单位。
bufferEndType : 线数据缓冲区端头类型,分为圆头和平头,只有在输入数据集是线类型时才生效。
返回值说明:
返回面类型的缓冲区结果FeautreRDD。
示例:
bufferRDD = lineFeatureRDD.buffer(100, DistanceUnit.Meter, BufferEnd.Round)
另外,FeatureRDD类中还提供了缓冲区半径为属性字段的接口和针对线数据集生成左右不等缓冲区的接口,具体使用说明及参数请查阅接口文档。