MySQL 有聚合 ST_UNION() 吗?

问题描述 投票:0回答:4

我花了几个小时努力让我的查询工作,但没有成功。

我有一个带有 GEOMETRY 列的表,它存储来自子区域的给定区域的多边形。 现在我想将它们全部合并到父区域的一个更高级别的边界,例如:

SELECT ST_Union(geometry) FROM area

我总是犯错误:

#1582 - 调用本机函数“ST_Union”时参数计数不正确

我不认为这是该函数想要的行为,因为这使得它完全毫无价值。有谁知道如何使用这个函数来生成预期的结果?

mysql gis
4个回答
2
投票

因为 MySQL ST_Union() 只接受两个几何图形,所以解决方法是构造两个几何集合。一个集合包含要聚合在一起的所有功能。它是在特征 WKT 上使用 GROUP_CONCAT() 构建的。第二个几何体可以是没有特征的空集合。

您可能需要大幅增加 @@sort_buffer_size 和 @@group_concat_max_len 变量才能使其发挥作用。

SELECT ST_Union(
    ST_GeomFromText(
      concat("GEOMETRYCOLLECTION ("
             , GROUP_CONCAT( ST_AsText(shape) )
             , ")" 
            )
    ), ST_GeomFromText("GEOMETRYCOLLECTION EMPTY") 
  ) as geom
FROM ...
WHERE ...
GROUP BY ...;

2
投票

我也需要这个功能,并且由于MariaDB支持用户定义的聚合函数,所以我自己编写了它:

CREATE AGGREGATE FUNCTION `my_gis_db`.`union_polygons`(shape GEOMETRY) RETURNS GEOMETRY
BEGIN
    DECLARE aggregated_shape GEOMETRY DEFAULT NULL;
    DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ST_INTERSECTION(ST_ENVELOPE(aggregated_shape), aggregated_shape);

    LOOP
        FETCH GROUP NEXT ROW;
        IF shape IS NOT NULL THEN
            IF aggregated_shape IS NULL THEN
                SET aggregated_shape := shape;
            ELSE
                SET aggregated_shape := ST_UNION(aggregated_shape, shape);
            END IF;
        END IF;
    END LOOP;
END

在组合所有行的形状后,我将其自身与其边界框相交,以仅获得外部形状。如果适合您的需要,您可以保留该部分。


1
投票

MySQL 没有聚合形式的

ST_Union
或任何其他空间函数。

如果您正在寻找空间聚合,则必须迁移到 PostgreSQL/PostGIS。 MySQL 只有最少的 GIS 功能。

SELECT ST_Union( Point(0,0), Point(0,1) );

有关 MySQL 和 PostgreSQL 的比较,请参阅我的帖子


0
投票

这并不完全是函数替换的下降,但可以为您提供聚合的 st_union:

# initialize variables:
SET @b = ST_GEOMFROMTEXT('GEOMETRYCOLLECTION EMPTY');
SET @row = 0;

SELECT ST_ASTEXT(agg) final_st_union
FROM (
  SELECT @b := ST_UNION(@b, shape) AS agg, @row := @row + 1 rownum
  FROM ..
  WHERE
) sub ORDER BY sub.rownum DESC LIMIT 1
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.