2021-09-04 22:37:08 +00:00
---
2022-08-28 14:53:34 +00:00
slug: /en/sql-reference/functions/geo/s2
2022-04-09 13:29:05 +00:00
sidebar_label: S2 Geometry
2021-09-04 22:37:08 +00:00
---
2022-06-02 10:55:18 +00:00
# Functions for Working with S2 Index
2021-09-04 22:37:08 +00:00
2024-06-12 13:09:50 +00:00
## S2Index
2024-06-12 12:09:37 +00:00
2021-09-04 22:37:08 +00:00
[S2 ](https://s2geometry.io/ ) is a geographical indexing system where all geographical data is represented on a three-dimensional sphere (similar to a globe).
2021-10-29 11:28:41 +00:00
In the S2 library points are represented as the S2 Index - a specific number which encodes internally a point on the surface of a unit sphere, unlike traditional (latitude, longitude) pairs. To get the S2 point index for a given point specified in the format (latitude, longitude) use the [geoToS2 ](#geotos2 ) function. Also, you can use the [s2ToGeo ](#s2togeo ) function for getting geographical coordinates corresponding to the specified S2 point index.
2021-09-26 05:59:50 +00:00
2022-06-02 10:55:18 +00:00
## geoToS2
2021-09-04 22:37:08 +00:00
2024-06-12 13:09:50 +00:00
Returns [S2 ](#s2index ) point index corresponding to the provided coordinates `(longitude, latitude)` .
2021-09-04 22:37:08 +00:00
**Syntax**
``` sql
geoToS2(lon, lat)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `lon` — Longitude. [Float64 ](../../data-types/float.md ).
- `lat` — Latitude. [Float64 ](../../data-types/float.md ).
2021-09-04 22:37:08 +00:00
**Returned values**
2024-05-24 03:54:16 +00:00
- S2 point index. [UInt64 ](../../data-types/int-uint.md ).
2021-09-04 22:37:08 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT geoToS2(37.79506683, 55.71290588) AS s2Index;
2021-09-04 22:37:08 +00:00
```
Result:
``` text
┌─────────────s2Index─┐
│ 4704772434919038107 │
└─────────────────────┘
```
2022-06-02 10:55:18 +00:00
## s2ToGeo
2021-09-04 22:37:08 +00:00
2024-06-12 13:09:50 +00:00
Returns geo coordinates `(longitude, latitude)` corresponding to the provided [S2 ](#s2index ) point index.
2021-09-04 22:37:08 +00:00
**Syntax**
``` sql
s2ToGeo(s2index)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `s2index` — S2 Index. [UInt64 ](../../data-types/int-uint.md ).
2021-09-04 22:37:08 +00:00
**Returned values**
2024-05-23 14:39:53 +00:00
- A [tuple ](../../data-types/tuple.md ) consisting of two values:
2024-05-24 03:54:16 +00:00
- `lon` . [Float64 ](../../data-types/float.md ).
- `lat` . [Float64 ](../../data-types/float.md ).
2021-09-04 22:37:08 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2ToGeo(4704772434919038107) AS s2Coodrinates;
2021-09-04 22:37:08 +00:00
```
Result:
``` text
┌─s2Coodrinates────────────────────────┐
│ (37.79506681471008,55.7129059052841) │
└──────────────────────────────────────┘
```
2022-06-02 10:55:18 +00:00
## s2GetNeighbors
2021-09-04 22:37:08 +00:00
2024-06-12 13:09:50 +00:00
Returns S2 neighbor indexes corresponding to the provided [S2 ](#s2index ). Each cell in the S2 system is a quadrilateral bounded by four geodesics. So, each cell has 4 neighbors.
2021-09-04 22:37:08 +00:00
**Syntax**
``` sql
2021-09-26 05:44:44 +00:00
s2GetNeighbors(s2index)
2021-09-04 22:37:08 +00:00
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `s2index` — S2 Index. [UInt64 ](../../data-types/int-uint.md ).
2021-09-04 22:37:08 +00:00
2024-05-23 15:19:03 +00:00
**Returned value**
2021-09-04 22:37:08 +00:00
2024-05-24 03:54:16 +00:00
- An array consisting of 4 neighbor indexes: `array[s2index1, s2index3, s2index2, s2index4]` . [Array ](../../data-types/array.md )([UInt64](../../data-types/int-uint.md)).
2021-09-04 22:37:08 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2GetNeighbors(5074766849661468672) AS s2Neighbors;
2021-09-04 22:37:08 +00:00
```
Result:
``` text
┌─s2Neighbors───────────────────────────────────────────────────────────────────────┐
│ [5074766987100422144,5074766712222515200,5074767536856236032,5074767261978329088] │
└───────────────────────────────────────────────────────────────────────────────────┘
```
2021-09-04 22:38:04 +00:00
2022-06-02 10:55:18 +00:00
## s2CellsIntersect
2021-09-04 22:38:04 +00:00
2024-06-12 13:09:50 +00:00
Determines if the two provided [S2 ](#s2index ) cells intersect or not.
2021-09-04 22:38:04 +00:00
**Syntax**
``` sql
s2CellsIntersect(s2index1, s2index2)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `siIndex1` , `s2index2` — S2 Index. [UInt64 ](../../data-types/int-uint.md ).
2021-09-04 22:38:04 +00:00
2024-05-23 15:19:03 +00:00
**Returned value**
2021-09-04 22:38:04 +00:00
2024-05-24 03:54:16 +00:00
- `1` — If the cells intersect. [UInt8 ](../../data-types/int-uint.md ).
- `0` — If the cells don't intersect. [UInt8 ](../../data-types/int-uint.md ).
2021-09-04 22:38:04 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2CellsIntersect(9926595209846587392, 9926594385212866560) AS intersect;
2021-09-04 22:38:04 +00:00
```
Result:
``` text
┌─intersect─┐
│ 1 │
└───────────┘
```
2022-06-02 10:55:18 +00:00
## s2CapContains
2021-09-04 22:38:04 +00:00
2021-10-29 11:28:41 +00:00
Determines if a cap contains a S2 point. A cap represents a part of the sphere that has been cut off by a plane. It is defined by a point on a sphere and a radius in degrees.
2021-09-04 22:38:04 +00:00
**Syntax**
``` sql
2021-09-26 05:44:44 +00:00
s2CapContains(center, degrees, point)
2021-09-04 22:38:04 +00:00
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `center` — S2 point index corresponding to the cap. [UInt64 ](../../data-types/int-uint.md ).
- `degrees` — Radius of the cap in degrees. [Float64 ](../../data-types/float.md ).
- `point` — S2 point index. [UInt64 ](../../data-types/int-uint.md ).
2021-09-04 22:38:04 +00:00
2024-05-23 15:19:03 +00:00
**Returned value**
2021-09-04 22:38:04 +00:00
2024-05-24 03:54:16 +00:00
- `1` — If the cap contains the S2 point index. [UInt8 ](../../data-types/int-uint.md ).
- `0` — If the cap doesn't contain the S2 point index. [UInt8 ](../../data-types/int-uint.md ).
2021-09-04 22:38:04 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2CapContains(1157339245694594829, 1.0, 1157347770437378819) AS capContains;
2021-09-04 22:38:04 +00:00
```
Result:
``` text
┌─capContains─┐
│ 1 │
└─────────────┘
```
2022-06-02 10:55:18 +00:00
## s2CapUnion
2021-09-04 22:38:04 +00:00
2021-10-29 11:28:41 +00:00
Determines the smallest cap that contains the given two input caps. A cap represents a portion of the sphere that has been cut off by a plane. It is defined by a point on a sphere and a radius in degrees.
2021-09-04 22:38:04 +00:00
**Syntax**
``` sql
s2CapUnion(center1, radius1, center2, radius2)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `center1` , `center2` — S2 point indexes corresponding to the two input caps. [UInt64 ](../../data-types/int-uint.md ).
- `radius1` , `radius2` — Radius of the two input caps in degrees. [Float64 ](../../data-types/float.md ).
2021-09-04 22:38:04 +00:00
**Returned values**
2024-05-24 03:54:16 +00:00
- `center` — S2 point index corresponding the center of the smallest cap containing the two input caps. [UInt64 ](../../data-types/int-uint.md ).
- `radius` — Radius of the smallest cap containing the two input caps. [Float64 ](../../data-types/float.md ).
2021-09-04 22:38:04 +00:00
**Example**
Query:
``` sql
SELECT s2CapUnion(3814912406305146967, 1.0, 1157347770437378819, 1.0) AS capUnion;
```
Result:
``` text
┌─capUnion───────────────────────────────┐
│ (4534655147792050737,60.2088283994957) │
└────────────────────────────────────────┘
```
2021-09-06 22:00:15 +00:00
2022-06-02 10:55:18 +00:00
## s2RectAdd
2021-09-06 22:00:15 +00:00
2021-10-29 11:28:41 +00:00
Increases the size of the bounding rectangle to include the given S2 point. In the S2 system, a rectangle is represented by a type of S2Region called a `S2LatLngRect` that represents a rectangle in latitude-longitude space.
2021-09-06 22:00:15 +00:00
**Syntax**
``` sql
s2RectAdd(s2pointLow, s2pointHigh, s2Point)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `s2PointLow` — Low S2 point index corresponding to the rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2PointHigh` — High S2 point index corresponding to the rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2Point` — Target S2 point index that the bound rectangle should be grown to include. [UInt64 ](../../data-types/int-uint.md ).
2021-09-06 22:00:15 +00:00
**Returned values**
2024-05-24 03:54:16 +00:00
- `s2PointLow` — Low S2 cell id corresponding to the grown rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2PointHigh` — Height S2 cell id corresponding to the grown rectangle. [UInt64 ](../../data-types/float.md ).
2021-09-06 22:00:15 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2RectAdd(5178914411069187297, 5177056748191934217, 5179056748191934217) AS rectAdd;
2021-09-06 22:00:15 +00:00
```
Result:
``` text
┌─rectAdd───────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘
```
2022-06-02 10:55:18 +00:00
## s2RectContains
2021-09-06 22:00:15 +00:00
2021-10-29 11:28:41 +00:00
Determines if a given rectangle contains a S2 point. In the S2 system, a rectangle is represented by a type of S2Region called a `S2LatLngRect` that represents a rectangle in latitude-longitude space.
2021-09-06 22:00:15 +00:00
**Syntax**
``` sql
s2RectContains(s2PointLow, s2PointHi, s2Point)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `s2PointLow` — Low S2 point index corresponding to the rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2PointHigh` — High S2 point index corresponding to the rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2Point` — Target S2 point index. [UInt64 ](../../data-types/int-uint.md ).
2021-09-06 22:00:15 +00:00
2024-05-23 15:19:03 +00:00
**Returned value**
2021-09-06 22:00:15 +00:00
2024-05-23 15:19:03 +00:00
- `1` — If the rectangle contains the given S2 point.
- `0` — If the rectangle doesn't contain the given S2 point.
2021-09-06 22:00:15 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2RectContains(5179062030687166815, 5177056748191934217, 5177914411069187297) AS rectContains;
2021-09-06 22:00:15 +00:00
```
Result:
``` text
┌─rectContains─┐
│ 0 │
└──────────────┘
```
2023-01-31 16:15:29 +00:00
## s2RectUnion
2021-09-06 22:00:15 +00:00
2021-10-29 11:28:41 +00:00
Returns the smallest rectangle containing the union of this rectangle and the given rectangle. In the S2 system, a rectangle is represented by a type of S2Region called a `S2LatLngRect` that represents a rectangle in latitude-longitude space.
2021-09-06 22:00:15 +00:00
**Syntax**
``` sql
s2RectUnion(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `s2Rect1PointLow` , `s2Rect1PointHi` — Low and High S2 point indexes corresponding to the first rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2Rect2PointLow` , `s2Rect2PointHi` — Low and High S2 point indexes corresponding to the second rectangle. [UInt64 ](../../data-types/int-uint.md ).
2021-09-06 22:00:15 +00:00
**Returned values**
2024-05-24 03:54:16 +00:00
- `s2UnionRect2PointLow` — Low S2 cell id corresponding to the union rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2UnionRect2PointHi` — High S2 cell id corresponding to the union rectangle. [UInt64 ](../../data-types/int-uint.md ).
2021-09-06 22:00:15 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2RectUnion(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectUnion;
2021-09-06 22:00:15 +00:00
```
Result:
``` text
┌─rectUnion─────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘
```
2022-06-02 10:55:18 +00:00
## s2RectIntersection
2021-09-06 22:00:15 +00:00
2021-10-29 11:28:41 +00:00
Returns the smallest rectangle containing the intersection of this rectangle and the given rectangle. In the S2 system, a rectangle is represented by a type of S2Region called a `S2LatLngRect` that represents a rectangle in latitude-longitude space.
2021-09-06 22:00:15 +00:00
**Syntax**
``` sql
s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)
```
**Arguments**
2024-05-24 03:54:16 +00:00
- `s2Rect1PointLow` , `s2Rect1PointHi` — Low and High S2 point indexes corresponding to the first rectangle. [UInt64 ](../../data-types/int-uint.md ).
- `s2Rect2PointLow` , `s2Rect2PointHi` — Low and High S2 point indexes corresponding to the second rectangle. [UInt64 ](../../data-types/int-uint.md ).
2021-09-06 22:00:15 +00:00
**Returned values**
2024-05-24 03:54:16 +00:00
- `s2UnionRect2PointLow` — Low S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. [UInt64 ](../../data-types/int-uint.md ).
- `s2UnionRect2PointHi` — High S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. [UInt64 ](../../data-types/int-uint.md ).
2021-09-06 22:00:15 +00:00
**Example**
Query:
``` sql
2021-10-29 11:28:41 +00:00
SELECT s2RectIntersection(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectIntersection;
2021-09-06 22:00:15 +00:00
```
Result:
``` text
┌─rectIntersection──────────────────────────┐
│ (5178914411069187297,5177056748191934217) │
└───────────────────────────────────────────┘
```