

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# ST\$1GeoSquare
<a name="ST_GeoSquare-function"></a>

ST\$1GeoSquare 以递归方式将域 ([-180, 180], [-90, 90]) 细分为相等的正方形区域，称为 *geosquare*，直至指定深度。细分基于所提供的一个点的位置。包含该点的 geosquare 在每一步都被细分，直至达到最大深度。这个 geosquare 的选择是稳定的，即，该函数的结果仅取决于输入参数。该函数将返回一个唯一值，用于标识该点所在的最终 geosquare。

ST\$1GeoSquare 接受一个 POINT 值，其 x 坐标表示经度，y 坐标表示纬度。经度和纬度分别限制为 [-180, 180] 和 [-90, 90]。ST\$1GeoSquare 的输出可以用作 [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md) 函数的输入。

地球沿赤道一周的弧线是 360°，且地球被分为两个半球（东半球和西半球），每个半球的经线（子午线）都是从 0°到 180°。按照惯例，投影到笛卡尔平面上的 x 轴时，东经线为“\$1”（正）坐标，西经线为“-”（负）坐标。在地球的 0°赤道线以北和以南分别有 90°纬线，每条纬线都与地球的 0°赤道线平行。按照惯例，投影到笛卡尔平面时，北纬线与“\$1”（正）y 轴相交，南纬线与“-”（负）y 轴相交。由经线和纬线相交形成的球形网格被转换为投影到笛卡尔平面上的网格，在笛卡尔平面上具有标准的正负 x 坐标和正负 y 坐标。

ST\$1GeoSquare 的目的是用相等的代码值标记相近的点。位于同一 geosquare 中的点将获得相同的代码值。geosquare 用于将地理坐标（纬度和经度）编码为整数。较大的区域被划分为网格，以在地图上以不同的分辨率描绘一个区域。geosquare 可用于空间索引、空间分组、邻近搜索、位置搜索和创建唯一的地点标识符。[ST\$1GeoHash](ST_GeoHash-function.md) 函数遵循类似的过程，将区域划分为网格，但编码不同。

## 语法
<a name="ST_GeoSquare-function-syntax"></a>

```
ST_GeoSquare(geom)
```

```
ST_GeoSquare(geom, max_depth)
```

## 参数
<a name="ST_ST_GeoSquare-function-arguments"></a>

 *geom*   
一个数据类型为 `GEOMETRY` 的 POINT 值，或一个计算结果为 POINT 子类型的表达式。该点的 x 坐标（经度）必须在以下范围内：`-180` – `180`。该点的 y 坐标（纬度）必须在以下范围内：`-90` – `90`。

 *max\$1depth*   
数据类型 `INTEGER` 的值。包含该点的域被以递归方式细分的最大次数。该值必须是介于 1 到 32 之间的整数。默认值为 32。细分的实际最终次数小于或等于指定的 *max\$1depth*。

## 返回类型
<a name="ST_GeoSquare-function-return"></a>

`BIGINT`

该函数返回一个唯一值，用于标识输入点所在的最终 geosquare。

如果输入 *geom* 不是点，则该函数将返回错误。

如果输入点为空，则返回值不是 [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md) 函数的有效输入。使用 [ST\$1IsEmpty](ST_IsEmpty-function.md) 函数可防止使用空点调用 ST\$1GeoSquare。

如果输入点不在范围内，则该函数将返回错误。

如果输入 *max\$1depth* 超出范围，则该函数将返回错误。

## 示例
<a name="ST_ST_GeoSquare-function-examples"></a>

以下 SQL 从输入点返回 geosquare。

```
SELECT ST_GeoSquare(ST_Point(13.5, 52.5));
```

```
  st_geosquare
-----------------------
 -4410772491521635895
```

以下 SQL 从输入点返回 geosquare，最大深度为 `10`。

```
SELECT ST_GeoSquare(ST_Point(13.5, 52.5), 10);
```

```
 st_geosquare
--------------
 797852
```