Scala Spark 地理空间交叉点

Scala Spark Geospatial Intersection

我有一个数据框折线模式:

|-- Polyline_id: string (nullable = false)
|-- latitude: double(nullable = true)
|-- longitude: double(nullable = true)
|-- point_index: integer(nullable = true)

折线包含每个元素的多行 'Polyline_id'。

以及具有架构的数据框段:

|-- Segments_id: string (nullable = false)
|-- latitudeStart: double(nullable = true)
|-- longitudeStart: double(nullable = true)
|-- latitudeEnd: double(nullable = true)
|-- longitudeEnd: double(nullable = true)

段中每个元素仅包含一行 'Segments_id'

我想生成一个新数据框,其中包含所有 'Segments_id',与该段

相交的 'Polyline_id' 列表

一种解决方案是从数据框 Polyline 生成一个新的数据框 SegmentsFromPoly,并通过 UDF 将 SegmentsFromPoly 的所有线段与来自 Segments 的线段进行比较。

我正在为此寻找一种更简单、更有效的方法(如果它确实存在!)。

示例数据:

折线:

"poly_id_1",25.254,55.400,1
"poly_id_1",25.258,55.394,2
"poly_id_1",25.261,55.390,3
"poly_id_2",25.284,55.450,1
"poly_id_2",25.298,55.392,2
"poly_id_2",25.305,55.300,3

细分:

"seg_id_1",25.253,55.405,25.280,55.380
"seg_id_2",25.993,55.405,25.549,55.941
"seg_id_3",25.237,55.489,25.357,55.785
"seg_id_4",25.894,55.719,25.197,55.354

输出:

"seg_id_1",[a poly_id]
"seg_id_1",[a poly_id]
"seg_id_2",[a poly_id]
"seg_id_3",[a poly_id]
"seg_id_3",[a poly_id]
"seg_id_4",[a poly_id]
"seg_id_4",[a poly_id]

您可以使用 Magellan which supports spatial joins using geohash indexer.

要使其正常工作,您必须包含该包并注入 Magellan 优化规则。详情请关注the documentation