在 Amazon Redshift 中查询空间数据
空间数据描述几何体在定义空间(空间参照系)中的位置和形状。Amazon Redshift 支持具有 GEOMETRY
和 GEOGRAPHY
数据类型的空间数据,其中包含空间数据和数据的空间参考系统标识符 (SRID)。
空间数据包含可用于表示地理要素的几何数据。此类数据的示例包括天气报告、地图方向、包含地理位置的推特、店铺位置以及航空公司路线。空间数据在业务分析、报告和预测中起着重要的作用。
您可以使用 Amazon Redshift SQL 函数查询空间数据。空间数据包含对象的几何值。
GEOMETRY
数据类型操作在笛卡尔平面上工作。尽管空间参考系统标识符 (SRID) 存储在对象内部,但该 SRID 只是坐标系的标识符,在处理 GEOMETRY
对象的算法中没有任何作用。对 GEOGRAPHY
数据类型执行的操作将对象内部的坐标视为球体上的球面坐标。此球体由 SRID 定义,该 SRID 引用了地理空间参考系统。默认情况下,GEOGRAPHY
数据类型是使用空间参考 (SRID) 4326 创建的,参照世界大地测量系统 (WGS) 84。有关 SRID 的更多信息,请参阅维基百科中的空间参考系统
您可以使用 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 中的几何体的已知文本表示
您可以使用 GEOGRAPHY
数据类型来保存空间数据的值。Amazon Redshift 中的 GEOGRAPHY
值可以定义二维 (2D)、三维 (3DZ)、带度量的二维 (3DM) 和四维 (4D) 几何体基元数据类型:
二维 (2D) 几何体由球体上的经纬度坐标指定。
三维 (3DZ) 几何体由球体上的经纬度和高度坐标指定。
带测量的二维 (3DM) 几何体由三个坐标(经度、纬度、度量)指定,其中前两个坐标是球面角坐标,第三个是测量值。
四维 (4D) 几何体由四个坐标(经度、纬度、高度、度量)指定,其中前三个坐标是经度、纬度和高度,第四个是测量值。
有关地理坐标系的更多信息,请参阅维基百科中的地理坐标系
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
对象无效,则空间函数的行为未定义。有关有效性的更多信息,请参阅几何有效性。
有关用于查询空间数据的 SQL 函数的详细信息,请参阅空间函数。
有关加载空间数据的详细信息,请参阅加载 GEOMETRY 或 GEOGRAPHY 数据类型的列。