

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

# 在 Amazon Redshift 中查询空间数据
<a name="geospatial-overview"></a>

*空间数据*描述几何体在定义空间（空间参照系）中的位置和形状。Amazon Redshift 支持具有 `GEOMETRY` 和 `GEOGRAPHY` 数据类型的空间数据，其中包含空间数据和数据的空间参考系统标识符 (SRID)。

空间数据包含可用于表示地理要素的几何数据。此类数据的示例包括天气报告、地图方向、包含地理位置的推特、店铺位置以及航空公司路线。空间数据在业务分析、报告和预测中起着重要的作用。

您可以使用 Amazon Redshift SQL 函数查询空间数据。空间数据包含对象的几何值。

`GEOMETRY` 数据类型操作在笛卡尔平面上工作。尽管空间参考系统标识符 (SRID) 存储在对象内部，但该 SRID 只是坐标系的标识符，在处理 `GEOMETRY` 对象的算法中没有任何作用。对 `GEOGRAPHY` 数据类型执行的操作将对象内部的坐标视为球体上的球面坐标。此球体由 SRID 定义，该 SRID 引用了地理空间参考系统。默认情况下，`GEOGRAPHY` 数据类型是使用空间参考 (SRID) 4326 创建的，参照世界大地测量系统 (WGS) 84。有关 SRID 的更多信息，请参阅维基百科中的[空间参考系统](https://en.wikipedia.org/wiki/Spatial_reference_system)。

您可以使用 ST\_Transform 函数来转换来自各种空间参考系统的坐标。坐标转换完成后，您还可以在两者之间使用简单的转换，只需使用地理 SRID 对输入 `GEOMETRY` 进行编码即可。此转换仅复制坐标，无需进一步转换。例如：

```
SELECT ST_AsEWKT(ST_GeomFromEWKT('SRID=4326;POINT(10 20)')::geography);
```

```
st_asewkt
------------------------
 SRID=4326;POINT(10 20)
```

为了更好地理解 `GEOMETRY` 和 `GEOGRAPHY` 数据类型之间的区别，考虑使用世界大地测量系统 (WGS) 84 来计算柏林机场 (BER) 和旧金山机场 (SFO) 之间的距离。使用 `GEOGRAPHY` 数据类型，结果以米为单位。使用 SRID 4326 `GEOMETRY` 数据类型时，结果以度为单位，无法转换为米，因为一度的距离取决于地球几何体的位置。

`GEOGRAPHY` 数据类型的计算主要用于现实圆形地球计算，如一个国家的无误差精确面积。但是，它们的计算成本要高得多。因此，ST\_Transform 可以将坐标转换为适当的局部投影坐标系，实现更快的 `GEOMETRY` 数据类型计算。

使用空间数据，您可以运行查询以执行以下操作：
+ 找出两点之间的距离。
+ 检查一个区域 (多边形) 是否包含另一个区域。
+ 检查一条线串是否与另一条线串或多边形相交。

您可以使用 `GEOMETRY` 数据类型来保存空间数据的值。Amazon Redshift 中的 `GEOMETRY` 值可以定义二维 (2D)、三维 (3DZ)、带度量的二维 (3DM) 和四维 (4D) 几何体基元数据类型：
+ 二维 (2D) 几何体由平面中的两个笛卡尔坐标 (x, y) 指定。
+ 二维 (2D) 几何体由空间中的三个笛卡尔坐标 (x, y, z) 指定。
+ 带测量 (3DM) 的二维几何体由三个坐标 (x, y, m) 指定，其中前两个坐标是平面中的笛卡尔坐标，第三个是测量值。
+ 四维 (4D) 几何体由四个坐标 (x, y, z, m) 指定，其中前三个坐标是空间中的笛卡尔坐标，第四个是测量值。

有关几何体基元数据类型的更多信息，请参阅 Wikipedia 中的[几何体的已知文本表示](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)。

您可以使用 `GEOGRAPHY` 数据类型来保存空间数据的值。Amazon Redshift 中的 `GEOGRAPHY` 值可以定义二维 (2D)、三维 (3DZ)、带度量的二维 (3DM) 和四维 (4D) 几何体基元数据类型：
+ 二维 (2D) 几何体由球体上的经纬度坐标指定。
+ 三维 (3DZ) 几何体由球体上的经纬度和高度坐标指定。
+ 带测量的二维 (3DM) 几何体由三个坐标（经度、纬度、度量）指定，其中前两个坐标是球面角坐标，第三个是测量值。
+ 四维 (4D) 几何体由四个坐标（经度、纬度、高度、度量）指定，其中前三个坐标是经度、纬度和高度，第四个是测量值。

有关地理坐标系的更多信息，请参阅维基百科中的[地理坐标系](https://en.wikipedia.org/wiki/Geographic_coordinate_system)和[球坐标系](https://en.wikipedia.org/wiki/Spherical_coordinate_system)。

`GEOMETRY` 和 `GEOGRAPHY` 数据类型具有以下子类型：
+ `POINT`
+ `LINESTRING`
+ `POLYGON`
+ `MULTIPOINT`
+ `MULTILINESTRING`
+ `MULTIPOLYGON`
+ `GEOMETRYCOLLECTION`

有一些 Amazon Redshift SQL 函数支持以下几何数据的表示形式：
+ GeoJSON
+ 已知文本 (WKT) 
+ 扩展的已知文本 (EWKT)
+ 已知二进制 (WKB) 表示 
+ 扩展的已知二进制文件 (EWKB)

您可以在 `GEOMETRY` 和 `GEOGRAPHY` 数据类型之间转换。

以下 SQL 将线串从 `GEOMETRY` 转换到 `GEOGRAPHY`。

```
SELECT ST_AsEWKT(ST_GeomFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)')::geography);
```

```
 st_asewkt
----------------------------------------------
 SRID=4326;LINESTRING(110 40,2 3,-10 80,-7 9)
```

以下 SQL 将线串从 `GEOMETRY` 转换到 `GEOGRAPHY`。

```
SELECT ST_AsEWKT(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)')::geometry);
```

```
 st_asewkt
----------------------------------------------
 SRID=4326;LINESTRING(110 40,2 3,-10 80,-7 9)
```

Amazon Redshift 提供了许多 SQL 函数来查询空间数据。除了 `ST_IsValid` 函数之外，接受 `GEOMETRY` 对象作为参数的空间函数期望该 `GEOMETRY` 对象是有效的几何体。如果 `GEOMETRY` 或 `GEOGRAPHY` 对象无效，则空间函数的行为未定义。有关有效性的更多信息，请参阅[几何有效性](spatial-terminology.md#spatial-terminology-validity)。

有关用于查询空间数据的 SQL 函数的详细信息，请参阅[空间函数](geospatial-functions.md)。

有关加载空间数据的详细信息，请参阅[加载 GEOMETRY 或 GEOGRAPHY 数据类型的列](copy-usage_notes-spatial-data.md)。

**Topics**
+ [教程：将空间 SQL 函数与 Amazon Redshift 配合使用](spatial-tutorial.md)
+ [将 shapefile 加载到 Amazon Redshift](spatial-copy-shapefile.md)
+ [Amazon Redshift 空间数据的术语](spatial-terminology.md)
+ [将空间数据与 Amazon Redshift 一起使用时的注意事项](spatial-limitations.md)