Teradata地理空间查询:基于点坐标生成Polygon/Multipolygon表
Teradata 按ID生成Polygon/MultiPolygon地理字段实现方案
前置说明
- 需确认Teradata实例已启用地理空间扩展,且你的账号有对应函数的调用权限,异常可联系DBA核实
- 合法Polygon至少需要3个不共线的点,且首尾坐标必须闭合,你示例中2个点的内容仅为格式演示,实际生成时会判定为无效几何
- 仅当单个ID对应多个独立不重叠的面时,才需要使用MultiPolygon类型,单个点集生成一个面直接用Polygon即可
实现代码(生成Polygon)
如果你的需求是单ID对应一个面,使用以下语句创建新表:
CREATE TABLE 你的新表名称 AS ( SELECT id, CASE WHEN COUNT(*) >= 3 THEN ST_GeomFromText( -- 拼接符合WKT规范的Polygon字符串 'POLYGON((' || XMLAGG("x-point" || ' ' || "y-point" || ',' ORDER BY 点排序字段) -- 拼接首个坐标实现首尾闭合,符合Polygon标准 || FIRST_VALUE("x-point" || ' ' || "y-point") OVER (PARTITION BY id) || '))', 4326 -- 替换为你实际使用的坐标系SRID,示例为WGS84坐标系 ) ELSE NULL -- 点数不足的ID生成空值,可根据需求调整逻辑 END AS Geometry FROM 你的原表名称 GROUP BY id ) WITH DATA PRIMARY INDEX(id);
注:原表字段名包含横杠,需要用双引号包裹避免语法报错;如果你的点有固定的排序规则(比如顺时针/逆时针排序),请在XMLAGG的ORDER BY后指定对应排序字段,没有排序需求可去掉ORDER BY子句。
实现代码(生成MultiPolygon)
如果单ID对应多个独立面,需要先对同ID下的点按所属面做分组,再聚合生成MultiPolygon:
CREATE TABLE 你的新表名称 AS ( SELECT id, ST_GeomFromText( 'MULTIPOLYGON(' || XMLAGG('((' || point_str || ',' || first_point || '))' ORDER BY 面分组字段) || ')', 4326 ) AS Geometry FROM ( -- 子查询先聚合每个面的坐标串 SELECT id, 面分组字段, XMLAGG("x-point" || ' ' || "y-point" || ',' ORDER BY 点排序字段) AS point_str, FIRST_VALUE("x-point" || ' ' || "y-point") OVER (PARTITION BY id, 面分组字段) AS first_point FROM 你的原表名称 GROUP BY id, 面分组字段 HAVING COUNT(*) >= 3 ) t GROUP BY id ) WITH DATA PRIMARY INDEX(id);
自定义格式说明
如果你不需要严格遵循地理空间标准,仅需要输出你示例中的字符串格式(不需要可计算的Geometry类型),可以去掉ST_GeomFromText包裹,同时去掉首尾闭合的逻辑,就能得到和示例完全一致的输出内容。
内容的提问来源于stack exchange,提问作者Sunny_J
相关产品推荐
相关产品推荐

