> For the complete documentation index, see [llms.txt](https://glink.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://glink.gitbook.io/docs/spatial-join.md).

# Spatial Join

Glink 在 Flink 上扩展了三种类型的 spatial join，用以支持基于空间关系的 join。其中，spatial dimension join 一般用于流数据与不变数据（或缓慢变化数据）的 join，而 spatial window join 和 spatial interval join 用于双流数据的 join。

## Spatial Dimension Join

spatial dimension join 一般用于流数据与维度数据的 join，通过维度数据丰富流数据的内容。在 Glink 中维度数据可以有两种存在形式，一种是以广播状态的形式存在于 Flink 的内部状态中，另一种是存在于外部空间或时空数据库中。在 `SpatialDataStream` API 中支持上述两种维度数据的存在形式，但是在 Spatial SQL API 中仅支持将维度数据存放在外部数据库中。

### `SpatialDataStream` API

在 `SpatialDataStream` API 中可通过如下方式快速实现 spatial dimension join，其中 `TopologyType` 用于指定基于何种空间关系进行 join，`JoinFunction` 用于给出流数据与维度数据的具体 join 方式，`TypeHint` 用于指示 join 后返回的数据类型。

```java
SpatialDataStream<Point> pointStream = ...
BroadcastSpatialDataStream<Polygon> polygonStream = ...
pointStream.spatialDimentionJoin(
    polygonStream,
    <TopologyType>,
    <JoinFunction>,
    <TypeHint>)
```

## Spatial Window Join

spatial window join 支持双流数据的 spatial join，关于流数据上的 window join 可参考 [Flink Window Join](https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/joining.html#window-join)。目前 Glink 的 spatial window join 仅支持 `SpatialDataStream` API。

### `SpatialDataStream` API

`SpatialDataStream` API 提供了双流 spatial window join 函数，可通过如下方式调用。其中 `WindowAssigner` 用于定义窗口，其余参数与 spatial dimension join 相同。

```
spatialStream1.spatialWindowJoin(
    spatialStream2,
    <TopologyType>,
    <WindowAssigner>,
    <JoinFunction>,
    <TypeHint>);
```

## Spatial Interval Join

spatial interval join 同样用于双流 join，关于 interval join 的概念可参考 [Flink Interval Join](https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/joining.html#interval-join)。目前 Glink 的 spatial interval join 仅支持 `SpatialDataStream` API。

### `SpatialDataStream` API

`SpatialDataStream` API 提供了双流 spatial interval join 函数，可通过如下方式调用。其中两个 `Time` 用于定义 join 的时间上下界，其余参数与 spatial dimension join 相同。

```
spatialStream1.spatialWindowJoin(
    spatialStream2,
    <TopologyType>,
    <Time>,
    <Time>,
    <JoinFunction>,
    <TypeHint>);
```
