我花了几个小时努力让我的查询工作,但没有成功。
我有一个带有 GEOMETRY 列的表,它存储来自子区域的给定区域的多边形。 现在我想将它们全部合并到父区域的一个更高级别的边界,例如:
SELECT ST_Union(geometry) FROM area
我总是犯错误:
#1582 - 调用本机函数“ST_Union”时参数计数不正确
我不认为这是该函数想要的行为,因为这使得它完全毫无价值。有谁知道如何使用这个函数来生成预期的结果?
因为 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 ...;
我也需要这个功能,并且由于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
在组合所有行的形状后,我将其自身与其边界框相交,以仅获得外部形状。如果适合您的需要,您可以保留该部分。
MySQL 没有聚合形式的
ST_Union
或任何其他空间函数。
如果您正在寻找空间聚合,则必须迁移到 PostgreSQL/PostGIS。 MySQL 只有最少的 GIS 功能。
SELECT ST_Union( Point(0,0), Point(0,1) );
有关 MySQL 和 PostgreSQL 的比较,请参阅我的帖子
这并不完全是函数替换的下降,但可以为您提供聚合的 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